有7個鉤子:1、beforeEach;2、beforeResolve;3、afterEach;4、beforeEnter;5、beforeRouteEnter;6、beforeRouteUpdate;7、beforeRouteLeave。
本教學操作環境:windows7系統、vue2.9.6版,DELL G3電腦。
vue-router
有幾個鉤子函數?具體是什麼及執行流程是怎樣的?
先上心智圖。
分析
vue-router
的鉤子函數 ,其實說的就是導航守衛 。
引用官網的話
「導航」 表示路由正在改變。
vue-router
提供的導航守衛主要用來透過跳轉 或取消 的方式守衛導航 。有多種機會植入路由導航過程中:全局的, 單一路由獨享的, 或組件級的。
也就是:全域守衛、路由守衛、元件守衛。
程式碼示範環境建構
先簡單搭建環境
index.js
/* * @Description:一尾流莺 * @Date: 2021-03-21 16:17:56 * @LastEditTime: 2021-07-18 15:14:42 * @FilePath: \vite-project-js\src\router\index.js */ import { createRouter, createWebHashHistory } from 'vue-router'; const router = createRouter({ history: createWebHashHistory(), routes: [ { path: '/a', component: () => import('../components/A.vue'), }, { path: '/b', component: () => import('../components/B.vue'), }, { path: '/c', component: () => import('../components/C.vue'), }, ], }); export default router;
main .js
// index.js import router from "./router"; createApp(App).use(router).mount("#app");
頁面A
<template> <div> <h1 id="我是页面A啊">我是页面A啊</h1> <comp></comp> </div> </template>
頁面B
<template> <div> <h1 id="我是页面B啊">我是页面B啊</h1> <comp></comp> </div> </template>
頁面C
<template> <div> <h1 id="我是页面C啊">我是页面C啊</h1> <comp></comp> </div> </template>
通用元件
<template> <div>我是公用组件啊</div> </template>
目前頁面是這樣的,有點醜,湊活看吧,咱也不是來學css
的
全域守衛
顧名思義,是要定義在全域的,也就是我們index.js
中的router
物件。
beforeEach
全域前置守衛,在路由跳轉前觸發,它在每次導航 時都會觸發。
透過 router.beforeEach
註冊一個全域前守衛。
參數
beforeEach
全域前置守衛接收三個參數
- to : Route: 即將進入的目標路由物件
- from: Route: 目前導覽正要離開的路由物件
- next: Function: 一定要呼叫該方法不然會阻塞路由。
注意: next
參數可以不添加,但是一旦添加,則必須呼叫一次,否則路由跳轉等會停止。
next()
方法的幾種情況
- #next(): 進行管道中的下一個鉤子。
-
next(false): 中斷目前的導航。回到
from
路由對應的位址。 -
next('/') 或next({ path: '/' }): 跳到一個不同的位址,可傳遞的參數與
router.push
中選項一致。 -
next(error): 導覽終止,且該錯誤會傳遞至
router.onError()
註冊過的回呼。
我們把前兩個參數印出來看一下,裡麵包含路徑,參數,元資訊等內容。
傳回值
- #false:取消目前的導航。
- null,undefined,true或直接return:呼叫下一個導航守衛。
定義多個守衛
全域前置守衛可以定義多個,根據建立順序呼叫。在所有守衛完成之前導航一直處於等待中。
下面這個例子我們就定義了兩個 beforeEach
全域前置守衛。可以看到,只有在兩秒以後分別列印出兩個日誌後才進行頁面的跳躍。
除了beforeEach
全域前置守衛之外,其他的全域守衛都可以定義多個,並且在所有守衛完成之前導航一直處於等待中,其他的鉤子函數就不進行演示了。
beforeResolve
全域解析守衛,在路由跳轉前,所有元件內守衛 和異步路由元件 被解析之後觸發,它同樣在每次導航 時都會觸發。
透過 router.beforeResolve
註冊一個全域解析守衛。
router.beforeResolve((to, from, next) => { next(); })
回调参数,返回值和 beforeEach
一样。也可以定义多个全局解析守卫。
afterEach
全局后置钩子,它发生在路由跳转完成后,beforeEach
和 beforeResolve
之后,beforeRouteEnter
(组件内守卫)之前。它同样在 每次导航 时都会触发。
通过 router.afterEach
注册一个全局后置钩子。
这个钩子的两个参数和 beforeEach
中的 to
和 from
一样。然而和其它全局钩子不同的是,这些钩子不会接受 next
函数,也不会改变导航本身。
路由守卫
顾名思义,就是跟路由相关的钩子,我们的路由守卫只有一个,就是 beforeEnter
。
beforeEnter
需要在路由配置上定义 beforeEnter
守卫,此守卫只在进入路由时触发,在 beforeEach
之后紧随执行,不会在 params
、query
或 hash
改变时触发。
beforeEnter
路由守卫的参数是 to
、from
、next
,同 beforeEach
一样。
组件守卫
顾名思义,是定义在路由组件内部的守卫。
beforeRouteEnter
路由进入组件之前调用,该钩子在全局守卫 beforeEach
和路由守卫 beforeEnter
之后,全局 beforeResolve
和全局 afterEach
之前调用。
参数包括 to
,from
,next
。
该守卫内访问不到组件的实例,也就是 this
为 undefined
,也就是他在 beforeCreate
生命周期前触发。
beforeRouteUpdate
对于 beforeRouteUpdate
来说,this
已经可用了,所以给 next
传递回调就没有必要了。
beforeRouteLeave
对于 beforeRouteLeave
来说,this
已经可用了,所以给 next
传递回调就没有必要了。
总结
完整的导航解析流程
导航被触发。
在失活的组件里调用
beforeRouteLeave
守卫。调用全局的
beforeEach
守卫。在重用的组件里调用
beforeRouteUpdate
守卫。在路由配置里调用
beforeEnter
。解析异步路由组件。
在被激活的组件里调用
beforeRouteEnter
。调用全局的
beforeResolve
守卫。导航被确认。
调用全局的
afterEach
钩子。触发
DOM
更新。调用
beforeRouteEnter
守卫中传给next
的回调函数,创建好的组件实例会作为回调函数的参数传入。
上面是官方给出的答案,现在我们用流程图来直观的展示一下。
【相关推荐:《vue.js教程》】
以上是vue-router有幾個鉤子的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Vue应用中遇到vue-router的错误“NavigationDuplicated:Avoidedredundantnavigationtocurrentlocation”–怎么解决?Vue.js作为快速而灵活的JavaScript框架在前端应用开发中越来越受欢迎。VueRouter是Vue.js的一个代码库,用于进行路由管理。然而,有时

