路由的重定项

  1. {
  2. path: '/',
  3. name: 'home',
  4. // 重定向到role,role是已经配置了的路由
  5. redirect:"/role",
  6. // 重定向还可以是一个函数
  7. // redirect:() => {
  8. // return { path: '/role', query: { q: "123" } }
  9. // }
  10. },

别名

  1. {
  2. path: '/',
  3. name: 'home',
  4. // 重定向到role
  5. redirect:"/role",
  6. // 别名 别名可以通过用数组使用多个别名
  7. // 将 / 别名为 /home,意味着当用户访问 /home 时,URL 仍然是 /home,但会被匹配为用户正在访问 /
  8. // 想要地址栏变成别名,前面就要使用别名跳转,这样他就显示的时别名(/home),但实际上时访问的 /
  9. alias: ['/home','/name'],
  10. },

通配路径

通过正则匹配有相同点的路径

  1. // 将匹配所有内容并将其放在 `$route.params.pathMatch` 下
  2. //被匹配到的路径会被存放到pathMatch这个变量中,可以通过$route.params.pathMatch获取
  3. // { path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound },
  4. // 将匹配以 `/user-` 开头的所有内容,并将其放在 `$route.params.afterUser` 下
  5. // { path: '/user-:afterUser(.*)', component: UserGeneric },

动态传参

  1. {
  2. // 动态传参
  3. // 传递的参数可以在对应的组件中通过this.$route.params
  4. // 使用动态传参是路径上必须有对应的数据,
  5. path: '/role/:id',
  6. name: 'role',
  7. component:()=> import(/* webpackChunkName: "content" */ "../views/RoleManage.vue")
  8. },

优点

1.没有硬编码的 URL
2.params 的自动编码/解码。
3. 防止你在 url 中出现打字错误
4. 绕过路径排序(如显示一个)

router-link和this.$route.push

链接命名路由 通过to传递一个对象

这样通过动态路由传递数据时要通过params了
这和router.push({ name: ‘user’, params: { username: ‘erina’ } })是一样的

二级路由

// 以 / 开头的嵌套路径将被视为根路径。这允许你利用组件嵌套,而不必使用嵌套的 URL
// 1.路由配置页面,设置默认路由,然后你想在哪个页面写嵌套路由,就在这个路由中写子路由
// 2.子路由跳转及其展示,router-link,帮助我们操作要在router-view中展示的子路由页面

  1. {
  2. path: '/userlist',
  3. name: 'userlist',
  4. component:()=> import(/* webpackChunkName: "content" */ "../views/UserList.vue"),
  5. // 二级路由要写到对应的路由配置项下面才行
  6. children:[
  7. // 当 /userlist/notfound 匹配成功
  8. // NotFound 将被渲染到 App.vue 的 <router-view> 内部
  9. // component引入组件
  10. { path: 'notfound', component:NotFound},
  11. ]
  12. },

对应二级路由的使用

  1. <template>
  2. <div>
  3. 用户列表
  4. // 二级路由要设置一个单独的router-view
  5. <router-view></router-view>
  6. <!-- 路径要包括二级路由的路径,即一级路由路径/二级路由路径 -->
  7. <router-link to='/userlist/notfound'>二级路由</router-link>
  8. </div>
  9. </template>

声明式导航


  1. <template>
  2. <div class="left-bar">
  3. <ul>
  4. <li>
  5. <span class="main-title">系统账号管理</span>
  6. <ul>
  7. <li>
  8. <!-- 声明式导航 -->
  9. <router-link class="router-link" to="/system/系统账号管理/平台账号管理">平台账号管理</router-link>
  10. </li>
  11. <li>
  12. <!-- 在路由表中是动态传参,那么在使用router-link时也要传递参数 -->
  13. <!-- 点击router-link时内部会调用this.$route.push -->
  14. <!-- 由于属性 to router.push 接受的对象种类相同,所以两者的规则完全相同。 -->
  15. <router-link class="router-link" :to="{name:'role',params: { id: 1 }}">角色管理</router-link>
  16. </li>
  17. </ul>
  18. </li>
  19. </ul>
  20. </div>
  21. </template>

页面跳转

push

特点

// 通过push跳转的页面会有历史记录的
// 只有一个路径作为参数时,直接传参,多个参数时使用对象传参
// this.$router.push(‘/users/eduardo’)

  1. // <!-- router.push 和所有其他导航方法都会返回一个 Promise,<br /> // 让我们可以等到导航完成后才知道是成功还是失败。 -->

传参

  1. // path与query一起使用,当path存在时params将会被忽略<br /> // this.$router.push({path:'/ok',query:{plan: 'private'}})
  2. // 通过反引号输入path<br /> const pat = '/ok';<br /> this.$router.push({path:`${pat}`,query:{plan: 'private'}})
  3. // name和params一起使用,通过命名路由跳转页面<br /> // this.$router.push({ name: 'user', params: { username: 'eduardo' } })
  4. // 传递的传参数可以是hash<br /> // this.$router.push({ path: '/about', hash: '#team' })

replace

  1. // 通过replace跳转的页面(没有历史记录)<br /> // 历史记录中(1,2,3)中的3被替换成4-->(1,2,4)<br /> // this.$router.replace()//作用和this.$router.push一样,(他把当前路径替换成replace中的路径)<br /> // 在历史记录中,也是将当前记录替换成replace中的<br /> // this.$router.replace({ path: '/ok' })

replace和push

  1. // router.push({ path: '/home', replace: true })<br /> // 相当于<br /> // router.replace({ path: '/home' })

