Vue前端路由

1、Vue路由,路由的基本概念与原理。

答:1)、路由是一个比较广义和抽象的概念,路由的本质就是对应关系。
2)、在开发中,路由分为,后端路由和前端路由。
3)、后端路由,根据不同的用户URL请求,返回不同的内容。后端路由的本质就是URL请求地址与服务器资源之间的对应关系。后端路由根据不同的URL地址分发不同的资源。
4)、前端路由,根据不同的用户事件,显示不同的页面内容。本质就是用户事件与事件处理函数之间的对应关系。前端路由负责事件监听,触发事件后,通过事件函数渲染不同内容。

 

2、SPA(Single Page Application)。

答:1)、后端路由的渲染,就叫做后端渲染(存在性能问题)。
2)、Ajax前端渲染,前端渲染提供性能,但是不支持浏览器的前进后退操作。
3)、SPA(Single Page Application)单页面应用程序,整个网站只有一个界面,内容的变化通过Ajax局部更新实现,同时支持浏览器地址栏的前进和后退操作。
4)、SPA实现原理之一就是基于URL地址的hash,hash的变化会导致浏览器记录访问历史的变化,但是hash的变化不会触发新的URL请求。
5)、在实现SPA过程中,最核心的技术点就是前端路由。

 

3、路由的基本概念与原理,实现简易前端路由。

答:1)、基于URL中的hash实现,点击菜单的时候改变url的hash,根据hash的变化控制组件的切换。
2)、window.onhashchange,监听window的onhashchange事件,根据获取到的最新的hash值,切换要显示的组件的名称,通过location.hash获取到最新的hash值。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     </head>
 7     <body>
 8         <!-- 被Vue实例控制的div区域 -->
 9         <div id="app">
10             <div v-text="name"></div>
11             <!-- 切换组件的超链接 -->
12             <a href="#/zhuye">主页</a>
13             <a href="#/keji">科技</a>
14             <a href="#/caijing">财经</a>
15             <a href="#/yule">娱乐</a>
16 
17             <!-- 根据:is属性指定的组件名称,把对应的组件渲染到component标签所在的位置 -->
18             <!-- 可以把component标签当作是组件的占位符 -->
19             <component :is="comName"></component>
20         </div>
21 
22         <script type="text/javascript" src="js/vue.js"></script>
23         <script type="text/javascript">
24             /* 创建需要被切换的四个组件 */
25             var zhuye = {
26                 template: '<h1>主页信息</h1>',
27             };
28             var keji = {
29                 template: '<h1>科技信息</h1>',
30             };
31             var caijing = {
32                 template: '<h1>财经信息</h1>',
33             };
34             var yule = {
35                 template: '<h1>娱乐信息</h1>',
36             };
37 
38 
39             /* 创建Vue的实例对象 */
40             var vm = new Vue({
41                 el: '#app',
42                 data: {
43                     name: 'hello world!!!',
44                     comName: 'zhuye',
45                 },
46                 components: {
47                     zhuye,
48                     keji,
49                     caijing,
50                     yule,
51                 },
52             });
53 
54             // window.onhashchange,监听window的onhashchange事件,根据获取到的最新的hash值,切换要显示的组件的名称。
55             window.onhashchange = function() {
56                 // 通过location.hash获取到最新的hash值.
57                 console.log(location.hash, location.hash.slice(1));
58                 switch (location.hash.slice(1)) {
59                     case '/zhuye':
60                         vm.comName = 'zhuye';
61                         break;
62                     case '/keji':
63                         vm.comName = 'keji';
64                         break;
65                     case '/caijing':
66                         vm.comName = 'caijing';
67                         break;
68                     case '/yule':
69                         vm.comName = 'yule';
70                         break;
71                 }
72             }
73         </script>
74     </body>
75 </html>

效果,如下所示:

 

 

4、Vue Router路由管理器(官网https://router.vuejs.org/zh/),Vue Router是Vue.js官方的路由管理器。

答:1)、Vue Router路由管理器是和Vue.js的核心深度集成,可以非常方便的用于SPA应用程序的开发。Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。
2)、包含的功能有:

  a、嵌套的路由/视图表
  b、模块化的、基于组件的路由配置
  c、路由参数、查询、通配符
  d、基于 Vue.js 过渡系统的视图过渡效果
  e、细粒度的导航控制
  f、带有自动激活的 CSS class 的链接
  g、HTML5 历史模式或 hash 模式,在 IE9 中自动降级
  h、自定义的滚动条行为

 

5、Vue Router路由管理器的基本使用。

