电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解vue-router的導航鉤子(導航守衛)

瀏覽:12日期:2022-11-07 08:20:34

在做vue項目的時候,要求用戶在頁面訪問前先登錄,或在離開頁面前發出提醒。vue官方提供的路由管理器 vue-router 提供的導航鉤子,通過跳轉或取消的方式守衛導航。以下總結了路由鉤子函數的使用方法和一些使用場景。

一、全局守衛

router.beforeEach 路由改變前的鉤子

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

其中:

to:將要訪問的路徑 from:代表從哪個路徑跳轉來的 next:是一個函數,表示放行。有如下幾種調用方式 next():如果一起正常,則調用該方法進入下一個鉤子; next(false):中斷當前導航,即路由地址不發生變化; next(’/xxx’) 或 next({path: ’/xxx’}):強制跳轉到指定路徑; next(error):如果傳入的是一個Error實例,則導航會被中斷且該錯誤會被傳遞給 router.onError() 注冊過的回調。

使用:

使用該函數,一定要調用 next(),否則鉤子函數不能 resolve;

該方法比較常用于:驗證用戶訪問權限。

比如:一個系統需要先驗證用戶是否登錄,如果登錄了就可以訪問,否則直接跳轉到登錄頁面。具體實現如下:

import Vue from ’vue’import VueRouter from ’vue-router’import { getToken } from ’@Utils/session.utils’ // 登錄用戶的tokenimport Login from ’../pages/Login.vue’ //引入登錄頁const Home = () => import(’../pages/Home.vue’) //引入首頁Vue.use(VueRouter) // 全局注入router// 配置路由參數const routes = [ { path: ’/login’, name: ’login’, component: Login }, { path: ’/home’, name: ’home’, component: Home }]const router = new VueRouter({ routes})// 全局掛載路由導航守衛:驗證用戶是否登錄router.beforeEach((to, from, next) => { if (to.name !== ’login’ && !getToken()) next(’/login’) // 如果用戶不是訪問登錄頁且沒有登錄,則強制跳轉到登錄頁 else next()})export default router

router.beforeResolve 在導航被確認之前,同時在所有組件內守衛和異步路由組件被解析之后,該鉤子函數就被調用。該方法我在項目中暫時還未使用到,具體使用場景歡迎大家補充 :)

router.afterEach 路由改變后的鉤子

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

該方法同全局前置守衛 router.beforeEach 不同的是少了 next() 函數,也不會改變導航本身。

使用場景:

路由切換,將頁面的滾動位置返回到頂部。

例如:一個頁面比較長,當滾動到某個位置后切換路由,這時跳轉的頁面滾動條位置默認是前一個頁面離開時停留的位置,可以通過該鉤子函數將滾動條位置重置。

// 切換路由,頁面返回到頂部router.afterEach((to, from) => { window.scrollTo(0, 0)})

二、路由獨享的守衛

beforeEnter 對某個路由的單獨守衛,在路由配置上直接定義

const routes = [ { path: ’/login’, name: ’login’, component: Login }, { path: ’/home’, name: ’home’, component: Home, beforeEnter: (to, from, next) => { ... ... } }]const router = new VueRouter({ routes})

使用:

該方法的參數使用同全局前置守衛 router.beforeEach 是一樣的;例如:根據登錄用戶的不同角色,展示不同的模塊;或者給指定路由組件單獨添加動畫。

import Vue from ’vue’import VueRouter from ’vue-router’import { getUserRole } from ’@Utils/session.utils’ // 登錄用戶的角色const UserCenter = () => import(’../pages/UserCenter.vue’)const routes = [ ... ... { path: ’/usercenter’, name: ’usercenter’, component: UserCenter, beforeEnter: (to, from, next) => { if(getUserRole() === ’admin’) next(’/admincenter’) else next() } }]

三、組件內的守衛

beforeRouteEnter(to, from, next) 在進入當前組件對應的路由前調用

export default { data() { ... }, beforeRouteEnter(to, from, next) { ... ... }}

注意:

該函數內不能訪問當前組件實例 this,因為函數在對應路由被 comfirm 前調用,此時將要渲染的組件實例還沒被創建;

可以通過給 next 傳遞一個回調來訪問組件實例,即把組件實例 vm 作為回調方法的參數;該回調的執行在 mounted 后面;

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

beforeRouteEnter 是支持給 next 傳遞回調的唯一守衛。

使用場景:

例如:從一個列表頁進入到詳情頁,然后再返回到列表頁,要求保留離開列表頁之前訪問的數據及滾動位置,從其他頁面重新進入列表頁,獲取最新的數據。具體實現請點這里beforeRouteUpdate(to, from, next) 在當前路由改變,但是該組件被復用時調用

beforeRouteUpdate (to, from, next) { ... ...}