go

  1. // 通过go横跨页面,(当然也可以使用forworld()向前,back()向后)<br /> // this.$router.go(1)

获取传递的参数

  1. <div>params:{{this.$route.params}}</div>
  2. <div>query:{{this.$route.query}}</div>

代码

  1. <template>
  2. <div class="left-bar">
  3. <ul>
  4. <li>
  5. <span class="main-title">系统账号管理</span>
  6. <ul>
  7. <li>
  8. <!-- 声明式导航 -->
  9. <router-link class="router-link" to="/system/系统账号管理/平台账号管理">平台账号管理</router-link>
  10. </li>
  11. <li>
  12. <!-- 在路由表中时动态传参,那么在使用router-link时就要传递参数 -->
  13. <!-- 点击router-link时内部会调用this.$route.push -->
  14. <!-- 由于属性 to router.push 接受的对象种类相同,所以两者的规则完全相同。 -->
  15. <router-link class="router-link" :to="{name:'role',params: { id: 1 }}">角色管理</router-link>
  16. </li>
  17. </ul>
  18. </li>
  19. <li>
  20. <span class="main-title">用户管理</span>
  21. <ul>
  22. <li>
  23. <router-link class="router-link" to="/userreg">用户注册</router-link>
  24. </li>
  25. <li>
  26. <router-link class="router-link" to="/userlist">用户列表</router-link>
  27. </li>
  28. <li>
  29. <button class="btn" @click="toPage">跳转到404</button>
  30. </li>
  31. </ul>
  32. </li>
  33. </ul>
  34. </div>
  35. </template>
  36. <script>
  37. export default {
  38. methods:{
  39. toPage:function() {
  40. // 通过push跳转的页面会有历史记录的
  41. // 只有一个路径作为参数时,直接传参,多个参数时使用对象传参
  42. // this.$router.push('/users/eduardo')
  43. // <!-- router.push 和所有其他导航方法都会返回一个 Promise,
  44. // 让我们可以等到导航完成后才知道是成功还是失败。 -->
  45. // path与query一起使用,当path存在时params将会被忽略
  46. // this.$router.push({path:'/ok',query:{plan: 'private'}})
  47. // 通过反引号输入path
  48. const pat = '/ok';
  49. this.$router.push({path:`${pat}`,query:{plan: 'private'}})
  50. // name和params一起使用,通过命名路由跳转页面
  51. // this.$router.push({ name: 'user', params: { username: 'eduardo' } })
  52. // 传递的传参数可以是hash
  53. // this.$router.push({ path: '/about', hash: '#team' })
  54. // 通过replace跳转的页面(没有历史记录)
  55. // 历史记录中(1,2,3)中的3被替换成4-->(1,2,4)
  56. // this.$router.replace()//作用和this.$router.push一样,(他把当前路径替换成replace中的路径)
  57. // 在历史记录中,也是将当前记录替换成replace中的
  58. // this.$router.replace({ path: '/ok' })
  59. // router.push({ path: '/home', replace: true })
  60. // 相当于
  61. // router.replace({ path: '/home' })
  62. // 通过go横跨页面,(当然也可以使用forworld()向前,back()向后)
  63. // this.$router.go(1)
  64. }
  65. }
  66. }
  67. </script>
  68. <style>
  69. ul,li{
  70. list-style: none;
  71. text-decoration: none;
  72. text-align: start;
  73. padding: 0;
  74. margin: 0;
  75. width: 100%;
  76. }
  77. .router-link {
  78. text-decoration: none;
  79. color: #333;
  80. height: 40px;
  81. background-color: rgb(247,248,248);
  82. display: block;
  83. line-height: 40px;
  84. font-size: 15px;
  85. font-weight: bold;
  86. padding-left: 30px;
  87. }
  88. .left-bar .main-title {
  89. height: 60px;
  90. display: block;
  91. line-height: 60px;
  92. font-size: 20px;
  93. font-weight: bold;
  94. padding-left: 15px;
  95. }
  96. </style>

首页布局代码

/ 让容器沾满全屏的高度 /
height: 100vh;
/ 让容器占满剩余位置 /
flex-grow: 1;

  1. <template>
  2. <div id="app">
  3. <div class="leftBar">
  4. <LeftBar></LeftBar>
  5. </div>
  6. <div class="rightContent">
  7. <!-- 因只有一个页面,所以不论router-linkrouter-view写在哪里都是可以匹配的 -->
  8. <router-view></router-view>
  9. </div>
  10. </div>
  11. </template>
  12. <script>
  13. import LeftBar from './components/LeftBar.vue'
  14. export default{
  15. components:{
  16. LeftBar
  17. }
  18. }
  19. </script>
  20. <style>
  21. #app {
  22. font-family: Avenir, Helvetica, Arial, sans-serif;
  23. -webkit-font-smoothing: antialiased;
  24. -moz-osx-font-smoothing: grayscale;
  25. text-align: center;
  26. color: #2c3e50;
  27. width: 100%;
  28. height: 100%;
  29. display: flex;
  30. /* 让容器沾满全屏 */
  31. height: 100vh;
  32. }
  33. nav {
  34. padding: 30px;
  35. }
  36. nav a {
  37. font-weight: bold;
  38. color: #2c3e50;
  39. }
  40. nav a.router-link-exact-active {
  41. color: #42b983;
  42. }
  43. .leftBar {
  44. width: 200px;
  45. }
  46. .rightContent {
  47. /* 让容器占满剩余位置 */
  48. flex-grow: 1;
  49. border-left: 1px solid #333;
  50. }
  51. </style>