答:1)、引入相关的库文件。
2)、添加路由链接。
3)、添加路由填充位。
4)、定义路由组件。
5)、配置路由规则并创建路由实例。
6)、把路由挂载到Vue跟实例中。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6 
 7         <!-- 第一步,导入vue文件,为全局window对象挂载vue构造函数 -->
 8         <script src="https://unpkg.com/vue/dist/vue.js"></script>
 9         <!-- 导入vue-router文件,为全局window对象挂载vueRouter构造函数 -->
10         <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
11     </head>
12     <body>
13         <div id="app">
14             <!-- 第二步,添加路由链接。 -->
15             <!-- router-link是Vue中提供的标签,默认会被渲染为a标签,    to属性默认会被渲染为href属性,to属性的值默认会被渲染为#开头的hash地址 -->
16             <router-link to="/user">User</router-link>
17             <router-link to="/register">Register</router-link>
18 
19             <!-- 第三步,添加路由填充为 -->
20             <!-- 路由填充为也叫做路由占位符,将来通过路由规则匹配到的组件,将会被渲染到router-view所在的位置 -->
21             <router-view></router-view>
22         </div>
23 
24         <script type="text/javascript">
25             /* 第四步,定义路由组件 */
26             var User = {
27                 template: '<h1>User</h1>',
28             };
29             var Register = {
30                 template: '<h1>Register</h1>',
31             };
32 
33             /* 第五步,配置路由规则并创建路由实例。 */
34             // 创建路由实例对象
35             var router = new VueRouter({
36                 // routes是路由规则数组
37                 routes: [
38                     // 每个路由规则都是一个配置对象,其中至少包含path和component两个属性
39                     // path表示当前路由规则匹配的hash地址
40                     // component表示当前路由规则对应要展示的组件
41                     {
42                         path: '/user',
43                         component: User, // 组件名称,不是字符串
44                     },
45                     {
46                         path: '/register',
47                         component: Register, // 组件名称,不是字符串
48                     }
49                 ]
50             });
51 
52             // 创建vm实例对象
53             var vm = new Vue({
54                 // 指定控制的区域
55                 el: '#app',
56                 data: {
57 
58                 },
59                 // 第六步,把路由挂载到Vue根实例中
60                 // 为了能够让路由规则生效,必须把路由对象挂载到Vue实例对象上
61                 router: router, // 挂载实例对象,es6中,如果属性名称和值一样可以直接写成一个属性名称即可.
62             });
63         </script>
64     </body>
65 </html>

实现效果如下所示:

 

 

6、Vue Router路由管理器,路由重定向。

答:1)、路由重定向指的是,用户在访问地址A的时候,强制用户跳转到地址C,从而展示特定的组件页面。
2)、通过路由规则的redirect属性,指定一个新的路由地址,可以很方便的设置路由的重定向。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6 
 7         <!-- 第一步,导入vue文件,为全局window对象挂载vue构造函数 -->
 8         <script src="https://unpkg.com/vue/dist/vue.js"></script>
 9         <!-- 导入vue-router文件,为全局window对象挂载vueRouter构造函数 -->
10         <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
11     </head>
12     <body>
13         <div id="app">
14             <!-- 第二步,添加路由链接。 -->
15             <!-- router-link是Vue中提供的标签,默认会被渲染为a标签,    to属性默认会被渲染为href属性,to属性的值默认会被渲染为#开头的hash地址 -->
16             <router-link to="/user">User</router-link>
17             <router-link to="/register">Register</router-link>
18 
19             <!-- 第三步,添加路由填充为 -->
20             <!-- 路由填充为也叫做路由占位符,将来通过路由规则匹配到的组件,将会被渲染到router-view所在的位置 -->
21             <router-view></router-view>
22         </div>
23 
24         <script type="text/javascript">
25             /* 第四步,定义路由组件 */
26             var User = {
27                 template: '<h1>User</h1>',
28             };
29             var Register = {
30                 template: '<h1>Register</h1>',
31             };
32 
33             /* 第五步,配置路由规则并创建路由实例。 */
34             // 创建路由实例对象
35             var router = new VueRouter({
36                 // routes是路由规则数组
37                 routes: [
38                     // 每个路由规则都是一个配置对象,其中至少包含path和component两个属性
39                     // path表示当前路由规则匹配的hash地址
40                     // component表示当前路由规则对应要展示的组件
41                     {
42                         path: '/user',
43                         component: User, // 组件名称,不是字符串
44                     },
45                     {
46                         path: '/register',
47                         component: Register, // 组件名称,不是字符串
48                     },
49                     /* 其中,path表示需要被重定向的原地址,redirect表示将要被重定向到的新地址 */
50                     {
51                         path: '/',
52                         redirect: '/user'
53                     }
54                 ]
55             });
56 
57             // 创建vm实例对象
58             var vm = new Vue({
59                 // 指定控制的区域
60                 el: '#app',
61                 data: {
62 
63                 },
64                 // 第六步,把路由挂载到Vue根实例中
65                 // 为了能够让路由规则生效,必须把路由对象挂载到Vue实例对象上
66                 router: router, // 挂载实例对象,es6中,如果属性名称和值一样可以直接写成一个属性名称即可.
67             });
68         </script>
69     </body>
70 </html>

 