注:

該函數內可以訪問當前組件實例 this

例如:在一個帶有動態參數的路徑 /detail/:id,在 /detail/aaa 和 /detail/bbb 之間跳轉的時候,因為兩個路由渲染的是同個 Detail 組件,因此原來的組件實例會被復用(比起銷毀再創建,復用則會更加高效),在這種情況下這個鉤子會被調用,而組件的生命周期鉤子不會再被調用。

beforeRouteLeave(to, from, next) 在離開當前組件對應的路由前調用

beforeRouteLeave (to, from, next) { ... ...}

注:

該函數內可以訪問當前組件實例 this; 比如:用戶在當前頁面有還未保存的內容時突然離開,阻止頁面跳轉并給出提示,或者在用戶離開時清除或存儲一些信息等。

四、完整的導航解析流程

導航被觸發; 在失活的組件里調用 beforeRouteLeave 守衛; 調用全局的 beforeEach 守衛; 在重用的組件里調用 beforeRouteUpdate 守衛 (2.2+); 在路由配置里調用 beforeEnter; 解析異步路由組件; 在被激活的組件里調用 beforeRouteEnter; 調用全局的 beforeResolve 守衛 (2.5+); 導航被確認; 調用全局的 afterEach 鉤子; 觸發 DOM 更新; 調用 beforeRouteEnter 守衛中傳給 next 的回調函數,創建好的組件實例會作為回調函數的參數傳入。

其實常用的也就那么幾個,理解了其用法,路由導航的解析流程也就明了了。

五、附:使用 watch 監測路由變化

除了使用鉤子函數外,我們也可以使用 watch 來監聽 $route 對象,然后根據路由參數的變化來進行響應。

<template> <div id=``'app'``> <keep-alive> <router-view/> </keep-alive> </div></template><script> export default { name: ’App’, watch: { ’$route’ (to, from) { // 對路由變化作出響應... } } }</script>

到此這篇關于詳解vue-router的導航鉤子(導航守衛)的文章就介紹到這了,更多相關vue-router 導航鉤子內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
主站蜘蛛池模板: 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 安徽成考网-安徽成人高考网| 香港新时代国际美容美发化妆美甲培训学校-26年培训经验,值得信赖! | 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 斗式提升机_链式斗提机_带式斗提机厂家无锡市鸿诚输送机械有限公司 | 拉力机-拉力试验机-万能试验机-电子拉力机-拉伸试验机-剥离强度试验机-苏州皖仪实验仪器有限公司 | 粘度计NDJ-5S,粘度计NDJ-8S,越平水分测定仪-上海右一仪器有限公司 | 玉米深加工设备-玉米深加工机械-新型玉米工机械生产厂家-河南粮院机械制造有限公司 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 北京浩云律师事务所-法律顾问_企业法务_律师顾问_公司顾问 | 河南凯邦机械制造有限公司| 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | HEYL硬度计量泵-荧光法在线溶解氧仪-净时测控技术(上海)有限公司 | 不干胶标签,不干胶标签纸_厂家-山东同力胶粘制品 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 山东彩钢板房,山东彩钢活动房,临沂彩钢房-临沂市贵通钢结构工程有限公司 | 苏州柯瑞德货架-仓库自动化改造解决方案 | 贵州自考_贵州自学考试网| 鹤壁创新仪器公司-全自动量热仪,定硫仪,煤炭测硫仪,灰熔点测定仪,快速自动测氢仪,工业分析仪,煤质化验仪器 | 卫生型双针压力表-高温防腐差压表-安徽康泰电气有限公司 | 别墅图纸超市|别墅设计图纸|农村房屋设计图|农村自建房|别墅设计图纸及效果图大全 | 食品级焦亚硫酸钠_工业级焦亚硫酸钠_焦亚硫酸钠-潍坊邦华化工有限公司 | 厌氧反应器,IC厌氧反应器,厌氧三相分离器-山东创博环保科技有限公司 | 电动高压冲洗车_价格-江苏速利达机车有限公司 | uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 潍坊大集网-潍坊信息港-潍坊信息网 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 电渗析,废酸回收,双极膜-山东天维膜技术有限公司 | 低浓度恒温恒湿称量系统,强光光照培养箱-上海三腾仪器有限公司 | 生态板-实木生态板-生态板厂家-源木原作生态板品牌-深圳市方舟木业有限公司 | 破碎机_上海破碎机_破碎机设备_破碎机厂家-上海山卓重工机械有限公司 | 新疆乌鲁木齐网站建设-乌鲁木齐网站制作设计-新疆远璨网络 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 合肥花魁情感婚姻咨询中心_挽回爱情_修复婚姻_恋爱指南 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 诚暄电子公司首页-线路板打样,pcb线路板打样加工制作厂家 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 |