由于Vue在开发时对路由支持的不足,于是官方补充了vue-router插件。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,实际上就是组件的切换。路由就是SPA(单页应用)的路径管理器。再通俗的说,vue-router就是我们WebApp的链接路径管理系统。
  有的小伙伴会有疑虑,为什么我们不能像原来一样直接用a标签编写链接呢?因为我们一般用Vue做的都是单页应用,只有一个主页面index.html,所以你写的<a></a>标签是不起作用的,要使用vue-router来进行管理。

一、安装

如果你用vue-cli脚手架来搭建项目,配置过程会选择是否用到路由(详细见vue-cli 脚手架),如果选择y,后面下载依赖会自动下载vue-router。
这里还是说一下安装:npm install vue-router

二、创建组件

如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能,用vue-cli生产了我们的项目结构,src文件目录下会有一个router文件夹,此处就是编写路由组件的地方。在src/router/index.js,这个文件就是路由的核心文件:

  1.  
     
  2.  
    import Vue from 'vue' //引入Vue
  3.  
    import Router from 'vue-router' //引入vue-router
  4.  
    import Hello from '@/components/Hello' //引入根目录下的Hello.vue组件
  5.  
     
  6.  
    Vue.use(Router) //Vue全局使用Router
  7.  
     
  8.  
    export default new Router({
  9.  
    routes: [ //配置路由,这里是个数组
  10.  
    { //每一个链接都是一个对象
  11.  
    path: '/', //链接路径
  12.  
    name: 'Hello', //路由名称,
  13.  
    component: Hello //对应的组件模板
  14.  
    },{
  15.  
    path:'/hi',
  16.  
    component:Hi,
  17.  
    children:[ //子路由,嵌套路由 (此处偷个懒,免得单独再列一点)
  18.  
    {path:'/',component:Hi},
  19.  
    {path:'hi1',component:Hi1},
  20.  
    {path:'hi2',component:Hi2},
  21.  
    ]
  22.  
    }
  23.  
    ]
  24.  
    })
  25.  
     

三、router-link制作导航

1.router-link 是一个组件,它默认会被渲染成一个带有链接的a标签,通过to属性指定链接地址。
注意:被选中的router-link将自动添加一个class属性值.router-link-active。

<router-link to="/">[text]</router-link>
  • to:导航路径,要填写的是你在router/index.js文件里配置的path值,如果要导航到默认首页,只需要写成 to="/" ,
  • [text] :就是我们要显示给用户的导航名称。

2.router-view 用于渲染匹配到的组件。
①.可以给router-view组件设置transition过渡(Vue2.0 Transition常见用法全解惑)。

  1.  
     
  2.  
    <transition name="fade">
  3.  
    <router-view ></router-view>
  4.  
    </transition>
  5.  
     

css过渡类名:
组件过渡过程中,会有四个CSS类名进行切换,这四个类名与transition的name属性有关,比如name="fade",会有如下四个CSS类名:

  • fade-enter:进入过渡的开始状态,元素被插入时生效,只应用一帧后立刻删除。
  • fade-enter-active:进入过渡的结束状态,元素被插入时就生效,在过渡过程完成后移除。
  • fade-leave:离开过渡的开始状态,元素被删除时触发,只应用一帧后立刻删除。
  • fade-leave-active:离开过渡的结束状态,元素被删除时生效,离开过渡完成后被删除。

从上面四个类名可以看出,fade-enter-active和fade-leave-active在整个进入或离开过程中都有效,所以CSS的transition属性在这两个类下进行设置。

过渡模式mode:

  • in-out(mode默认in-out模式):新元素先进入过渡,完成之后当前元素过渡离开。
  • out-in:当前元素先进行过渡离开,离开完成后新元素过渡进入。

②.还可以配合<keep-alive>使用,keep-alive可以缓存数据,这样不至于重新渲染路由组件的时候,之前那个路由组件的数据被清除了。比如对当前的路由组件a进行了一些DOM操作之后,点击进入另一个路由组件b,再回到路由组件a的时候之前的DOM操作还保存在,如果不加keep-alive再回到路由组件a时,之前的DOM操作就没有了,得重新进行。如果你的应用里有一个购物车组件,就需要用到keep-alive。

  1.  
    <transition>
  2.  
    <keep-alive>
  3.  
    <router-view></router-view>
  4.  
    </keep-alive>
  5.  
    </transition>

四、动态路由匹配

我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。
调用router的map方法映射路由,每条路由以key-value的形式存在,key是路径,value是组件。例如:'/home'是一条路由的key,它表示路径;{component: Home}则表示该条路由映射的组件:

  1.  
    router.map({
  2.  
    '/home': { component: Home },
  3.  
    '/about': { component: About }
  4.  
    })

