Vue-router

 Vue Router是Vue.js官方的路由管理器,严格来说,它是一款插件,但它又和Vue.js核心深度集成,Vue Router的版本依赖于Vue.js的版本,最新的vue-router 3.0 依赖于Vue.js 2.0及以上版本。

 

一  安装Vue-router

 

  1,简介

  Vue Router 有两种模式,分别是HTML5 History模式和hash模式。我们知道,Vue.js是主要用于构建单页面应用用户界面的渐进式框架,所以hash是Vue推荐的主力模式,如果你要使用History模式,需要配合后端进行一些单独的设置。

  Vue Router 提供的主要功能包括但不限于:

    嵌套路由和视图;

    基于模块化、组件化的路由配置;

    路由参数、查询;

    简单过渡效果。

    

  2,安装

   安装Vue Router也很简单,三种方式:script标签本地引入,CDN加速,模块化开发npm安装。

1 //标签本地引入
2 <script src="/vue.js"></script>
3 <script src="/vue-router.js"></script>
4 //vue-router依赖于vue.js,序偶一要先引入vue.js
1 //CDN加速
2 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
3 <script src='https://unpkg.com/vue-router/dist/vue-router.js'></script>
4 //同样需要先引入vue.js
1 //shell npm安装
2 npm install vue-router -d
3 //根据需要选择安装方式

  如果在模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能:

1 import Vue from 'vue.js'
2 import VueRouter from 'vue-router.js'
3 
4 Vue.use('vueRouter')
5 //手动安装路由功能

   vue-router安装完成后,会在window上注册一个VueRouter属性,它是一个构造函数,稍后我们需要用它创建一个路由对象,并挂载到vue实例上。

 

二  路由规则

 

  1,基本模式

  使用Vue Router只需要简单的四步:

    a:定义路由组件;

1 const Foo = { template: '<div>foo</div>' }
2 const Bar = { template: '<div>bar</div>' }
3 //路由只需要模板对象,并不需要把该模板对象注册成真实的Vue组件,这一点需要特别注意

    b:定义路由规则;

 1 const routes = [
 2     { 
 3         path: '/foo',
 4         component: Foo 
 5     },
 6     { 
 7         path: '/bar',
 8         component: Bar
 9     }
10 ]
11 //路由规则是一个对象数组,每一个对象构建一条完整的路由规则,其中path和component是规则的必要属性,他们规定:在path指定的路径渲染component指定的组件。   

    c:创建路由实例;

1 const router = new VueRouter({
2     routes //ES6语法,相当于routes:routes
3 });
4 //为了能让路由最终运行起来,需要先创建一个router实例,稍后我们将选择合适的时机把它挂在到vue根实例上

    d:把路由实例挂载到vue根实例。

1 //方式一
2 const vm = new Vue({
3     el:'#app',
4     router
5 });
6 //方式二
7 const vm = new Vue({
8     router
9 }).$mount('#app');

  在JavaScript中设置好后还不够,为了在页面上有所表现,还需要在HTML页面中指定路径导航和组件渲染出口。

 1 <div id="app">
 2     <p>
 3         <router-link to="/foo" tag="button">Foo</router-link>
 4         <router-link to="/bar">Bar</router-link>
 5     </p>
 6     <div>
 7         <router-view></douter-view>
 8     </div>
 9 </div>
10 <!-- 使用<router-link>标签来导航,它默认将被渲染为<a>标签,你可以通过tag属性来改变这一默认行为 -->
11 <!-- <router-view>标签是路由的出口,路由规则匹配的组件模板对象将被注册成真正的Vue组件,并替换该出口标签 -->

  在完成以上这些操作后,页面上最终会有一个按钮和一个链接,点击他们将渲染对应的组件。

  

  2,路由重定向

  如果只是上面那样设置,会存在一个问题:首次进入页面时不会有任何组件被渲染。一般情况下,我们第一次进入页面,即根域名下时,希望展示一个默认组件,vue-router有两种方式可以实现。

 1 const routes = [
 2     {//重定向到一个已知组件
 3         path:'/',
 4         redirect:'/foo'
 5     },
 6     {//指定一个额外的页面,比如欢迎页
 7         path:'/',
 8         redirect:'/welcome'
 9     }
10 ]

  

  3,激活的样式

   为了让用户获得更好的体验,当用户点击某个<router-link>时,我们可以给这个导航组件设置特别的样式,以提醒用户当前渲染的是什么,vue-router提供了两个css类来实现这一功能:router-link-active和router-link-exact-active。

