路由守卫,可以想象为古代御前侍卫,路由守卫,则是对路由进行权限控制
分类:全局守卫、独享守卫、组件内守卫
作用:主要用来鉴权
用户点击导航区,随后引起路径的改变,前端路由器监测到,进行规则的匹配,在合适的位置呈现组件。

调用时机:初始化时被调用,每次路由切换之前调用
写法:
router.beforeEach((to, from, next) => {
// 判断当前路由是否需要进行权限控制
if(to.meta.isAuth) {
// 权限控制规则
if(localStorage.getItem("token")){
next() // 放行
}
} else if(to.path == '/home'){
next()
} else {
console.log("暂无权限");
}
});
参数说明:
导航钩子的三个参数解析:
在一个单页面spa应用中,如果改变网页的标题呢?
普通的修改方式:
有没有更好的方式呢,使用路由后置守卫即可
路由后置守卫使用说明:
主要作用:变更页签标题
调用时机:初始化被调用,每次路由切换之后调用
写法:
router.afterEach((to, from) => {
document.title = to.meta.title
})
可以利用afterEach来完成标题的修改。具体实现步骤如下:
// 定义路由
const routes = [
{
path:'/index',
component:Home,
meta:{
title:"首页"
}
},
{
path:"/about",
component:About,
meta:{
title:"关于"
}
}
]
// 利用导航守卫。修改我们的标题
router.afterEach((to, from) => {
document.title = to.meta.title
})
对某一个路由单独进行控制的守卫
比如只对系统配置进行限制
const routes = [
{
path: "/system",
name: "System",
component: () => import(/* webpackChunkName: "system" */ "@/views/System"),
beforeEnter: (to, from, next) => {
if(to.meta.isAuth) {
if(localStorage.getItem("token")){
next()
}
} else {
console.log("暂无权限");
}
}
},
]
在组件文件内部写,beforeRouteEnter、beforeRouteLeave
调用时机:通过路由规则,beforeRouteEnter进入该组件时被调用,beforeRouteLeave离开该组件时被调用
// 进入守卫,通过路由规则,进入该组件时被调用
beforeRouteEnter(to, from,next){
},
// 进入守卫,通过路由规则,离开该组件时被调用
beforeRouteLeave(to,from,next){
}
keep-alive是Vue内置的一个组件,可以使被包含的组件保留状态或避免重新渲染
router-view也是一个组件,如果直接被包在keep-alive里面,所有路径匹配的视图组件都会被缓存
<keep-alive>
<router-view>
// 所有路径匹配到的视图组件会被缓存
</router-view>
</keep-alive>
对于一个Url来说,什么是hash值?#及其后面的内容就是hash值。
hash值不会包含在HTTP请求中,即:hash值不会带给服务器。
hash也就是锚点(#),本质上是改变window.loaction的href属性。
我们可以通过直接复制window.location.hash来改变href,页面不发生刷新
hash模式:
history模式:
这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。
当你使用 history 模式时,URL 就像正常的 url,例如 http://yoursite.com/user/id,也好看!
不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://oursite.com/user/id 就会返回 404,这就不好看了。
url的hash、h5的history,默认情况下,路径的改变使用的是URL的hash模式,如果希望使用HTML5的history模式,非常简单,进行如下配置即可:
const router = new VueRouter({
routes,
mode:'history'
})