针对“vue的路由守卫和keep-alive后生命周期详解”的攻略,本文将从以下几个方面逐一展开:
- 路由守卫
Vue.js提供了路由守卫,用于在路由切换前后进行回调处理,可以根据需求在路由切换前进行权限验证、登录态验证、路由拦截等操作,提高了应用的安全性和灵活性。路由守卫主要分为全局守卫和组件内守卫两种类型。
- 全局守卫
全局守卫是在整个应用程序中进行的。Vue.js提供了三个全局守卫:beforeEach、beforeResolve和afterEach。这三个守卫分别在路由转换开始前、解析完异步组件后以及路由转换完成时进行回调处理。下面,我们通过一个示例来演示一下这几个守卫的使用。
router.beforeEach((to, from, next) => {
if (to.meta.requireAuth) {
if (localStorage.getItem('token')) {
next();
} else {
next({
path: '/login',
query: {
redirect: to.fullPath
}
})
}
} else {
next();
}
})
router.beforeResolve((to, from, next) => {
// do something before resolving route
next();
})
router.afterEach((to, from) => {
// do something after route has been changed
})
在这段代码中,我们通过beforeEach全局守卫来进行路由拦截,如果需要访问的路由需要登录状态,而当前并未登录,则会跳转到登录页面,否则继续进行路由转换。beforeResolve全局守卫则在异步组件解析完毕后进行回调处理,可以在此时进行Loading动画的隐藏等操作。afterEach全局守卫则在路由转换完成后进行回调处理,可以在此时进行页面滚动、页面埋点等操作。
- 组件内守卫
组件内守卫是在组件内部进行的。Vue.js提供了beforeRouteEnter、beforeRouteUpdate和beforeRouteLeave三个组件内守卫。这三个守卫分别在组件创建前、路由参数变化时以及离开当前路由时进行回调处理。下面,我们通过两个示例演示一下这几个守卫的使用。
示例一:
export default {
name: 'Home',
beforeRouteEnter (to, from, next) {
console.log('beforeRouteEnter')
next()
},
beforeRouteUpdate (to, from, next) {
console.log('beforeRouteUpdate')
next()
},
beforeRouteLeave (to, from, next) {
console.log('beforeRouteLeave')
next()
}
}
在这个示例中,我们定义了一个Home组件,并在组件内定义了beforeRouteEnter、beforeRouteUpdate和beforeRouteLeave三个守卫。当我们从其他路由跳转到Home路由时,会触发beforeRouteEnter守卫;当我们在Home路由中切换路由参数时,会触发beforeRouteUpdate守卫;当我们离开Home路由时,会触发beforeRouteLeave守卫。
示例二:
export default {
name: 'Detail',
data () {
return {
detailData: {}
}
},
beforeRouteEnter (to, from, next) {
console.log('beforeRouteEnter')
if (localStorage.getItem('token')) {
axios.get(`http://xxx.com/detail/${to.params.id}`).then(res => {
next(vm => {
vm.detailData = res.data
})
})
} else {
next({
path: '/login',
query: {
redirect: to.fullPath
}
})
}
},
beforeRouteUpdate (to, from, next) {
console.log('beforeRouteUpdate')
axios.get(`http://xxx.com/detail/${to.params.id}`).then(res => {
this.detailData = res.data
next()
})
},
beforeRouteLeave (to, from, next) {
console.log('beforeRouteLeave')
next()
}
}
在这个示例中,我们定义了一个Detail组件,并在组件内定义了beforeRouteEnter、beforeRouteUpdate和beforeRouteLeave三个守卫。当我们在从其他路由跳转到Detail路由时,会触发beforeRouteEnter守卫,我们可以在这里进行登录状态检查和获取详情数据的操作,并在next回调中将数据传递给组件实例;当我们在Detail路由中切换路由参数时,会触发beforeRouteUpdate守卫,我们可以在这里根据最新的路由参数重新获取数据,更新组件内的数据;当我们离开Detail路由时,会触发beforeRouteLeave守卫,可以在这里进行一些清理工作。
- keep-alive后生命周期
keep-alive是Vue.js内置的一个组件,用于缓存动态组件或者组件的状态,在组件被激活或者被销毁时控制缓存的生命周期。如果你的组件需要频繁切换,而其中的状态又比较复杂和重要,可以考虑使用keep-alive来进行性能优化。下面,我们将详细介绍keep-alive的生命周期以及如何利用生命周期进行缓存控制。
- activated
activated生命周期钩子函数会在组件被激活时调用,可以在这里进行缓存处理。下面,我们通过一个示例来演示一下activated的使用。
<template>
<div>
<h2>{{title}}</h2>
<p>{{content}}</p>
</div>
</template>
<script>
export default {
name: 'MessageDetails',
data () {
return {
id: '',
title: '',
content: ''
}
},
created () {
this.id = this.$route.params.id
this.getMessageDetail()
},
activated () {
this.getMessageDetail()
},
methods: {
getMessageDetail () {
// get message detail data by id
// ...
this.title = 'message title'
this.content = 'message content'
}
}
}
</script>
在这个示例中,我们定义了一个MessageDetails组件,用来显示消息详情页。在该组件的created生命周期函数中,我们通过$route.params获取路由参数,然后调用getMessageDetail方法来获取消息详情数据。在activated生命周期函数中,我们每次组件被激活时都会调用getMessageDetail方法来刷新数据,达到缓存的效果。
- deactivated
deactivated生命周期钩子函数会在组件被停用时调用,可以在这里进行缓存处理。下面,我们通过一个示例来演示一下deactivated的使用。
<template>
<div>
<p>{{content}}</p>
</div>
</template>
<script>
export default {
name: 'MessageItem',
data () {
return {
content: ''
}
},
created () {
this.initContent()
},
deactivated () {
this.clearContent()
},
methods: {
initContent () {
// init message content
// ...
this.content = 'message content'
},
clearContent () {
// clear message content
// ...
this.content = ''
}
}
}
</script>
在这个示例中,我们定义了一个MessageItem组件,用来显示消息列表中的每一个消息,当每一个消息的信息比较重要且状态比较复杂时,我们可以使用keep-alive来进行缓存优化。在该组件的created生命周期函数中,我们调用initContent方法来初始化消息内容,在deactivated生命周期函数中,我们调用clearContent方法来清空消息内容。这样,当该组件被缓存时,内容会被保存下来,当组件重新被激活时,内容会被恢复。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue的路由守卫和keep-alive后生命周期详解 - Python技术站