7、Vue Router路由管理器,Vue Router嵌套路由的案例。

答:1)、首先创建父路由组件模板,父级路由链接、父组件路由填充位。
2)、然后创建子集路由模板,子级路由链接,子级路由填充位。
3)、然后配置嵌套路由配置,父级路由通过children属性配置子级路由。

 1 <!DOCTYPE html>
 2 <html lang="en">
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6 
 7         <!-- 第一步,导入vue文件,为全局window对象挂载vue构造函数 -->
 8         <script src="https://unpkg.com/vue/dist/vue.js"></script>
 9         <!-- 导入vue-router文件,为全局window对象挂载vueRouter构造函数 -->
10         <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
11     </head>
12     <body>
13         <div id="app">
14             <!-- 第二步,添加路由链接。 -->
15             <!-- router-link是Vue中提供的标签,默认会被渲染为a标签,    to属性默认会被渲染为href属性,to属性的值默认会被渲染为#开头的hash地址 -->
16             <router-link to="/user">User</router-link>
17             <router-link to="/register">Register</router-link>
18 
19             <!-- 第三步,添加路由填充为 -->
20             <!-- 路由填充为也叫做路由占位符,将来通过路由规则匹配到的组件,将会被渲染到router-view所在的位置 -->
21             <router-view></router-view>
22         </div>
23 
24         <script type="text/javascript">
25             /* 第四步,定义路由组件 */
26             var User = {
27                 template: '<h1>User</h1>',
28             };
29             var Register = {
30                 template: `
31                 <div>
32                 <h1>Register</h1>
33                 <hr/>
34                 <router-link to="/register/tab1">Tab1</router-link>
35                 <router-link to="/register/tab2">Tab2</router-link>
36                 
37                 <router-view></router-view>
38                 </div>
39                 `,
40                 //子级路由填充位置<router-view></router-view>
41             };
42 
43             var Tab1 = {
44                 template: '<h1>Tab1</h1>',
45             };
46             var Tab2 = {
47                 template: '<h1>Tab2</h1>',
48             };
49 
50             /* 第五步,配置路由规则并创建路由实例。 */
51             // 创建路由实例对象
52             var router = new VueRouter({
53                 // routes是路由规则数组
54                 routes: [
55                     // 每个路由规则都是一个配置对象,其中至少包含path和component两个属性
56                     // path表示当前路由规则匹配的hash地址
57                     // component表示当前路由规则对应要展示的组件
58                     {
59                         path: '/user',
60                         component: User, // 组件名称,不是字符串
61                     },
62                     {
63                         path: '/register',
64                         component: Register, // 组件名称,不是字符串
65                         // 通过children属性,为/register添加子路由规则
66                         children: [{
67                                 path: '/register/tab1',
68                                 component: Tab1
69                             },
70                             {
71                                 path: '/register/tab2',
72                                 component: Tab2
73                             },
74                         ]
75                     },
76                     /* 其中,path表示需要被重定向的原地址,redirect表示将要被重定向到的新地址 */
77                     {
78                         path: '/',
79                         redirect: '/user'
80                     }
81                 ]
82             });
83 
84             // 创建vm实例对象
85             var vm = new Vue({
86                 // 指定控制的区域
87                 el: '#app',
88                 data: {
89 
90                 },
91                 // 第六步,把路由挂载到Vue根实例中
92                 // 为了能够让路由规则生效,必须把路由对象挂载到Vue实例对象上
93                 router: router, // 挂载实例对象,es6中,如果属性名称和值一样可以直接写成一个属性名称即可.
94             });
95         </script>
96     </body>
97 </html>

 

8、Vue Router路由管理器,Vue Router动态路由匹配。

