首頁  >  文章  >  web前端  >  Vue路由鉤子及應用場景的實例詳解

Vue路由鉤子及應用場景的實例詳解

小云云
小云云原創
2017-12-26 13:38:481788瀏覽

本文主要介紹了詳解Vue路由鉤子及應用場景(小結),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。

F. 路由鉤子語法

在vue-router的官方文件中, 將路由鉤子翻譯為導航守衛, 下面是文檔中的內容摘要, 大家也可以透過傳送門前往官網閱讀詳細內容

路由鉤子

路由鉤子主要是給使用者在路由發生變化時進行一些特殊的處理而定義的,靠。 。好拗口啊。

總體來講vue裡面提供了三大類鉤子

#1、全域鉤子
2、某個路由獨享的鉤子
3、元件內鉤子

三種路由鉤子中都涉及到了三個參數,這裡直接上官方介紹吧

to: Route: 即將要進入的目標路由物件
from: Route: 目前導覽正要離開的路由
next: Function: 一定要呼叫該方法來resolve 這個鉤子。執行效果依賴 next 方法的呼叫參數。
next(): 進行管道中的下一個鉤子。如果全部鉤子執行完了,則導航的狀態就是 confirmed (確認的)。
next(false): 中斷目前的導航。如果瀏覽器的 URL 改變了(可能是使用者手動或瀏覽器後退按鈕),那麼 URL 位址會重設到 from 路由對應的位址。
next(‘/') 或 next({ path: ‘/' }): 跳到一個不同的位址。目前的導航被中斷,然後進行一個新的導航。

(一).全域守衛(全域路由鉤子)

你可以使用router.beforeEach 註冊一個全域前置守衛:

const router = new VueRouter({ ... })

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

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

  1. to: Route: 即將要進入的目標路由物件

  2. from: Route: 目前導覽正要離開的路由

  3. next: Function: 一定要呼叫該方法來resolve 這個鉤子。執行效果依賴next 方法的呼叫參數

注意:使用全域路由鉤子, 一定要呼叫next()!!!

##(二).路由獨享的守衛(路由內鉤子)

你可以在路由配置上直接定義beforeEnter 守衛:

const router = new VueRouter({
 routes: [
  {
   path: '/foo',
   component: Foo,
   beforeEnter: (to, from, next) => {
    // ...
   }
  }
 ]
})
這些守衛與全域前置守衛的方法參數是一樣的。

(三). 元件內的守衛(元件內鉤子)

最後, 你可以在路由元件中直接定義一下路由導航守衛:

  1. beforeRouteEnter

  2. beforeRouteUpdate (2.2 新增)

  3. beforeRouteLeave

  4. 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, 使用場景分別為一下三類情況:

(一) 清除目前元件中的定時器

當一個元件中有一個定時器時, 在路由進行切換的時候, 可使用beforeRouteLeave將定時器進行清楚, 以免佔用內存:

beforeRouteLeave (to, from, next) {
 window.clearInterval(this.timer) //清楚定时器
 next()
}
(二) 當頁面中有未關閉的視窗, 或未儲存的內容時, 阻止頁面跳轉

#如果頁面內有重要的資訊需要使用者儲存後才能進行跳轉, 或有彈出框的情況. 應該阻止用戶跳轉

 beforeRouteLeave (to, from, next) {
 //判断是否弹出框的状态和保存信息与否
 if (this.dialogVisibility === true) {
  this.dialogVisibility = false //关闭弹出框
  next(false) //回到当前页面, 阻止页面跳转
 }else if(this.saveMessage === false) {
  alert('请保存信息后退出!') //弹出警告
  next(false) //回到当前页面, 阻止页面跳转
 }else {
  next() //否则允许跳转
 }
}
(三) 保存相關內容到Vuex中或Session中

當用戶需要關閉頁面時, 可以將公用的資訊儲存到session或Vuex中

 beforeRouteLeave (to, from, next) {
  localStorage.setItem(name, content); //保存到localStorage中
  next()
}
相關建議:


詳解vue-router路由與頁間導航

vue登入路由驗證的實作方法

詳解vue中路由驗證與對應攔截使用方法

以上是Vue路由鉤子及應用場景的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn