快速掌握Vue Router使用方法
本篇博客會(huì)介紹Vue中的VueRouter的基本使用,編程式路由導(dǎo)航增加了我們進(jìn)行路由跳轉(zhuǎn)的靈活性,緩存路由組件保障了我們使用路由時(shí)的便捷性,生命周期鉤子為我們切入切出路由時(shí)提供了初始化與善后的工作,路由守衛(wèi)保障了我們路由組件的安全性,路由工作模式會(huì)使我們理解為啥Vue項(xiàng)目中的路由會(huì)有一個(gè)#,通過(guò)本篇博客會(huì)讓大家快速掌握Vue中路由的基本使用。
一、編程式路由導(dǎo)航
作用:不借助<router-link>
實(shí)現(xiàn)路由跳轉(zhuǎn),讓路由跳轉(zhuǎn)更加靈活
具體編碼:
//$router的兩個(gè)API this.$router.push({ name:'xiangqing', params:{ id:xxx, title:xxx } }) this.$router.replace({ name:'xiangqing', params:{ id:xxx, title:xxx } }) this.$router.forward() //前進(jìn) this.$router.back() //后退 this.$router.go() //可前進(jìn)也可后退
二、緩存路由組件
在上一篇博客中也提到過(guò),路由對(duì)應(yīng)的組件隨著路由的切換來(lái)而被激活,隨著路由的切換走而失活被銷(xiāo)毀,在我們使用WebApp的時(shí)候當(dāng)然不希望這樣的事情發(fā)生,我們希望即使有路由的切換,也要保持原有的組件不被銷(xiāo)毀。而緩存路由組件技術(shù)就可以完美的解決這個(gè)問(wèn)題,只是在實(shí)現(xiàn)這一功能是會(huì)以一定的程序效率作為代價(jià)。下面咱們一起看一看如何實(shí)現(xiàn)路由對(duì)應(yīng)組件的?;睢J褂玫降臉?biāo)簽是<keep-alive include="News"> </keep-alive>
。
作用:讓不展示的路由組件保持掛載,不被銷(xiāo)毀。
具體編碼:
<keep-alive include="News"> <router-view></router-view> </keep-alive>
三、兩個(gè)新的聲明周期鉤子
作用:路由組件所獨(dú)有的兩個(gè)鉤子,用于捕獲路由組件的激活狀態(tài)。
具體名字:
activated
路由組件被激活時(shí)觸發(fā)。deactivated
路由組件失活時(shí)觸發(fā)。
<template> <ul> <li :style="{opacity}">歡迎學(xué)習(xí)Vue</li> <li v-for="p in messageList" :key="p.id">{{p.title}} <input type="text"></li> </ul> </template> <script> export default { // eslint-disable-next-line vue/multi-word-component-names name: "News", props:['id','title'], data() { return { messageList: [ { id: "001", title: "消息001" }, { id: "002", title: "消息002" }, { id: "003", title: "消息003" }, ], opacity:1 }; }, activated() { // 開(kāi)啟一個(gè)定時(shí)器,調(diào)整組件透明度 console.log('News組件被激活了') this.timer = setInterval(() => { console.log('@') this.opacity -= 0.01 if(this.opacity <= 0) this.opacity = 1 },16) }, deactivated() { //關(guān)閉定時(shí)器 console.log('News組件失活了') clearInterval(this.timer) }, }; </script> <style> </style>
四、路由守衛(wèi)
路由守衛(wèi)中可以進(jìn)行頁(yè)面權(quán)限的驗(yàn)證,沒(méi)有權(quán)限就沒(méi)有辦法進(jìn)入到相應(yīng)的頁(yè)面之中。
作用:對(duì)路由進(jìn)行權(quán)限控制
分類(lèi):全局守衛(wèi)、獨(dú)享守衛(wèi)、組件內(nèi)守衛(wèi)
全局守衛(wèi)(所有組件間路由跳轉(zhuǎn)時(shí)都需要經(jīng)過(guò)這兩個(gè)守衛(wèi)):
//全局前置守衛(wèi):初始化時(shí)執(zhí)行、每次路由切換前執(zhí)行 router.beforeEach((to,from,next)=>{ console.log('beforeEach',to,from) if(to.meta.isAuth){ //判斷當(dāng)前路由是否需要進(jìn)行權(quán)限控制 if(localStorage.getItem('school') === 'atguigu'){ //權(quán)限控制的具體規(guī)則 next() //放行 }else{ alert('暫無(wú)權(quán)限查看') // next({name:'guanyu'}) } }else{ next() //放行 } }) //全局后置守衛(wèi):初始化時(shí)執(zhí)行、每次路由切換后執(zhí)行 router.afterEach((to,from)=>{ console.log('afterEach',to,from) if(to.meta.title){ document.title = to.meta.title //修改網(wǎng)頁(yè)的title }else{ document.title = 'vue_test' } })
上述兩個(gè)函數(shù),參數(shù)中都有from 與to,這兩個(gè)是路由守衛(wèi)中超級(jí)重要的角色,權(quán)限驗(yàn)證一般都有參照這兩個(gè)參數(shù)進(jìn)行。
除此之外前置守衛(wèi)還有一個(gè)next參數(shù),這個(gè)參數(shù)負(fù)責(zé)放行??煽偨Y(jié)如下:
from:
原始路由的一些基本信息to:
將要跳轉(zhuǎn)的路由基本信息next:
如果不傳參數(shù)為放行,就是跳轉(zhuǎn)到to指定的路由,如果傳參就跳轉(zhuǎn)到參數(shù)指定的路由next(“/login”)
4.獨(dú)享守衛(wèi):這種守衛(wèi)方式只針對(duì)包含特定屬性的路由起作用例如下面一個(gè)例子,前置路由守衛(wèi),只有要跳轉(zhuǎn)的路由中的屬性isAuth為true時(shí)才進(jìn)入判斷其他條件,否則會(huì)直接放行。通常我們會(huì)將用到的屬性在路由配置里定義在meta中。
{ name:"aboutroot", path:"/about", component:About, meta:{ isTrue:true } },
beforeEnter(to,from,next){ console.log('beforeEnter',to,from) if(to.meta.isAuth){ //判斷當(dāng)前路由是否需要進(jìn)行權(quán)限控制 if(localStorage.getItem('school') === 'atguigu'){ next() }else{ alert('暫無(wú)權(quán)限查看') // next({name:'guanyu'}) } }else{ next() } }
當(dāng)然除了可以在meta中進(jìn)行權(quán)限區(qū)分屬性的定義,還可以做一些全局的配置,例如跳轉(zhuǎn)路由之后的頁(yè)面頁(yè)簽。
{ name:"aboutroot", path:"/about", component:About, meta:{ isTrue:true title:"About組件" } },
使用:
這時(shí)當(dāng)進(jìn)入about組件時(shí),就會(huì)顯示頁(yè)簽為About組件,為了防止出錯(cuò),我們做一些特殊處理以下代碼在路由沒(méi)有meta.title屬性是會(huì)顯示默認(rèn)頁(yè)簽在頁(yè)面的頁(yè)簽上。
router.afterEach((to,from)=>{ console.log(to,from) document.title=to.meta.title || "默認(rèn)頁(yè)簽" })
效果如下面兩個(gè)圖片。
5.組件內(nèi)守衛(wèi)
下面兩個(gè)路由執(zhí)行的時(shí)間是在進(jìn)入相應(yīng)路由之前執(zhí)行以及離開(kāi)這個(gè)路由之前執(zhí)行,可以進(jìn)行鑒權(quán)。
//進(jìn)入守衛(wèi):通過(guò)路由規(guī)則,進(jìn)入該組件時(shí)被調(diào)用 beforeRouteEnter (to, from, next) { }, //離開(kāi)守衛(wèi):通過(guò)路由規(guī)則,離開(kāi)該組件時(shí)被調(diào)用 beforeRouteLeave (to, from, next) { }
下面一個(gè)實(shí)例表示在進(jìn)入這個(gè)組件時(shí)先判斷這個(gè)組間有沒(méi)有isTrue屬性,然后判斷本地存儲(chǔ)的學(xué)校是不是nylg,只有經(jīng)過(guò)兩層驗(yàn)證之后才可以進(jìn)入該組件,否則將提示進(jìn)不去。
<template> <div class="col-xs-6"> <div class="panel"> <div class="panel-body"> <h2>我是About的內(nèi)容</h2> </div> </div> </div> </template> <script> export default { // eslint-disable-next-line vue/multi-word-component-names name: "About", beforeRouteEnter(to,from,next){ // alert("想要進(jìn)入組件!") if(to.meta.isTrue){ if(localStorage.getItem("school")==="nylg"){ next() }else{ alert("您無(wú)權(quán)進(jìn)入!") } }else{ alert("組件不允許進(jìn)入!") } }, //通過(guò)路由規(guī)則,離開(kāi)該組件時(shí)被調(diào)用 beforeRouteLeave (to, from, next) { console.log('About--beforeRouteLeave',to,from) next() } }; </script> <style> </style>
五、路由器的兩種工作模式
對(duì)于一個(gè)url來(lái)說(shuō),什么是hash值?—— #及其后面的內(nèi)容就是hash值。
hash值不會(huì)包含在 HTTP 請(qǐng)求中,即:hash值不會(huì)帶給服務(wù)器。
hash模式:
- 地址中永遠(yuǎn)帶著#號(hào),不美觀(guān) 。
- 若以后將地址通過(guò)第三方手機(jī)app分享,若app校驗(yàn)嚴(yán)格,則地址會(huì)被標(biāo)記為不合法。
- 兼容性較好。
history模式:
- 地址干凈,美觀(guān) 。
- 兼容性和hash模式相比略差。
- 應(yīng)用部署上線(xiàn)時(shí)需要后端人員支持,解決刷新頁(yè)面服務(wù)端404的問(wèn)題。
進(jìn)行history配置會(huì)很麻煩,而且使用Vue時(shí)語(yǔ)法上要有一些改變,所以如果不是大型公司或者大型項(xiàng)目使用hash模式即可。感興趣的同學(xué)也可以自己探索history模式。
到此這篇關(guān)于快速掌握Vue Router使用方法的文章就介紹到這了,更多相關(guān)Vue Router內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解unplugin?vue?components不能識(shí)別組件自動(dòng)導(dǎo)入類(lèi)型pnpm
這篇文章主要為大家介紹了unplugin?vue?components不能識(shí)別組件自動(dòng)導(dǎo)入類(lèi)型pnpm詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01vue通過(guò)過(guò)濾器實(shí)現(xiàn)數(shù)據(jù)格式化
這篇文章主要介紹了vue通過(guò)過(guò)濾器實(shí)現(xiàn)數(shù)據(jù)格式化的方法,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-073分鐘帶你快速認(rèn)識(shí)Vue3中的v-model
model在vue里面實(shí)現(xiàn)雙向綁定,通過(guò)父節(jié)點(diǎn)向子節(jié)點(diǎn)傳遞參數(shù),子節(jié)點(diǎn)通過(guò)操作再回傳給父節(jié)點(diǎn)的變量,有點(diǎn)像prop和$emit組合使用,下面這篇文章主要給大家介紹了關(guān)于Vue3中v-model的相關(guān)資料,需要的朋友可以參考下2022-11-11在Vue中用canvas實(shí)現(xiàn)二維碼和圖片合成海報(bào)的方法
這篇文章主要介紹了在Vue中用canvas實(shí)現(xiàn)二維碼和圖片合成海報(bào)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06VueJs與ReactJS和AngularJS的異同點(diǎn)
這篇文章主要為大家詳細(xì)介紹了VueJs與ReactJS和AngularJS的異同點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Vue項(xiàng)目中CSS?Modules和Scoped?CSS的介紹與區(qū)別
在vue中我們有兩種方式可以定義css作用域,一種是scoped,另一種就是css modules,下面這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中CSS?Modules和Scoped?CSS的相關(guān)資料,需要的朋友可以參考下2022-03-03vue3 axios 實(shí)現(xiàn)自動(dòng)化api配置詳解
這篇文章主要為大家介紹了vue3 axios 實(shí)現(xiàn)自動(dòng)化api配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09如何使用yarn創(chuàng)建vite項(xiàng)目+vue3
這篇文章主要介紹了如何使用yarn創(chuàng)建vite項(xiàng)目+vue3,詳細(xì)介紹了使用vite創(chuàng)建vue3過(guò)程,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-03-03vue3?setup語(yǔ)法糖中獲取slot插槽的dom對(duì)象代碼示例
slot元素是一個(gè)插槽出口,標(biāo)示了父元素提供的插槽內(nèi)容將在哪里被渲染,這篇文章主要給大家介紹了關(guān)于vue3?setup語(yǔ)法糖中獲取slot插槽的dom對(duì)象的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04