答:1)、动态路由匹配,指的是如果某些路由规则一部分是完全一样的,只有另外一部分是动态变化的,这些动态变化的部分形成路由参数,这些路由参数就叫做动态路由匹配。
2)、动态路径参数,以冒号开头,冒号后面的名字就是匹配的名称,通过动态路由参数的模式进行路由匹配。路由组件中通过$route.params获取路由参数。

  1 <!DOCTYPE html>
  2 <html lang="en">
  3     <head>
  4         <meta charset="utf-8">
  5         <title></title>
  6 
  7         <!-- 第一步,导入vue文件,为全局window对象挂载vue构造函数 -->
  8         <script src="https://unpkg.com/vue/dist/vue.js"></script>
  9         <!-- 导入vue-router文件,为全局window对象挂载vueRouter构造函数 -->
 10         <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
 11     </head>
 12     <body>
 13         <div id="app">
 14             <!-- 第二步,添加路由链接。 -->
 15             <!-- router-link是Vue中提供的标签,默认会被渲染为a标签,    to属性默认会被渲染为href属性,to属性的值默认会被渲染为#开头的hash地址 -->
 16             <router-link to="/user/1">User1</router-link>
 17             <router-link to="/user/2">User2</router-link>
 18             <router-link to="/user/3">User3</router-link>
 19             <router-link to="/user/4">User4</router-link>
 20 
 21             <router-link to="/register">Register</router-link>
 22 
 23             <!-- 第三步,添加路由填充为 -->
 24             <!-- 路由填充为也叫做路由占位符,将来通过路由规则匹配到的组件,将会被渲染到router-view所在的位置 -->
 25             <router-view></router-view>
 26         </div>
 27 
 28         <script type="text/javascript">
 29             /* 第四步,定义路由组件 */
 30             var User = {
 31                 template: '<h1>User组件,用户id为: {{$route.params.id}}</h1>',
 32             };
 33             var Register = {
 34                 template: `
 35                 <div>
 36                 <h1>Register</h1>
 37                 <hr/>
 38                 <router-link to="/register/tab1">Tab1</router-link>
 39                 <router-link to="/register/tab2">Tab2</router-link>
 40                 
 41                 <router-view></router-view>
 42                 </div>
 43                 `,
 44                 //子级路由填充位置<router-view></router-view>
 45             };
 46 
 47             var Tab1 = {
 48                 template: '<h1>Tab1</h1>',
 49             };
 50             var Tab2 = {
 51                 template: '<h1>Tab2</h1>',
 52             };
 53 
 54             /* 第五步,配置路由规则并创建路由实例。 */
 55             // 创建路由实例对象
 56             var router = new VueRouter({
 57                 // routes是路由规则数组
 58                 routes: [
 59                     // 每个路由规则都是一个配置对象,其中至少包含path和component两个属性
 60                     // path表示当前路由规则匹配的hash地址
 61                     // component表示当前路由规则对应要展示的组件
 62                     {
 63                         path: '/user/:id', // 动态路由匹配
 64                         component: User, // 组件名称,不是字符串
 65                     },
 66                     {
 67                         path: '/register',
 68                         component: Register, // 组件名称,不是字符串
 69                         // 通过children属性,为/register添加子路由规则
 70                         children: [{
 71                                 path: '/register/tab1',
 72                                 component: Tab1
 73                             },
 74                             {
 75                                 path: '/register/tab2',
 76                                 component: Tab2
 77                             },
 78                         ]
 79                     },
 80                     /* 其中,path表示需要被重定向的原地址,redirect表示将要被重定向到的新地址 */
 81                     {
 82                         path: '/',
 83                         redirect: '/user'
 84                     }
 85                 ]
 86             });
 87 
 88             // 创建vm实例对象
 89             var vm = new Vue({
 90                 // 指定控制的区域
 91                 el: '#app',
 92                 data: {
 93 
 94                 },
 95                 // 第六步,把路由挂载到Vue根实例中
 96                 // 为了能够让路由规则生效,必须把路由对象挂载到Vue实例对象上
 97                 router: router, // 挂载实例对象,es6中,如果属性名称和值一样可以直接写成一个属性名称即可.
 98             });
 99         </script>
100     </body>
101 </html>

 

9、Vue Router路由管理器,路由组件传递参数。

