导航守卫
我们考虑一个需求:在一个spa应用中,如何给改变网页的标题呢?
spa只有一个固定的HTML,切换不同的页面时,标题并不会变
但是我们可以通过js来修改<title>的内容。document.title = '新标题'
那么,在Vue项目中,在哪修改比较合适呢?
普通修改方式:在mounted函数执行相应的代码就行修改,但是当页面较多时,不容易维护
什么时导航守卫?
vue-router提供的导航守卫主要用来监听路由的进入和离开
vue-router提供了beforeEach和afterEach的钩子函数,它会在路由即将
改变前和改变后触发

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '@/components/Home'
import About from '@/components/About'
import HomeNews from '@/components/HomeNews'
import HomeMes from '@/components/HomeMes'
import User from '@/components/User'
Vue.use(VueRouter)
const routes = [
{
path: '',
// redirect重定向
redirect: '/home',
},
{
path: '/home',
component: Home,
meta: {
title:'家园'
},
children: [
{
path: '',
// redirect重定向
redirect: 'news'
},
{
path: 'news',
component:HomeNews
},
{
path: 'mes',
component:HomeMes
}
]
},
{
path: '/about',
component: About,
meta: {
title:'关于我们'
},
beforeEnter: (to, from, next) => {
console.log('路由独享的守卫')
next()
}
},
{
// 路由传值
path: '/user/:id',
// 懒加载 //一个懒加载路由对应一个js文件,访问路由才请求这个js文件
component: ()=>import('../components/User'),
// meta:元数据(描述数据的数据)
meta: {
title:'个人中心'
},
},
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
// 前置钩子(hook)
router.beforeEach((to,from,next) => {
// 从from跳转to
// to 和 from都是route对象
document.title = to.matched[0].meta.title
// 调用该方法后,才能进入下一个钩子
// 如果是后置钩子,也就是afterEach,不需要主动调用next()函数
// 这里其实可以判断用户登陆权限之类的,拦截访问 ,权限不符调用next(false)拦截
next()
})
// 后置钩子
router.afterEach((to,from) => {
console.log('---')
})
export default router