例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。那么,我们可以在 vue-router 的路由路径中使用『动态路径参数』来达到这个效果。

  1.  
     
  2.  
    const User = {
  3.  
    template: '<div>User</div>'
  4.  
    }
  5.  
     
  6.  
    const router = new VueRouter({
  7.  
    routes: [
  8.  
    // 动态路径参数 以冒号开头
  9.  
    { path: '/user/:id', component: User }
  10.  
    ]
  11.  
    })
  12.  
     

例如: /user/foo 和 /user/bar 都将映射到相同的路由。
一个『路径参数』使用冒号 : 标记。当匹配到一个路由时,参数值会被设置到this.$route.params,可以在每个组件内使用。
你可以在一个路由中设置多段『路径参数』,对应的值都会设置到 $route.params 中。例如:

五、vue-router参数传递

1.用name传值(不推荐)

2.通过<router-link> 标签中的to传参

<router-link :to="{name:‘dxl’,params:{key:value}}">东西里</router-link>
  • name:就是我们在路由配置文件中起的name值。
    另:命名路由就是用一个名称来标识一个路由,在定义路由的时候设置一个name属性即可。在router-link中也可以用路由的名字来链接到一个路由。
  • params:就是我们要传的参数,它也是对象形势,在对象里可以传递多个值。
    最后用$route.params.username进行接收.

3.用url传参

上面第五点也有提到。 :冒号的形式传递参数
(1).在router路由配置文件里以冒号的形式设置参数

  1.  
    {
  2.  
    path:'/params/:newsId/:userName,
  3.  
    component:Params
  4.  
    }

(2).组件形式,在src/components目录下建立我们params.vue组件。
我们在页面里输出了url传递的参数。

  1.  
    <template>
  2.  
    <div>
  3.  
    <h2>{{ msg }}</h2>
  4.  
    <p>新闻ID:{{ $route.params.newsId}}</p>
  5.  
    <p>用户名:{{ $route.params.userName}}</p>
  6.  
    </div>
  7.  
    </template>
  8.  
    <script>
  9.  
    export default {
  10.  
    name: 'params',
  11.  
    data () {
  12.  
    return {
  13.  
    msg: 'params page'
  14.  
    }
  15.  
    }
  16.  
    }
  17.  
    </script>

(3).<router-view>标签path路径中传值

  1.  
    <router-link to="/params/888/dxl shuai>params</router-link>
  2.  
     

(4).正则表达式在URL传值中的应用
希望我们传递的新闻ID只能是数字的形式,这时候我们就需要在传递时有个基本的类型判断,path:'/params/:newsId(\\d+)/:userName'

六.响应路由参数的变化

当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。
复用组件时,想对路由参数的变化作出响应的话:
(1). watch(监测变化) $route 对象:

  1.  
     
  2.  
    const User = {
  3.  
    template: '...',
  4.  
    watch: {
  5.  
    '$route' (to, from) {
  6.  
    // 对路由变化作出响应...
  7.  
    }
  8.  
    }
  9.  
    }
  10.  
     

(2).beforeRouteUpdate 导航守卫
如果目的地和当前路由相同,只有参数发生了改变 (比如从一个用户资料到另一个 /users/1 -> /users/2),你需要使用 beforeRouteUpdate来响应这个变化 (比如抓取用户信息)。

  1.  
     
  2.  
    const User = {
  3.  
    template: '...',
  4.  
    beforeRouteUpdate (to, from, next) {
  5.  
    // react to route changes...
  6.  
    // don't forget to call next()
  7.  
    }
  8.  
    }
  9.  
     

七、实现不同路由不同页面标题

  1.  
     
  2.  
    // 定义路由的时候如下定义,name也可为中文
  3.  
    const routes = [
  4.  
    { path: '/goods', component: goods, name: 'goods' },
  5.  
    { path: '/orders', component: orders, name: 'orders' },
  6.  
    { path: '/seller', component: seller, name: 'seller' }
  7.  
    ];
  8.  
    // 创建路由实例
  9.  
    const router = new VueRouter({
  10.  
    routes: routes
  11.  
    })
  12.  
    // 关键在这里,设置afterEach钩子函数
  13.  
    router.afterEach((to, from, next) => {
  14.  
    document.title = to.name;
  15.  
    })
  16.  
     

八、重定向

刚进入应用都是进入到“/”这个路由的,如果想直接进入到“/goods”怎么办,有两种方法。一种是利用重定向,另一种是利用vue-router的导航式编程。
redirect基本重定向:

  1.  
     
  2.  
    const routes = [
  3.  
    { path: '/', redirect: '/goods'}
  4.  
    ]
  5.  
    重定向的目标也可以是一个命名的路由。
  6.  
    const routes = [
  7.  
    { path: '/', redirect: { name: 'goods' }}
  8.  
    ]
  9.  
    重定向时也可以传递参数
  10.  
    {
  11.  
    path:'/',
  12.  
    redirect:'/goods/:newsId(\\d+)/:userName'
  13.  
    }
  14.  
     