答:1)、$route与对应路由形成高度耦合,不够灵活,所以可以使用props将组件和路由解耦。
2)、props的值为布尔类型。如果props被设置为true。route.params将会被设置为组件属性。
3)、使用props接收路由参数,直接使用参数名称来使用路由参数。

  1 <!DOCTYPE html>
  2 <html lang="en">
  3     <head>
  4         <meta charset="utf-8">
  5         <title></title>
  6 
  7         <!-- 第一步,导入vue文件,为全局window对象挂载vue构造函数 -->
  8         <script src="https://unpkg.com/vue/dist/vue.js"></script>
  9         <!-- 导入vue-router文件,为全局window对象挂载vueRouter构造函数 -->
 10         <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
 11     </head>
 12     <body>
 13         <div id="app">
 14             <!-- 第二步,添加路由链接。 -->
 15             <!-- router-link是Vue中提供的标签,默认会被渲染为a标签,    to属性默认会被渲染为href属性,to属性的值默认会被渲染为#开头的hash地址 -->
 16             <router-link to="/user/1">User1</router-link>
 17             <router-link to="/user/2">User2</router-link>
 18             <router-link to="/user/3">User3</router-link>
 19             <router-link to="/user/4">User4</router-link>
 20 
 21             <router-link to="/register">Register</router-link>
 22 
 23             <!-- 第三步,添加路由填充为 -->
 24             <!-- 路由填充为也叫做路由占位符,将来通过路由规则匹配到的组件,将会被渲染到router-view所在的位置 -->
 25             <router-view></router-view>
 26         </div>
 27 
 28         <script type="text/javascript">
 29             /* 第四步,定义路由组件 */
 30             var User = {
 31                 props: ['id'], //使用props接收路由参数
 32                 template: '<h1>User组件,用户id为: {{id}}</h1>', // 使用路由参数.
 33             };
 34             var Register = {
 35                 template: `
 36                 <div>
 37                 <h1>Register</h1>
 38                 <hr/>
 39                 <router-link to="/register/tab1">Tab1</router-link>
 40                 <router-link to="/register/tab2">Tab2</router-link>
 41                 
 42                 <router-view></router-view>
 43                 </div>
 44                 `,
 45                 //子级路由填充位置<router-view></router-view>
 46             };
 47 
 48             var Tab1 = {
 49                 template: '<h1>Tab1</h1>',
 50             };
 51             var Tab2 = {
 52                 template: '<h1>Tab2</h1>',
 53             };
 54 
 55             /* 第五步,配置路由规则并创建路由实例。 */
 56             // 创建路由实例对象
 57             var router = new VueRouter({
 58                 // routes是路由规则数组
 59                 routes: [
 60                     // 每个路由规则都是一个配置对象,其中至少包含path和component两个属性
 61                     // path表示当前路由规则匹配的hash地址
 62                     // component表示当前路由规则对应要展示的组件
 63                     {
 64                         path: '/user/:id', // 动态路由匹配
 65                         component: User, // 组件名称,不是字符串
 66                         /* 如果props被设置为true。route.params将会被设置为组件属性。 */
 67                         props: true,
 68                     },
 69                     {
 70                         path: '/register',
 71                         component: Register, // 组件名称,不是字符串
 72                         // 通过children属性,为/register添加子路由规则
 73                         children: [{
 74                                 path: '/register/tab1',
 75                                 component: Tab1
 76                             },
 77                             {
 78                                 path: '/register/tab2',
 79                                 component: Tab2
 80                             },
 81                         ]
 82                     },
 83                     /* 其中,path表示需要被重定向的原地址,redirect表示将要被重定向到的新地址 */
 84                     {
 85                         path: '/',
 86                         redirect: '/user'
 87                     }
 88                 ]
 89             });
 90 
 91             // 创建vm实例对象
 92             var vm = new Vue({
 93                 // 指定控制的区域
 94                 el: '#app',
 95                 data: {
 96 
 97                 },
 98                 // 第六步,把路由挂载到Vue根实例中
 99                 // 为了能够让路由规则生效,必须把路由对象挂载到Vue实例对象上
100                 router: router, // 挂载实例对象,es6中,如果属性名称和值一样可以直接写成一个属性名称即可.
101             });
102         </script>
103     </body>
104 </html>