在Vue应用中使用vue-router时,有时候会出现“Error:Avoidedredundantnavigationtocurrentlocation”的错误信息。这个错误信息的意思是“避免了到当前位置的冗余导航”,通常是因为重复点击了同一个链接或者使用了相同的路由路径导致的。那么,怎么解决这个问题呢?使用exact修饰符在定义router

Vue-Router:如何使用路由元信息来管理路由?简介:Vue-Router是Vue.js官方的路由管理器,它可以帮助我们快速构建单页应用程序(SPA)。除了常见的路由功能外,Vue-Router还支持使用路由元信息来管理和控制路由。路由元信息是可以附加到路由上的自定义属性,它可以帮助我们实现一些特殊的逻辑或者权限控制。一、什么是路由元信息?路由元信息是

在Vue应用中使用vue-router是一种常见的方式来实现路由控制。然而,在使用vue-router的时候,有时候会出现“Error:Failedtoresolveasynccomponent:xxx”的错误,这是由于异步组件加载错误导致的。在本文中,我们将探讨这个问题,并提供解决方案。理解异步组件加载原理在Vue中,组件可以被同步或异步地创建

Vue和Vue-Router:如何在组件之间共享数据?简介:Vue是一个流行的JavaScript框架,用于构建用户界面。Vue-Router是Vue的官方路由管理器,用于实现单页面应用。在Vue应用中,组件是构建用户界面的基本单位。在许多情况下,我们需要在不同的组件之间共享数据。本文将介绍一些方法,帮助你在Vue和Vue-Router中实现数据共享,以及

Vue是一个流行的前端框架,它允许开发者快速构建高效、可重用的web应用程序。Vue-router是Vue框架中的一个插件,可以帮助开发者轻松管理应用的路由和导航。但是,在使用Vue-router的过程中,有时候会遇到一个常见的错误:“Error:Invalidroutecomponent:xxx”。这篇文章将介绍这个错误的原因和解决方法。原因在Vu

最近我尝试在Vue应用中使用vue-router,但遇到了一个问题:“UncaughtTypeError:Cannotreadproperty'push'ofundefined”。这个问题的原因是什么,以及如何解决呢?首先,让我们了解一下vue-router。vue-router是Vue.js官方的路由管理插件,可以帮助我们构建单页应用(SPA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1
強大的PHP整合開發環境