1 router-link-active{
2     /*some code*/
3 }
4 router-link-exact-active{
5     /*some code*/
6 }

  另外你还可以通过给路由实例添加linkActiveClass和linkExactActiveClass两个属性来自定义这两个类名。

  这两个类的最终效果相同,但router-link-exact-active的优先级更高。

  

  4,路由过渡

  我们知道,<router-view>是基本的动态组件,所以我们可以用 <transition> 组件给它添加一些过渡效果。

1 <transition>
2   <router-view></router-view>
3 </transition>

  上面的方式会给所有路由设置相同的过渡效果,如果你想给每个路由单独设置过渡效果,那么你需要在子组件内部单独使用<transition>,并为它设置name属性。

 1 const Foo = {
 2   template: `
 3     <transition name="slide">
 4       <div class="foo">...</div>
 5     </transition>
 6   `
 7 }
 8 
 9 const Bar = {
10   template: `
11     <transition name="fade">
12       <div class="bar">...</div>
13     </transition>
14   `
15 }

 

三  路由操作

 

  1,路由传参

  VueRouter有两种方式向组件传递参数,分别是:$route.query和$route.params。下面通过示例来详细说明。

<div id="app">
    <router-link tag="button" to="/com1?name=ren&age=12">$route.query</router-link>
    <router-link tag="button" to="/com2/ren/12">$route.params</router-link>
    <router-view><router-view>
</div>

<script>
    var com1 = {
        template:"<div>{{$route.query.name}}:{{$route.query.age}}</div>",
    };
    var com2 = {
        template:"<div>{{$route.params.name}}:{{$route.params.age}}</div>",
    };

    const routerObj = new VueRouter({
        routes:[
            {path:'/com1',component:com1},
            {path:'/com2/:age/:name',component:com2},]
    });

    var vm = new Vue({
        el:"#app",
        router:routerObj
    });
</script>

  请注意两种方式使用时的差异:$route.query 通过url的查询参数(?问号后面的)传递数据,并且不需要修改路由规则(path属性)。$route.params 需要修改路由规则,通过定义变量(:冒号占位符)来获取数据,并且,路由规则中定义了多少个变量,触发路由(点击<router-link>)时就必须传递多少个,否则路由将不能正常工作。

 

  2,路由嵌套

   VueRouter通过children属性实现路由嵌套。children属性是路由规则对象的另一个属性,和path,component属性同级。

 1 <div id="app">
 2     <router-link to="/com1">com1<router-link>
 3     <router-view></router-view>
 4 </div>
 5 
 6 <template id="com1">
 7     <router-link to="/com1/login">login</router-link>
 8     <router-view></router-view>
 9 </template>
10 <template id="login">
11     <p>login</p>
12 </template>
 1 var routerObj = new VueRouter({
 2     routes:[
 3         {
 4             path:'/com1',
 5             component:com1,
 6             children:[
 7                 {path:'login',component:login}
 8             ]
 9         }
10     ]
11 });

  根路径下点击com1按钮将展示com1组件,在com1组件内有一个login按钮,点击该按钮将在com1组件内展示login组件。

  这里有一个注意点,children属性中的路由规则对象,其path属性不需要从根路径开始匹配(不需要从/斜线开始),当触发该路由时(/com1/login),它会自动从根路径开始,依次匹配/com1、/com1/path,最终成功渲染login组件。

  

  3,命名视图

  多数时候,当路由规则匹配到一个url路径时,我们需要展示的组件不止一个,这时候,我们就需要命名视图来帮忙了。

 1 <div id="app">
 2     <router-view></router-view>
 3     <router-view name="left"></router-view>
 4     <router-view name="right"></router-view>
 5 </div>
 6 
 7 <script>
 8     var header = {template:'<div>header</div>'};
 9     var left = {template:'<div>left</div>'};
10     var right = {template:'<div>right</div>'};
11 
12     const routerObj = new VueRouter({
13     routes:[
14         {
15             path:'/',
16             components:{default:header,left,right}
17         }
18     ]
19 });
20 
21     var vm = new Vue({
22         el:'#app',
23         router:routerObj
24     });
25 </script>

  通过给<router-view>添加name属性,并在路由规则对象中添加多个组件模板,即可以实现统一url地址匹配多个组件的需求了。

posted @ 2020-01-03 15:14  任风来去匆匆  阅读(421)  评论(0编辑  收藏  举报