4)、如果props是一个对象,它会被按原样设置为组件属性,对象中有什么数据,组件中就可以接收到什么数据。
5)、props的值为函数类型,如果props是一个函数,则这个函数接收route对象为子级的形参。

  1 <!DOCTYPE html>
  2 <html lang="en">
  3     <head>
  4         <meta charset="utf-8">
  5         <title></title>
  6 
  7         <!-- 第一步,导入vue文件,为全局window对象挂载vue构造函数 -->
  8         <script src="https://unpkg.com/vue/dist/vue.js"></script>
  9         <!-- 导入vue-router文件,为全局window对象挂载vueRouter构造函数 -->
 10         <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
 11     </head>
 12     <body>
 13         <div id="app">
 14             <!-- 第二步,添加路由链接。 -->
 15             <!-- router-link是Vue中提供的标签,默认会被渲染为a标签,    to属性默认会被渲染为href属性,to属性的值默认会被渲染为#开头的hash地址 -->
 16             <router-link to="/user/1">User1</router-link>
 17             <router-link to="/user/2">User2</router-link>
 18             <router-link to="/user/3">User3</router-link>
 19             <router-link to="/user/4">User4</router-link>
 20 
 21             <router-link to="/register">Register</router-link>
 22 
 23             <!-- 第三步,添加路由填充为 -->
 24             <!-- 路由填充为也叫做路由占位符,将来通过路由规则匹配到的组件,将会被渲染到router-view所在的位置 -->
 25             <router-view></router-view>
 26         </div>
 27 
 28         <script type="text/javascript">
 29             /* 第四步,定义路由组件 */
 30             var User = {
 31                 props: ['id', 'uname', 'age'], //使用props接收路由参数
 32                 template: '<h1>User组件,用户为: {{id}} {{uname}} {{age}}</h1>', // 使用路由参数.
 33             };
 34             var Register = {
 35                 template: `
 36                 <div>
 37                 <h1>Register</h1>
 38                 <hr/>
 39                 <router-link to="/register/tab1">Tab1</router-link>
 40                 <router-link to="/register/tab2">Tab2</router-link>
 41                 
 42                 <router-view></router-view>
 43                 </div>
 44                 `,
 45                 //子级路由填充位置<router-view></router-view>
 46             };
 47 
 48             var Tab1 = {
 49                 template: '<h1>Tab1</h1>',
 50             };
 51             var Tab2 = {
 52                 template: '<h1>Tab2</h1>',
 53             };
 54 
 55             /* 第五步,配置路由规则并创建路由实例。 */
 56             // 创建路由实例对象
 57             var router = new VueRouter({
 58                 // routes是路由规则数组
 59                 routes: [
 60                     // 每个路由规则都是一个配置对象,其中至少包含path和component两个属性
 61                     // path表示当前路由规则匹配的hash地址
 62                     // component表示当前路由规则对应要展示的组件
 63                     {
 64                         path: '/user/:id', // 动态路由匹配
 65                         component: User, // 组件名称,不是字符串
 66                         /* 如果props是一个对象,它会被按原样设置为组件属性。 */
 67                         /* props: {
 68                             uname: '张飒飒',
 69                             age: 12
 70                         }, */
 71 
 72                         /* 如果props是一个函数, 则这个函数接收route对象为子级的形参 */
 73                         /* route对象就是路由中的动态参数对象,路径中有几个参数项,route里面就有几个参数值. */
 74                         props: route => ({ // 返回一个props对象
 75                             uname: '张飒飒',
 76                             age: 20,
 77                             id: route.params.id,
 78                         })
 79                     },
 80                     {
 81                         path: '/register',
 82                         component: Register, // 组件名称,不是字符串
 83                         // 通过children属性,为/register添加子路由规则
 84                         children: [{
 85                                 path: '/register/tab1',
 86                                 component: Tab1
 87                             },
 88                             {
 89                                 path: '/register/tab2',
 90                                 component: Tab2
 91                             },
 92                         ]
 93                     },
 94                     /* 其中,path表示需要被重定向的原地址,redirect表示将要被重定向到的新地址 */
 95                     {
 96                         path: '/',
 97                         redirect: '/user'
 98                     }
 99                 ]
100             });
101 
102             // 创建vm实例对象
103             var vm = new Vue({
104                 // 指定控制的区域
105                 el: '#app',
106                 data: {
107 
108                 },
109                 // 第六步,把路由挂载到Vue根实例中
110                 // 为了能够让路由规则生效,必须把路由对象挂载到Vue实例对象上
111                 router: router, // 挂载实例对象,es6中,如果属性名称和值一样可以直接写成一个属性名称即可.
112             });
113         </script>
114     </body>
115 </html>

 

10、Vue Router路由管理器,Vue Router命名路由。

