??:如果事與愿違,那一定是上天另有安排
更多Vue知識請點擊——Vue.js
router-link的replace屬性
1.作用:控制路由跳轉(zhuǎn)時操作瀏覽器歷史記錄的模式
2.瀏覽器的歷史記錄有兩種寫入方式:分別為push
和replace
,push是追加歷史記錄,replace是替換當前記錄。路由跳轉(zhuǎn)時候默認為push
3.如何開啟replace模式:<router-link replace .......>News</router-link>
- 如果你用的是默認的push,你點擊進入到下一個路由的時候可以返回到上一個路由
- 如果你用的是replace,你點擊進入到下一個路由的時候,瀏覽器左上角不會有返回上一步
編程式路由導航
1、什么是編程式路由導航
不借助<router-link>
實現(xiàn)路由跳轉(zhuǎn),讓路由跳轉(zhuǎn)更加靈活,主要是用$router
的三個api push
,replace
,go(了解)
來實現(xiàn)路由跳轉(zhuǎn),push是默認帶緩存,replace是覆蓋緩存。
2、如何編碼
語法:
//$router的兩個API
this.$router.push({
name:'xiangqing',
params:{
id:xxx,
title:xxx
}
})
this.$router.replace({
name:'xiangqing',
params:{
id:xxx,
title:xxx
}
})
// 點了以后瀏覽器的前進后退操作
this.$router.forward() //前進
this.$router.back() //后退
this.$router.go() //可前進也可后退,5前進5步,-3后退3步
3、使用案例示例說明
不借助router-link
,可以實現(xiàn)往哪里跳轉(zhuǎn),什么時候跳轉(zhuǎn)(加定時器)
緩存路由組件
作用:讓不展示的路由組件保持掛載,不被銷毀(比如切換時要保留表單數(shù)據(jù))。
使用:在放router-view
標簽的地方,包邊包一個<keep-alive></keep-alive>
,不加include默認這里邊的組件都保持掛載,加include后邊跟要掛載的組件名字
// 緩存一個路由組件用 字符串
<keep-alive include="News">
<router-view></router-view>
</keep-alive>
// 緩存多個路由組件用 數(shù)組 (使用 `v-bind`)
<keep-alive :include="['News', 'Message']">
<router-view></router-view>
</keep-alive>
注意:
- 緩存里面的include里面的名字是組件名
- 在需要被緩存組件的外側(cè)包裹keep-alive!不要去被緩存組件的template里邊包!
如果像圖中<keep-alive include="News">
這么寫的話,切換到Message
時News
不會銷毀,但是從Message
切換到News
,Message
會銷毀。
兩個新的生命周期鉤子
我們之前學習了生命周期以及八個生命周期鉤子——點此復習生命周期
現(xiàn)在我們再學習路由組件獨有的兩個鉤子,用于捕獲路由組件的激活狀態(tài)。
還記得之前做的那個字體閃爍案例嗎?在這里再做一遍,寫在News組件里,循環(huán)變化透明度,但是你想離開這個選項卡時讓定時器停,就要走銷毀流程,但是News里面的input輸入框數(shù)據(jù)要保留,又不能被銷毀
這種情況就很尷尬了,如果想要實現(xiàn)組件出現(xiàn)時開啟定時器,組件切換時關閉定時器且保留數(shù)據(jù),就要使用兩個新的生命周期鉤子,是路由組件獨有的鉤子:
1、activated
:路由組件被激活時觸發(fā)(從沒有出現(xiàn)在你面前–>組件出現(xiàn)在你眼前)。 相當于mounted
2、deactivated
:路由組件失活時觸發(fā)。類似于beforeDestroy
<template>
<ul>
<li :style="{ opacity }">你好啊,小土豆</li>
<li>news001 <input type="text" /></li>
<li>news002 <input type="text" /></li>
<li>news003 <input type="text" /></li>
</ul>
</template>
<script>
export default {
name: 'News',
data() {
return {
a: false,
opacity: 1,
}
},
// mounted() {
// this.timer = setInterval(() => {
// this.opacity -= 0.01
// if (this.opacity <= 0) this.opacity = 1
// }, 16)
// },
// beforeDestroy() {
// console.log('News組件即將被銷毀');
// clearInterval(this.timer)
// },
activated() {
console.log('News組件被激活了')
this.timer = setInterval(() => {
this.opacity -= 0.01
if (this.opacity <= 0) this.opacity = 1
}, 16)
},
deactivated() {
console.log('News組件失活了')
clearInterval(this.timer)
},
}
</script>
路由守衛(wèi)
作用:對路由進行權限控制(我想讓你看哪個,不想讓你看哪個)
分類:全局守衛(wèi)、獨享守衛(wèi)、組件內(nèi)守衛(wèi)
1、路由元信息
是配置路由規(guī)則時專門提供的一個容器meta,用來存放我們自定義的一些屬性。
2、全局路由守衛(wèi)
(1)全局前置守衛(wèi)
全局前置守衛(wèi):初始化時執(zhí)行、每次路由切換前執(zhí)行
使用下面的api,有三個參數(shù),分別是to到哪里去,from從哪里來,next下一步(放行)
router.beforeEach((to,from,next)=>{ })
其中router是自定義的路由規(guī)則的名字const router = new VueRouter({})
比如我要設置只有本地存儲中school為potato的可以查看新聞和消息,那就要在前置路由守衛(wèi)中設置,如果符合條件,才能放行
//全局前置路由守衛(wèi)————初始化的時候被調(diào)用、每次路由切換之前被調(diào)用
router.beforeEach((from, to, next) => {
console.log('前置路由守衛(wèi)', from, to)
//判斷是否需要鑒權
// if (to.path === '/home/news' || to.path === '/home/message')
// if (to.name === 'xinwen' || to.name === 'xiaoxi')
if (to.meta.isAuth) {
if (localStorage.getItem('school') === 'potato') {
next() //放行
} else {
alert('學校名不對,無權查看!')
}
} else {
next() //放行
}
})
(2)全局后置守衛(wèi)
全局后置守衛(wèi):初始化時執(zhí)行、每次路由切換后執(zhí)行
使用下面的api,有兩個參數(shù),分別是to到哪里去,from從哪里來
注意后置守衛(wèi)沒有next
router.afterEach((to,from)=>{ })
比如我要設置不同的模塊顯示不同的網(wǎng)頁title,那么就要在等進入該模塊成功后再設置,也就是要設置在全局后置守衛(wèi)中
//全局后置路由守衛(wèi)————初始化的時候被調(diào)用、每次路由切換之后被調(diào)用
//注意:后置路由守衛(wèi)沒有next
router.afterEach((from, to) => {
console.log('后置路由守衛(wèi)', from, to)
document.title = to.meta.title || '土豆土豆'
})
3、獨享路由守衛(wèi)
獨享路由守衛(wèi):某一個路由單獨享用的守衛(wèi)
注意:獨享路由只有beforeEnter,沒有afterEnter,但可以配合全局后置守衛(wèi)使用。
獨享路由守衛(wèi)的寫法和全局路由守衛(wèi)的一樣,但是要寫在指定的路由配置中。
這樣配置了之后,查看新聞模塊時就會校驗權限。
4、組件內(nèi)路由守衛(wèi)
組件內(nèi)路由守衛(wèi):在組件內(nèi)寫路由守衛(wèi),該組件獨有的路由守衛(wèi)。
(1)進入組件時
beforeRouteEnter(to,from,next){}
必須通過路由規(guī)則進入,寫組件標簽進入不行,而且是進入路由組件時調(diào)用(相當于前置路由守衛(wèi)),to為當前組件
(2)離開組件時
beforeRouteLeave(to,from,next)
得觸發(fā)路徑的變化,前端瀏覽器檢測到了才允許離開, 離開組件時調(diào)用這個函數(shù),在后置路由守衛(wèi)之后。
(3)給About組件添加一個路由守衛(wèi)
<template>
<h2>我是About</h2>
</template>
<script>
export default {
name: 'About',
//通過路由規(guī)則,進入該組件時被調(diào)用
beforeRouteEnter(to, from, next) {
console.log('About--beforeRouteEnter')
if (to.meta.isAuth) {
if (localStorage.getItem('school') === 'potato') {
next() //放行
} else {
alert('學校名不對,無權查看!')
}
} else {
next() //放行
}
},
//通過路由規(guī)則,離開該組件時被調(diào)用
beforeRouteLeave(to, from, next) {
console.log('About--beforeRouteLeave')
next() //放行
},
}
</script>
5、組件從前置路由守衛(wèi)到失活的執(zhí)行流程
1.全局前置路由守衛(wèi) =>
2.組件內(nèi)路由守衛(wèi)beforeRouteEnter =>
3.全局后置路由守衛(wèi) =>
4.mounted掛載組件 =>
5.activated激活 =>
6.組件內(nèi)路由守衛(wèi)beforeRouteLeave =>
7.deactivated失活
路由器的兩種工作模式
1、hash模式
對于一個url來說,什么是hash值?——”#“以及后面的內(nèi)容就是hash值。
比如一個url為:
localhost:8080/#/home/message/detail
一般出現(xiàn)了”#“就知道這是hash模式,但是hash值不會包含在HTTP請求中,也就是說:hash值不會帶給服務器。
特點:
-
地址中永遠帶著#號,不美觀 。
-
若以后將地址通過第三方手機app分享,若app校驗嚴格,則地址會被標記為不合法。
-
兼容性較好。
2、history模式
localhost:8080/home/message/detail
特點:
1、地址干凈,美觀 。
2、兼容性和hash模式相比略差。
3、應用部署上線時需要后端人員支持,解決刷新頁面服務端404的問題。
注意:路由器的默認工作模式是hash模式
如果想改的話,去創(chuàng)建路由規(guī)則的地方更改mode屬性:
3、解決history刷新報錯問題
后端安裝中間件connect-history-api-fallback
這個插件可以幫助分辨是前端路由還是后端請求,從而避免報錯文章來源:http://www.zghlxwxcb.cn/news/detail-687258.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-687258.html
到了這里,關于Vue2-replace屬性、編程式路由導航、緩存路由組件、兩個新的生命周期鉤子、路由守衛(wèi)、路由器工作模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!