이 기사는 인터뷰에서 꼭 물어봐야 할 사항에 대해 설명합니다. Vue-Router의 탐색 후크가 도움이 되기를 바랍니다.
"Navigation"은 경로가 변경되고 있음을 나타냅니다.
vue-router
vue-router
提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。【相关推荐:《vue.js教程》】
router.beforeEach
注册一个全局前置守卫:
const router = new VueRouter({ ... }) router.beforeEach((to, from, next) => { // to:要去哪个页面 // from:从哪里来 // next:它是一个函数。 // 如果直接放行 next() // 如果要跳到其它页 next(其它页) })
示例代码:
router.beforeEach(async(to, from, next) => { NProgress.start() // 开启进度条 const token = store.state.user.token const userId = store.state.user.userInfo.userId console.log(token, to.path, from.path) if (token) { if (to.path === '/login') { // 有 token还要去login next('/') NProgress.done() // 关闭进度条 } else { // 有 token,去其他页面,放行 if (!userId) { await store.dispatch('user/getUserInfo') } next() } } else { if (to.path === '/login') { // 没有token,去login,放行 next() } else { next('/login') // 没有token,去其他页面 NProgress.done() } } })
router.afterEach
注册一个全局后置钩子:
你也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next
函数也不会改变导航本身:
router.afterEach((to, from) => { // ... })
在 2.5.0+ 你可以用 router.beforeResolve
注册一个全局守卫。这和 router.beforeEach
类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。
你可以在路由配置上直接定义 beforeEnter
守卫:
const router = new VueRouter({ routes: [ { path: '/foo', component: Foo, beforeEnter: (to, from, next) => { // ... } } ] })
beforeRouteEnter
beforeRouteUpdate
(2.2 新增)beforeRouteLeave
const Foo = { template: `...`, beforeRouteEnter(to, from, next) { // 在渲染该组件的对应路由被 confirm 前调用 // 不!能!获取组件实例 `this` // 因为当守卫执行前,组件实例还没被创建 }, beforeRouteUpdate(to, from, next) { // 在当前路由改变,但是该组件被复用时调用 // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候, // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。 // 可以访问组件实例 `this` }, beforeRouteLeave(to, from, next) { // 导航离开该组件的对应路由时调用 // 可以访问组件实例 `this` } }
导航被触发。
在失活的组件里调用 beforeRouteLeave
守卫。
调用全局的 beforeEach
守卫。
在重用的组件里调用 beforeRouteUpdate
守卫 (2.2+)。
在路由配置里调用 beforeEnter
。
解析异步路由组件。
在被激活的组件里调用 beforeRouteEnter
。
调用全局的 beforeResolve
守卫 (2.5+)。
导航被确认。
调用全局的 afterEach
钩子。
触发 DOM 更新。
调用 beforeRouteEnter
守卫中传给 next
제공되는 내비게이션 가드는 주로 점프나 취소로 내비게이션을 보호하는 데 사용됩니다. 경로 탐색 프로세스를 구축할 수 있는 기회는 여러 가지가 있습니다. 전역적으로, 단일 경로에 대해 단독으로 또는 구성 요소 수준에서 말이죠.
1. 글로벌 프론트 가드----router.beforeEach
router.beforeEach
🎜 글로벌 프론트 가드 등록: 🎜rrreee🎜샘플 코드: 🎜rrreeerouter.afterEach
🎜 전역 포스트 후크 등록: 🎜🎜 전역 포스트 후크도 등록할 수 있지만 가드와 달리 이러한 후크는 next 함수는 탐색 자체를 변경하지 않습니다: 🎜rrreeerouter.beforeResolve
를 사용하여 글로벌 가드를 등록할 수 있습니다. 이는 router.beforeEach
와 유사합니다. 차이점은 탐색이 확인되기 전에 가드가 모든 구성 요소에 동시에 있고 비동기 라우팅 구성 요소가 구문 분석된 후에 구문 분석 가드가 호출된다는 것입니다. 🎜beforeEnter
가드를 직접 정의할 수 있습니다: 🎜rrreeebeforeRouteEnter
🎜beforeRouteUpdate
(2.2 신규 추가 )🎜beforeRouteLeave
🎜🎜rrreeebeforeRouteLeave
가드를 호출하세요. 🎜🎜beforeEach
가드를 호출하세요. 🎜🎜beforeRouteUpdate
가드(2.2+)를 호출하세요. 🎜🎜beforeEnter
를 호출하세요. 🎜🎜beforeRouteEnter
를 호출하세요. 🎜🎜beforeResolve
가드(2.5+)를 호출합니다. 🎜🎜afterEach
후크를 호출하세요. 🎜🎜beforeRouteEnter
가드에서 next
에 전달된 콜백 함수를 호출하면 생성된 구성 요소 인스턴스가 콜백 함수의 매개 변수로 전달됩니다. 🎜🎜🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 소개🎜를 방문하세요! ! 🎜위 내용은 Vue-Router의 탐색 후크에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!