網(wǎng)站集約化建設情況360推廣客服電話是多少
🥔:如果事與愿違,那一定是上天另有安排
更多Vue知識請點擊——Vue.js
VUE2-Day13
- router-link的replace屬性
- 編程式路由導航
- 1、什么是編程式路由導航
- 2、如何編碼
- 3、使用案例示例說明
- 緩存路由組件
- 兩個新的生命周期鉤子
- 路由守衛(wèi)
- 1、路由元信息
- 2、全局路由守衛(wèi)
- (1)全局前置守衛(wèi)
- (2)全局后置守衛(wèi)
- 3、獨享路由守衛(wèi)
- 4、組件內路由守衛(wèi)
- (1)進入組件時
- (2)離開組件時
- (3)給About組件添加一個路由守衛(wèi)
- 5、組件從前置路由守衛(wèi)到失活的執(zhí)行流程
- 路由器的兩種工作模式
- 1、hash模式
- 2、history模式
- 3、解決history刷新報錯問題
router-link的replace屬性
1.作用:控制路由跳轉時操作瀏覽器歷史記錄的模式
2.瀏覽器的歷史記錄有兩種寫入方式:分別為push
和replace
,push是追加歷史記錄,replace是替換當前記錄。路由跳轉時候默認為push
3.如何開啟replace模式:<router-link replace .......>News</router-link>
- 如果你用的是默認的push,你點擊進入到下一個路由的時候可以返回到上一個路由
- 如果你用的是replace,你點擊進入到下一個路由的時候,瀏覽器左上角不會有返回上一步
編程式路由導航
1、什么是編程式路由導航
不借助<router-link>
實現(xiàn)路由跳轉,讓路由跳轉更加靈活,主要是用$router
的三個api push
,replace
,go(了解)
來實現(xià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)往哪里跳轉,什么時候跳轉(加定時器)
緩存路由組件
作用:讓不展示的路由組件保持掛載,不被銷毀(比如切換時要保留表單數(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里面的名字是組件名
- 在需要被緩存組件的外側包裹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.01if (this.opacity <= 0) this.opacity = 1}, 16)},deactivated() {console.log('News組件失活了')clearInterval(this.timer)},
}
</script>
路由守衛(wèi)
作用:對路由進行權限控制(我想讓你看哪個,不想讓你看哪個)
分類:全局守衛(wèi)、獨享守衛(wè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)————初始化的時候被調用、每次路由切換之前被調用
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)————初始化的時候被調用、每次路由切換之后被調用
//注意:后置路由守衛(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、組件內路由守衛(wèi)
組件內路由守衛(wèi):在組件內寫路由守衛(wèi),該組件獨有的路由守衛(wèi)。
(1)進入組件時
beforeRouteEnter(to,from,next){}
必須通過路由規(guī)則進入,寫組件標簽進入不行,而且是進入路由組件時調用(相當于前置路由守衛(wèi)),to為當前組件
(2)離開組件時
beforeRouteLeave(to,from,next)
得觸發(fā)路徑的變化,前端瀏覽器檢測到了才允許離開, 離開組件時調用這個函數(shù),在后置路由守衛(wèi)之后。
(3)給About組件添加一個路由守衛(wèi)
<template><h2>我是About</h2>
</template><script>
export default {name: 'About',//通過路由規(guī)則,進入該組件時被調用beforeRouteEnter(to, from, next) {console.log('About--beforeRouteEnter')if (to.meta.isAuth) {if (localStorage.getItem('school') === 'potato') {next() //放行} else {alert('學校名不對,無權查看!')}} else {next() //放行}},//通過路由規(guī)則,離開該組件時被調用beforeRouteLeave(to, from, next) {console.log('About--beforeRouteLeave')next() //放行},
}
</script>
5、組件從前置路由守衛(wèi)到失活的執(zhí)行流程
1.全局前置路由守衛(wèi) =>
2.組件內路由守衛(wèi)beforeRouteEnter =>
3.全局后置路由守衛(wèi) =>
4.mounted掛載組件 =>
5.activated激活 =>
6.組件內路由守衛(wèi)beforeRouteLeave =>
7.deactivated失活
路由器的兩種工作模式
1、hash模式
對于一個url來說,什么是hash值?——”#“以及后面的內容就是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
這個插件可以幫助分辨是前端路由還是后端請求,從而避免報錯