如何使用

定义路由的时候可以配置meta字段,用于自定义一些信息

  1. const router = new VueRouter({
  2. routes: [
  3. {
  4. path: '/foo',
  5. component: Foo,
  6. children: [
  7. {
  8. path: 'bar',
  9. component: Bar,
  10. meta: { requiresLogin: true }
  11. }
  12. ]
  13. }
  14. ]
  15. })

案例

通过路由元信息,与导航守卫实现简易部分网页需要登录才能查看的效果 效果图如下
导航元信息.gif
源码
操作的cookie插件
auth.js

  1. // 判断是否登录
  2. function isLogin (){
  3. return document.cookie.includes('login=true')
  4. }
  5. // 添加记录
  6. function addLogin(){
  7. const date = new Date()
  8. const expiresTime = 147;
  9. date.setTime(date.getTime() + 147 * 24 * 60 * 60 *1000)
  10. document.cookie = `login=true;expires=${date.toGMTString()}`
  11. }
  12. // 删除记录
  13. function deleteLogin(){
  14. const date = new Date()
  15. date.setTime(date.getTime() - 100000000)
  16. console.log(date.toGMTString())
  17. document.cookie = `login=true;expires=${date.toGMTString()}`
  18. }
  19. export default{
  20. isLogin,
  21. addLogin,
  22. deleteLogin,
  23. }

/about/academic 添加路由元信息
router.js的代码

  1. const routes = [
  2. {
  3. path:'/',
  4. // 当输入域名访问是,将其其路径重定向为/home
  5. redirect:'/home'
  6. },
  7. {
  8. path: '/home',
  9. // 异步加载组件,当标签被点击才会加载组件
  10. component: () => import('./components/views/Home.vue'),
  11. },
  12. {
  13. path: '/learn',
  14. // component: () => import('./components/views/Learn.vue')
  15. // 展示多个命令视图
  16. // 默认展示名为default视图
  17. components:{
  18. default: () => import('./components/views/Learn.vue'),
  19. // view: () => import('./components/views/Academic.vue'),
  20. }
  21. },
  22. {
  23. path: '/show',
  24. // component: () => import('./components/views/Show.vue')
  25. components:{
  26. default: () => import('./components/views/Show.vue'),
  27. view: () => import('./components/views/About.vue')
  28. }
  29. },
  30. {
  31. // 添加路由元信息
  32. path: '/about',
  33. component: () => import('./components/views/About.vue'),
  34. meta:{
  35. requiresLogin:true
  36. }
  37. },
  38. {
  39. path: '/community',
  40. name:'community',
  41. component: () => import('./components/views/community.vue'),
  42. // 重定向
  43. // 当单击社区时默认选中学术讨论
  44. // 第一种
  45. // redirect:'/community/academic',
  46. // 第二种 通过命令路由
  47. // redirect: { name:'academic'},
  48. // 第三种 通过方法
  49. redirect:to =>{
  50. return {
  51. name:'academic'
  52. }
  53. },
  54. // 路由嵌套
  55. children:[
  56. {
  57. // 添加路由元信息
  58. path:'academic',
  59. // 命名路由
  60. name:'academic',
  61. meta:{
  62. requiresLogin: true
  63. },
  64. component:()=> import('./components/views/Academic.vue')
  65. },
  66. {
  67. path:'personal',
  68. name:'personal',
  69. component: () => import('./components/views/Personal.vue')
  70. },
  71. {
  72. path:'download',
  73. name:'download',
  74. component: () => import('./components/views/Download.vue')
  75. },
  76. ]
  77. },
  78. {
  79. /**
  80. * 动态路由匹配
  81. * /question/下的参数都将是question.vue 渲染出来的
  82. */
  83. path:'/question/:id',
  84. name:'question',
  85. props:route =>({
  86. name:route.name,
  87. id: route.params.id,
  88. }),
  89. component:() => import('./components/views/question.vue')
  90. },
  91. {
  92. path:'/login',
  93. name:'login',
  94. component: () => import('./components/views/Login.vue')
  95. }
  96. ]

使用全局前置守卫,当拥有路由元信息的需要判断是否登录
router.js的代码

  1. import auth from './components/utils/auth'
  2. // 全局前置守卫
  3. router.beforeEach((to,from,next) =>{
  4. // 判断to中路由表是否拥有路由元信息,这是为啦防止使用URL直接访问需要登录页面下的子页面从而查看需要登录的页面
  5. let isRequiresLogin = to.matched.some(item => item.meta.requiresLogin)
  6. // 是否为需要登录的页面
  7. if(isRequiresLogin){
  8. // 判断是否登录
  9. const isLogin = auth.isLogin()
  10. if(isLogin){
  11. // 当登录过就放行
  12. next()
  13. }else{
  14. // 没有登录让其跳转到登录页面,也可以不跳转
  15. const result = window.confirm('请登录')
  16. if(result){
  17. next('/login')
  18. }
  19. }
  20. }else{
  21. // 不是需要登录的页面直接放行
  22. next()
  23. }
  24. })