答:1)、为了更加方便的表示路由的路径,可以给路由规则起一个别名,即为命名路由。    
2)、通过命名路由可以实现页面的跳转。可以用在编程式导航。

  1 <!DOCTYPE html>
  2 <html lang="en">
  3     <head>
  4         <meta charset="utf-8">
  5         <title></title>
  6 
  7         <!-- 第一步,导入vue文件,为全局window对象挂载vue构造函数 -->
  8         <script src="https://unpkg.com/vue/dist/vue.js"></script>
  9         <!-- 导入vue-router文件,为全局window对象挂载vueRouter构造函数 -->
 10         <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
 11     </head>
 12     <body>
 13         <div id="app">
 14             <!-- 第二步,添加路由链接。 -->
 15             <!-- router-link是Vue中提供的标签,默认会被渲染为a标签,    to属性默认会被渲染为href属性,to属性的值默认会被渲染为#开头的hash地址 -->
 16             <router-link to="/user/1">User1</router-link>
 17             <router-link to="/user/2">User2</router-link>
 18             <!-- 要链接到一个命名路由,可以给 router-link 的 to 属性传一个对象: -->
 19             <router-link :to="{name:'user',params:{id:123456}}">User3</router-link>
 20             <router-link to="/user/4">User4</router-link>
 21 
 22             <router-link to="/register">Register</router-link>
 23 
 24             <!-- 第三步,添加路由填充为 -->
 25             <!-- 路由填充为也叫做路由占位符,将来通过路由规则匹配到的组件,将会被渲染到router-view所在的位置 -->
 26             <router-view></router-view>
 27         </div>
 28 
 29         <script type="text/javascript">
 30             /* 第四步,定义路由组件 */
 31             var User = {
 32                 props: ['id', 'uname', 'age'], //使用props接收路由参数
 33                 template: '<h1>User组件,用户为: {{id}} {{uname}} {{age}}</h1>', // 使用路由参数.
 34             };
 35             var Register = {
 36                 template: `
 37                 <div>
 38                 <h1>Register</h1>
 39                 <hr/>
 40                 <router-link to="/register/tab1">Tab1</router-link>
 41                 <router-link to="/register/tab2">Tab2</router-link>
 42                 
 43                 <router-view></router-view>
 44                 </div>
 45                 `,
 46                 //子级路由填充位置<router-view></router-view>
 47             };
 48 
 49             var Tab1 = {
 50                 template: '<h1>Tab1</h1>',
 51             };
 52             var Tab2 = {
 53                 template: '<h1>Tab2</h1>',
 54             };
 55 
 56             /* 第五步,配置路由规则并创建路由实例。 */
 57             // 创建路由实例对象
 58             var router = new VueRouter({
 59                 // routes是路由规则数组
 60                 routes: [
 61                     // 每个路由规则都是一个配置对象,其中至少包含path和component两个属性
 62                     // path表示当前路由规则匹配的hash地址
 63                     // component表示当前路由规则对应要展示的组件
 64                     {
 65                         path: '/user/:id', // 动态路由匹配
 66                         component: User, // 组件名称,不是字符串
 67                         /* 如果props是一个对象,它会被按原样设置为组件属性。 */
 68                         /* props: {
 69                             uname: '张飒飒',
 70                             age: 12
 71                         }, */
 72 
 73                         /* 如果props是一个函数, 则这个函数接收route对象为子级的形参 */
 74                         /* route对象就是路由中的动态参数对象,路径中有几个参数项,route里面就有几个参数值. */
 75                         props: route => ({ // 返回一个props对象
 76                             uname: '张飒飒',
 77                             age: 20,
 78                             id: route.params.id,
 79                         }),
 80                         /* 命名路由 */
 81                         name: 'user', // 通过路由的name属性可以实现导航和跳转功能
 82                     },
 83                     {
 84                         path: '/register',
 85                         component: Register, // 组件名称,不是字符串
 86                         // 通过children属性,为/register添加子路由规则
 87                         children: [{
 88                                 path: '/register/tab1',
 89                                 component: Tab1
 90                             },
 91                             {
 92                                 path: '/register/tab2',
 93                                 component: Tab2
 94                             },
 95                         ]
 96                     },
 97                     /* 其中,path表示需要被重定向的原地址,redirect表示将要被重定向到的新地址 */
 98                     {
 99                         path: '/',
100                         redirect: '/user'
101                     }
102                 ]
103             });
104 
105             // 创建vm实例对象
106             var vm = new Vue({
107                 // 指定控制的区域
108                 el: '#app',
109                 data: {
110 
111                 },
112                 // 第六步,把路由挂载到Vue根实例中
113                 // 为了能够让路由规则生效,必须把路由对象挂载到Vue实例对象上
114                 router: router, // 挂载实例对象,es6中,如果属性名称和值一样可以直接写成一个属性名称即可.
115             });
116         </script>
117     </body>
118 </html>

 

11、Vue Router路由管理器,Vue Router编程式导航。

