日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > vue >内容正文

vue

“约见”面试官系列之常见面试题第三十一篇之vue-router得守卫(建议收藏)

發布時間:2023/12/10 vue 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “约见”面试官系列之常见面试题第三十一篇之vue-router得守卫(建议收藏) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

全局前置守衛

#全局解析守衛

#全局后置鉤子

#路由獨享的守衛

#組件內的守衛

#完整的導航解析流程


全局前置守衛

你可以使用?router.beforeEach?注冊一個全局前置守衛:

const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {// ... })

當一個導航觸發時,全局前置守衛按照創建順序調用。守衛是異步解析執行,此時導航在所有守衛 resolve 完之前一直處于?等待中

每個守衛方法接收三個參數:

  • to: Route: 即將要進入的目標?路由對象

  • from: Route: 當前導航正要離開的路由

  • next: Function: 一定要調用該方法來?resolve?這個鉤子。執行效果依賴?next?方法的調用參數。

    • next(): 進行管道中的下一個鉤子。如果全部鉤子執行完了,則導航的狀態就是?confirmed?(確認的)。

    • next(false): 中斷當前的導航。如果瀏覽器的 URL 改變了 (可能是用戶手動或者瀏覽器后退按鈕),那么 URL 地址會重置到?from?路由對應的地址。

    • next('/')?或者?next({ path: '/' }): 跳轉到一個不同的地址。當前的導航被中斷,然后進行一個新的導航。你可以向?next?傳遞任意位置對象,且允許設置諸如?replace: true、name: 'home'?之類的選項以及任何用在?router-link?的?to?prop?或?router.push?中的選項。

    • next(error): (2.4.0+) 如果傳入?next?的參數是一個?Error?實例,則導航會被終止且該錯誤會被傳遞給?router.onError()?注冊過的回調。

**確保?next?函數在任何給定的導航守衛中都被嚴格調用一次。它可以出現多于一次,但是只能在所有的邏輯路徑都不重疊的情況下,否則鉤子永遠都不會被解析或報錯。**這里有一個在用戶未能驗證身份時重定向到?/login?的示例:

// BAD router.beforeEach((to, from, next) => {if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })// 如果用戶未能驗證身份,則 `next` 會被調用兩次next() }) // GOOD router.beforeEach((to, from, next) => {if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })else next() })

#全局解析守衛

2.5.0 新增

在 2.5.0+ 你可以用?router.beforeResolve?注冊一個全局守衛。這和?router.beforeEach?類似,區別是在導航被確認之前,同時在所有組件內守衛和異步路由組件被解析之后,解析守衛就被調用。

#全局后置鉤子

你也可以注冊全局后置鉤子,然而和守衛不同的是,這些鉤子不會接受?next?函數也不會改變導航本身:

router.afterEach((to, from) => {// ... })

#路由獨享的守衛

你可以在路由配置上直接定義?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`} }

beforeRouteEnter?守衛?不能?訪問?this,因為守衛在導航確認前被調用,因此即將登場的新組件還沒被創建。

不過,你可以通過傳一個回調給?next來訪問組件實例。在導航被確認的時候執行回調,并且把組件實例作為回調方法的參數。

beforeRouteEnter (to, from, next) {next(vm => {// 通過 `vm` 訪問組件實例}) }

注意?beforeRouteEnter?是支持給?next?傳遞回調的唯一守衛。對于?beforeRouteUpdate?和?beforeRouteLeave?來說,this?已經可用了,所以不支持傳遞回調,因為沒有必要了。

beforeRouteUpdate (to, from, next) {// just use `this`this.name = to.params.namenext() }

這個離開守衛通常用來禁止用戶在還未保存修改前突然離開。該導航可以通過?next(false)?來取消。

beforeRouteLeave (to, from, next) {const answer = window.confirm('Do you really want to leave? you have unsaved changes!')if (answer) {next()} else {next(false)} }

#完整的導航解析流程

  • 導航被觸發。
  • 在失活的組件里調用?beforeRouteLeave?守衛。
  • 調用全局的?beforeEach?守衛。
  • 在重用的組件里調用?beforeRouteUpdate?守衛 (2.2+)。
  • 在路由配置里調用?beforeEnter。
  • 解析異步路由組件。
  • 在被激活的組件里調用?beforeRouteEnter。
  • 調用全局的?beforeResolve?守衛 (2.5+)。
  • 導航被確認。
  • 調用全局的?afterEach?鉤子。
  • 觸發 DOM 更新。
  • 用創建好的實例調用?beforeRouteEnter?守衛中傳給?next?的回調函數。
  • 本面試題為前端常考面試題,后續有機會繼續完善。我是歌謠,一個沉迷于故事的講述者。

    歡迎一起私信交流。

    “睡服“面試官系列之各系列目錄匯總(建議學習收藏)?

  • 總結

    以上是生活随笔為你收集整理的“约见”面试官系列之常见面试题第三十一篇之vue-router得守卫(建议收藏)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。