<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
/*
全局前置守卫
beforeEach((to, from, next) => {})
全局解析守卫
beforeResolve((to, from, next) => {})
全局后置钩子
afterEach((to, from) => {})
router.全局守卫((to, from, [next]) => {})
路由独享守卫
beforeEnter((to, from, next) => {})
在配置路由是写在路由配置对象上的
routes: [
{
path: '/',
component: index,
beforeEnter (to, from, next) => {
}
}
]
组件内守卫
beforeRouteEnter((to, from, next) => {})
beforeRouteUpdate((to, from, next) => {})
beforeRouteLeave((to, from, next) => {})
组件内守卫写在组件内和组件生周期钩子函数的写法相同
const component = {
template: ``,
beforeRouteEnter (() => {}),
beforeRouteUpdate (() => {}),
beforeRouteLeave(() => {})
}
*/
/*
三种页面跳转
1 直接刷新页面
beforeEach
/ beforeEnter
组件中的beforeRouteEnter
全局解析守卫
全局后置守卫
路由跳转结束后
开始组件生命周期
创建前
创建后
挂载前
挂载后
2 路由改变但组件不变
全局前置守卫触发
组件内beforeRouteUpdate触发
beforeResolve
afterEach
3 路由改变组件改变
组件内beforeRouteLeave
beforeEach
to组件的路由独享守卫触发
to组件的beforeRouteEnter触发
beforeResolve
afterEach
to组件创建
to组件挂载前
from组件销毁
to组件挂载
beforeRouteLeave
beforEach
beforeRouteUpdate
beforeEnter
beforeRouteEnter
beforeResolve
afterEach
beforeRouteEnter中的this指向window,因为在其触发时组件还没有被创建
*/
</script>
<div id="app">
<nav>
<router-link to="/">首页</router-link>
<router-link to="/page">子页面</router-link>
</nav>
<router-view></router-view>
</div>
<script src="../vue.js"></script>
<script src="../vue-router.js"></script>
<script>
const Index = {
template: `
<div>首页</div>
`,
beforeCreate () {
console.log('首页组件创建前')
},
created () {
console.log('首页组件创建后')
},
beforeMount() {
console.log('首页组件挂在前')
},
mounted () {
console.log('首页组件挂在后')
},
beforeDestroy () {
console.log('首页销毁前')
},
destroyed () {
console.log('首页销毁后')
},
beforeRouteEnter(to, from, next){
console.log('首页组件的enter守卫')
console.log(this)
next((vm)=>{
console.log(vm)
})
},
beforeRouteUpdate(to, from, next){
console.log('首页组件的update守卫')
console.log(this)
next()
},
beforeRouteLeave(to, from, next){
console.log('首页组件的leave守卫')
console.log(this)
next()
},
}
const Page = {
template: `
<div>子页面</div>
`,
beforeCreate () {
console.log('page组件创建前')
},
created () {
console.log('page组件创建后')
},
beforeMount() {
console.log('page组件挂在前')
},
mounted () {
console.log('page组件挂在后')
},
beforeRouteEnter(to, from, next){
console.log('page组件的enter守卫')
},
beforeRouteUpdate(to, from, next){
console.log('page组件的update守卫')
next()
},
beforeRouteLeave(to, from, next){
console.log('page组件的leave守卫')
next()
},
}
const router = new VueRouter({
routes: [
{
path: '/',
component: Index,
beforeEnter (to, from, next) {
console.log('/ 路由的独享守卫触发')
next()
}
}, {
path: '/page',
component: Page,
beforeEnter (to, from, next) {
console.log('/page 路由的独享守卫触发')
next()
}
}
]
})
router.beforeEach((to, from, next) => {
console.log('全局前置守卫触发')
next()
})
router.beforeResolve((to, from, next) => {
console.log('全局解析守卫触发')
next()
})
router.afterEach((to, from) => {
console.log('全局后置守卫触发')
})
const app = new Vue({
el: "#app",
router
})
</script>
</body>
</html>