如何使用
定义路由的时候可以配置meta字段,用于自定义一些信息
const router = new VueRouter({routes: [{path: '/foo',component: Foo,children: [{path: 'bar',component: Bar,meta: { requiresLogin: true }}]}]})
案例
通过路由元信息,与导航守卫实现简易部分网页需要登录才能查看的效果 效果图如下
源码
操作的cookie插件
auth.js
// 判断是否登录function isLogin (){return document.cookie.includes('login=true')}// 添加记录function addLogin(){const date = new Date()const expiresTime = 147;date.setTime(date.getTime() + 147 * 24 * 60 * 60 *1000)document.cookie = `login=true;expires=${date.toGMTString()}`}// 删除记录function deleteLogin(){const date = new Date()date.setTime(date.getTime() - 100000000)console.log(date.toGMTString())document.cookie = `login=true;expires=${date.toGMTString()}`}export default{isLogin,addLogin,deleteLogin,}
为 /about 与 /academic 添加路由元信息
router.js的代码
const routes = [{path:'/',// 当输入域名访问是,将其其路径重定向为/homeredirect:'/home'},{path: '/home',// 异步加载组件,当标签被点击才会加载组件component: () => import('./components/views/Home.vue'),},{path: '/learn',// component: () => import('./components/views/Learn.vue')// 展示多个命令视图// 默认展示名为default视图components:{default: () => import('./components/views/Learn.vue'),// view: () => import('./components/views/Academic.vue'),}},{path: '/show',// component: () => import('./components/views/Show.vue')components:{default: () => import('./components/views/Show.vue'),view: () => import('./components/views/About.vue')}},{// 添加路由元信息path: '/about',component: () => import('./components/views/About.vue'),meta:{requiresLogin:true}},{path: '/community',name:'community',component: () => import('./components/views/community.vue'),// 重定向// 当单击社区时默认选中学术讨论// 第一种// redirect:'/community/academic',// 第二种 通过命令路由// redirect: { name:'academic'},// 第三种 通过方法redirect:to =>{return {name:'academic'}},// 路由嵌套children:[{// 添加路由元信息path:'academic',// 命名路由name:'academic',meta:{requiresLogin: true},component:()=> import('./components/views/Academic.vue')},{path:'personal',name:'personal',component: () => import('./components/views/Personal.vue')},{path:'download',name:'download',component: () => import('./components/views/Download.vue')},]},{/*** 动态路由匹配* /question/下的参数都将是question.vue 渲染出来的*/path:'/question/:id',name:'question',props:route =>({name:route.name,id: route.params.id,}),component:() => import('./components/views/question.vue')},{path:'/login',name:'login',component: () => import('./components/views/Login.vue')}]
使用全局前置守卫,当拥有路由元信息的需要判断是否登录
router.js的代码
import auth from './components/utils/auth'// 全局前置守卫router.beforeEach((to,from,next) =>{// 判断to中路由表是否拥有路由元信息,这是为啦防止使用URL直接访问需要登录页面下的子页面从而查看需要登录的页面let isRequiresLogin = to.matched.some(item => item.meta.requiresLogin)// 是否为需要登录的页面if(isRequiresLogin){// 判断是否登录const isLogin = auth.isLogin()if(isLogin){// 当登录过就放行next()}else{// 没有登录让其跳转到登录页面,也可以不跳转const result = window.confirm('请登录')if(result){next('/login')}}}else{// 不是需要登录的页面直接放行next()}})
