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