Vue手把手教你擼一個(gè) beforeEnter 鉤子函數(shù)
為什么要自造beforeEnter鉤子函數(shù)?
看下問題場景:項(xiàng)目中有一單詞列表頁面,每個(gè)cell都會備注該單詞是否已經(jīng)掌握,點(diǎn)擊cell進(jìn)入詳情頁,可對該單詞進(jìn)行學(xué)習(xí),并標(biāo)記單詞是否掌握,并且在詳情頁面中也可以通過點(diǎn)擊前進(jìn) 后退 按鈕學(xué)習(xí)其他的單詞。所以但我點(diǎn)擊返回時(shí),單詞列表要展示所有單詞用戶掌握的最新情況。
最終的頁面關(guān)系是這樣的:
wordListPage ——> wordDetail (對一系列單詞進(jìn)行學(xué)習(xí),退出)——> wordListPage(刷新單詞列表)
對于上面的場景,使用Vue生命周期函數(shù)是不行的,因?yàn)閂ue的生命周期函數(shù)如:beforeCreate 、created、beforeMounted、mounted等,只有在組件初始化的時(shí)候才會被調(diào)用,但是當(dāng)組件(VM實(shí)例)來自于緩存(如$route.go(-1) 、keep-alive)中時(shí),生命周期函數(shù)將不會再被調(diào)用。因此,當(dāng)我從單詞詳情頁面返回至列表頁面時(shí),找不到一個(gè)恰當(dāng)?shù)臅r(shí)期去出發(fā)數(shù)據(jù)更新。所以上面的場景也就無法很好的去做處理。
當(dāng)然,對于上面的場景是比較少的,但是beforeEnter鉤子函數(shù)的存在還是有必要的。
構(gòu)造beforeEnter鉤子函數(shù)
依賴知識點(diǎn):
- 路由:vue-router
- 混入:mixin
- 中央事件總線
1.創(chuàng)建一個(gè)中央事件總線
對于中央事件總線,簡單理解,就是創(chuàng)建一個(gè)公共Vue實(shí)例(EventBus),在不同的地方使用相同實(shí)例觸發(fā)EventBus.$emit('demo') 消息,在想要監(jiān)聽事件的位置使用公共Vue實(shí)例進(jìn)行監(jiān)聽EventBus.$on('demo',() => {})。再說白點(diǎn),就是有這么一個(gè)公共組件,它會再不同的地方發(fā)消息,又在不同的地方自己去監(jiān)聽消息。所以說消息的發(fā)送和接收都是它自己實(shí)現(xiàn)的,所以說我們稱之為中央事件總線。
代碼如下:libs/EventBus.js
import Vue from 'vue'; const EventBus = new Vue(); export default EventBus;
下面看下怎么使用
2.路由鉤子函數(shù)beforeEach
通過beforeEach鉤子函數(shù),實(shí)現(xiàn)路由切換時(shí)觸發(fā)相應(yīng)組件的beforeEnter事件。
代碼如下:router/index.js
import EventBus from '@/libs/EventBus'; router.beforeEach((to, from, next) => { //如:EventBus.$emit('homeBeforeEnter'); EventBus.$emit(to.name + 'BeforeEnter'); if (to.matched.some(route => route.meta.isAuth)) { ... next() } else { next() } })
3.創(chuàng)建全局混入對象
這里實(shí)現(xiàn)路由切換事件的監(jiān)聽和組件實(shí)例鉤子函數(shù)beforeEnter的觸發(fā)。
libs/beforeEnterMixin.js
import EventBus from './EventBus'; export default { beforeCreate() { //獲取當(dāng)前路由名稱,與前面使用to.name對應(yīng) let vmName = this.$route.name; if (!vmName) { return; } // 當(dāng)組件初始化時(shí),先觸發(fā)一次,后續(xù)將不再調(diào)用 this.$options.beforeEnter(); const beforeEnter = vmName + 'BeforeEnter'; //監(jiān)聽路由切換時(shí)觸發(fā)的...BeforeEnter事件 //通過this.$options獲取到實(shí)例中的beforeEnter鉤子函數(shù) //監(jiān)聽到...BeforeEnter事件后,觸發(fā)鉤子函數(shù)beforeEnter調(diào)用 EventBus.$on(beforeEnter, this.$options.beforeEnter); }, //該函數(shù)在這里只作為占位,沒有實(shí)際意義 beforeEnter() {} };
對于該混入對象,使用全局或者局部混入都是可行的。
全局混入:main.js
import beforeEnterMixin from '@/libs/beforeEnterMixin'; Vue.mixin(beforeEnterMixin);
4.在組件中的使用
如:home.vue
<template> <div> 首頁 </div> </template> <script> export default { beforeEnter() { console.log('首頁 beforeEnter...'); }, created() { console.log('首頁 created...') } } </script>
至此,我們的 beforeEnter 就完成了,可以做個(gè)demo自己測試下,目前本人在項(xiàng)目比較多的地方都會用到它。
在此附上以上代碼的demo鏈接:https://github.com/chaoshenr/Vue-beforeEnter
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 深入理解Vue父子組件生命周期執(zhí)行順序及鉤子函數(shù)
- 詳解Vue的鉤子函數(shù)(路由導(dǎo)航守衛(wèi)、keep-alive、生命周期鉤子)
- Vue指令的鉤子函數(shù)使用方法
- 深入理解Vue 的鉤子函數(shù)
- 解決Vue中mounted鉤子函數(shù)獲取節(jié)點(diǎn)高度出錯(cuò)問題
- vue中各選項(xiàng)及鉤子函數(shù)執(zhí)行順序詳解
- vue中父子組件傳值,解決鉤子函數(shù)mounted只運(yùn)行一次的操作
- Vue的路由及路由鉤子函數(shù)的實(shí)現(xiàn)
- vue.js動畫中的js鉤子函數(shù)的實(shí)現(xiàn)
- Vue3生命周期鉤子函數(shù)詳解
相關(guān)文章
vue+element實(shí)現(xiàn)表單校驗(yàn)功能
這篇文章主要介紹了vue+element表單校驗(yàn)功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05Element?Plus在el-form-item中設(shè)置justify-content無效的解決方案
這篇文章主要介紹了Element?Plus在el-form-item中設(shè)置justify-content無效的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10Vue-cli3生成的Vue項(xiàng)目加載Mxgraph方法示例
這篇文章主要介紹了Vue-cli3生成的Vue項(xiàng)目加載Mxgraph方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05Vue生產(chǎn)和開發(fā)環(huán)境如何切換及過濾器的使用
本文主要介紹了Vue生產(chǎn)、開發(fā)環(huán)境如何切換及過濾器的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08