★.这里不得不提到alias别名的使用。
1.首先我们在路由配置文件里给路径起一个别名,dxl。

vue-router路由详细的更多相关文章

  1. 前端MVC Vue2学习总结(八)——Vue Router路由、Vuex状态管理、Element-UI

    一.Vue Router路由 二.Vuex状态管理 三.Element-UI Element-UI是饿了么前端团队推出的一款基于Vue.js 2.0 的桌面端UI框架,手机端有对应框架是 Mint U ...

  2. Vue系列:Vue Router 路由梳理

    Vue Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模块化的.基于组件的路由配置 路由参数. ...

  3. 04 Vue Router路由管理器

    路由的基本概念与原理 Vue Router Vue Router (官网: https://router.vuejs.org/zh/)是Vue.js 官方的路由管理器. 它和vue.js的核心深度集成 ...

  4. Vue Router路由管理器介绍

    参考博客:https://www.cnblogs.com/avon/p/5943008.html 安装介绍:Vue Router 版本说明 对于 TypeScript 用户来说,vue-router@ ...

  5. Vue Router 路由守卫:完整的导航解析流程

    完整的导航解析流程 1 导航被触发. 2 在失活的组件里调用离开守卫. 3 调用全局的 beforeEach 守卫. 4 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+). ...

  6. Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转

    问题引入 试想这样一个业务场景: 在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功, 则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息. 难点所在 ...

  7. Vue Router 路由实现原理

    一.概念 通过改变 URL,在不重新请求页面的情况下,更新页面视图. 二.实现方式 更新视图但不重新请求页面,是前端路由原理的核心之一,目前在浏览器环境中这一功能的实现主要有2种方式: 1.Hash  ...

  8. Vue - Router 路由

    路由的注册 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  9. vue router路由(三)

    当环境搭建及Vue语法与指令都有所了解,该说下router. build目录是打包配置文件 (不建议动) config是vue项目基本配置文件 dist是构建后文件 js 手动创建 (根据需要) no ...

  10. vue router路由跳转了,但是页面没有变(已解决)

    小白学习 router.js:两个组件之间跳转 但是路由变了,页面没有改变的原因是因为app.vue里面没有router-view(很关键)

随机推荐

  1. raft协议-分布式环境下的数据一致性问题

    阅读了一个有意思的ppt,是Standford大学发表的raft协议 网址:http://thesecretlivesofdata.com/raft/ 下面自己总结下咯: 1.raft是一个实现了解决 ...

  2. 008-kvm虚拟化管理平台WebVirtMgr部署-完整记录(1)

    公司机房有一台2U的服务器(64G内存,32核),由于近期新增业务比较多,测试机也要新增,服务器资源十分有限.所以打算在这台2U服务器上部署kvm虚拟化,虚出多台VM出来,以应对新的测试需求. 当KV ...

  3. PAT Advanced 1036 Boys vs Girls (25 分)

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  4. ffmpeg使用分析视频

    https://www.cnblogs.com/Finley/p/8646711.html 先存下

  5. man wc

    WC(1)        User Commands/用户命令            WC(1) NAME/名称       wc - print the number of newlines, wo ...

  6. CSS3文本阴影、边框阴影

    CSS3添加阴影 一.使用text-shadow属性为文本添加阴影 二.使用box-shadow属性为边框添加阴影 一.为文本添加阴影 text-shadow     使用text-shadow,可以 ...

  7. 浙大PAT CCCC L3-014 周游世界 ( 最短路变形 )

    题目链接 题意 : 中文题请点链接,挺复杂的... 分析 : 乍一看是个最短路,实际就真的是个最短路.如果没有 “ 在有多条最短路径的时候输出换乘次数最少的” 这一条件的约束,那么这题就是直接建图然后 ...

  8. Java——容器(Interator)

    [Interator接口]   <1> 所有实现了Collection接口的容器类都有一个interator方法用以返回一个实现了Interaor接口的对象. <2> Inte ...

  9. three arrays

    three arrays 字典树上贪心 #include<bits/stdc++.h> using namespace std; ][][]; ][]; ]; ]; ][]; ][]; i ...

  10. [CSP-S模拟测试]:d(贪心+树状数组)

    题目传送门(内部题65) 输入格式 第一行,一个自然数$T$,代表数据组数.对于每组数据:第一行,一个正整数$n$,一个自然数$m$.接下来$n$行,每行两个正整数,$a_i,b_i$. 输出格式 对 ...