答:1)、页面导航的两种方式,第一种是声明式导航,通过点击链接实现导航的方式,叫做声明式导航,例如普通网页中的<a></a>链接或者vue中的<route-link></route-link>
2)、第二种方式就是编程时航道,通过调用js形式的api实现导航的方式,叫做编程式导航。例如普通网页中的location.href。
3)、vue中的编程式导航,常用的编程式导航如this.$router.push('hash地址')、this.$route.go(n)实现历史记录中的前进和后退,1是前进,-1是后退;

  1 <!DOCTYPE html>
  2 <html lang="en">
  3     <head>
  4         <meta charset="utf-8">
  5         <title></title>
  6 
  7         <!-- 第一步,导入vue文件,为全局window对象挂载vue构造函数 -->
  8         <script src="https://unpkg.com/vue/dist/vue.js"></script>
  9         <!-- 导入vue-router文件,为全局window对象挂载vueRouter构造函数 -->
 10         <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
 11     </head>
 12     <body>
 13         <div id="app">
 14             <!-- 第二步,添加路由链接。 -->
 15             <!-- router-link是Vue中提供的标签,默认会被渲染为a标签,    to属性默认会被渲染为href属性,to属性的值默认会被渲染为#开头的hash地址 -->
 16             <router-link to="/user/1">User1</router-link>
 17             <router-link to="/user/2">User2</router-link>
 18             <!-- 要链接到一个命名路由,可以给 router-link 的 to 属性传一个对象: -->
 19             <router-link :to="{name:'user',params:{id:123456}}">User3</router-link>
 20             <router-link to="/user/4">User4</router-link>
 21 
 22             <router-link to="/register">Register</router-link>
 23 
 24             <!-- 第三步,添加路由填充为 -->
 25             <!-- 路由填充为也叫做路由占位符,将来通过路由规则匹配到的组件,将会被渲染到router-view所在的位置 -->
 26             <router-view></router-view>
 27         </div>
 28 
 29         <script type="text/javascript">
 30             /* 第四步,定义路由组件 */
 31             var User = {
 32                 props: ['id', 'uname', 'age'], //使用props接收路由参数
 33                 // template: '<h1>User组件,用户为: {{id}} {{uname}} {{age}}</h1>', // 使用路由参数.
 34                 /* 编程式导航的使用 */
 35                 template: `
 36                     <div>
 37                         <h1>User组件,用户为: {{id}} {{uname}} {{age}}</h1>
 38                         <button @click="goRegister">跳转到注册页面</button>
 39                     </div>
 40                 `,
 41                 methods: {
 42                     goRegister: function() {
 43                         // 用编程式的方式控制路由跳转
 44                         this.$router.push('/register');
 45                     }
 46                 },
 47             };
 48             var Register = {
 49                 template: `
 50                 <div>
 51                 <h1>Register</h1>
 52                 <hr/>
 53                 <router-link to="/register/tab1">Tab1</router-link>
 54                 <router-link to="/register/tab2">Tab2</router-link>
 55                 
 56                 <router-view></router-view>
 57                 
 58                 <button @click="goBack">返回到上一步</button>
 59                 </div>
 60                 `,
 61                 //子级路由填充位置<router-view></router-view>,
 62                 methods: {
 63                     goBack: function() {
 64                         // 用编程式的方式控制路由跳转
 65                         this.$router.go('-1');
 66                     }
 67                 },
 68             };
 69 
 70             var Tab1 = {
 71                 template: '<h1>Tab1</h1>',
 72             };
 73             var Tab2 = {
 74                 template: '<h1>Tab2</h1>',
 75             };
 76 
 77             /* 第五步,配置路由规则并创建路由实例。 */
 78             // 创建路由实例对象
 79             var router = new VueRouter({
 80                 // routes是路由规则数组
 81                 routes: [
 82                     // 每个路由规则都是一个配置对象,其中至少包含path和component两个属性
 83                     // path表示当前路由规则匹配的hash地址
 84                     // component表示当前路由规则对应要展示的组件
 85                     {
 86                         path: '/user/:id', // 动态路由匹配
 87                         component: User, // 组件名称,不是字符串
 88                         /* 如果props是一个对象,它会被按原样设置为组件属性。 */
 89                         /* props: {
 90                             uname: '张飒飒',
 91                             age: 12
 92                         }, */
 93 
 94                         /* 如果props是一个函数, 则这个函数接收route对象为子级的形参 */
 95                         /* route对象就是路由中的动态参数对象,路径中有几个参数项,route里面就有几个参数值. */
 96                         props: route => ({ // 返回一个props对象
 97                             uname: '张飒飒',
 98                             age: 20,
 99                             id: route.params.id,
100                         }),
101                         /* 命名路由 */
102                         name: 'user', // 通过路由的name属性可以实现导航和跳转功能
103                     },
104                     {
105                         path: '/register',
106                         component: Register, // 组件名称,不是字符串
107                         // 通过children属性,为/register添加子路由规则
108                         children: [{
109                                 path: '/register/tab1',
110                                 component: Tab1
111                             },
112                             {
113                                 path: '/register/tab2',
114                                 component: Tab2
115                             },
116                         ]
117                     },
118                     /* 其中,path表示需要被重定向的原地址,redirect表示将要被重定向到的新地址 */
119                     {
120                         path: '/',
121                         redirect: '/user'
122                     }
123                 ]
124             });
125 
126             // 创建vm实例对象
127             var vm = new Vue({
128                 // 指定控制的区域
129                 el: '#app',
130                 data: {
131 
132                 },
133                 // 第六步,把路由挂载到Vue根实例中
134                 // 为了能够让路由规则生效,必须把路由对象挂载到Vue实例对象上
135                 router: router, // 挂载实例对象,es6中,如果属性名称和值一样可以直接写成一个属性名称即可.
136             });
137         </script>
138     </body>
139 </html>

 

posted on 2020-04-24 22:00  别先生  阅读(1710)  评论(1编辑  收藏  举报