Vue手把手教你擼一個(gè) beforeEnter 鉤子函數(shù)
為什么要自造beforeEnter鉤子函數(shù)?
看下問題場(chǎng)景:項(xiàng)目中有一單詞列表頁(yè)面,每個(gè)cell都會(huì)備注該單詞是否已經(jīng)掌握,點(diǎn)擊cell進(jìn)入詳情頁(yè),可對(duì)該單詞進(jìn)行學(xué)習(xí),并標(biāo)記單詞是否掌握,并且在詳情頁(yè)面中也可以通過點(diǎn)擊前進(jìn) 后退 按鈕學(xué)習(xí)其他的單詞。所以但我點(diǎn)擊返回時(shí),單詞列表要展示所有單詞用戶掌握的最新情況。
最終的頁(yè)面關(guān)系是這樣的:
wordListPage ——> wordDetail (對(duì)一系列單詞進(jìn)行學(xué)習(xí),退出)——> wordListPage(刷新單詞列表)
對(duì)于上面的場(chǎng)景,使用Vue生命周期函數(shù)是不行的,因?yàn)閂ue的生命周期函數(shù)如:beforeCreate 、created、beforeMounted、mounted等,只有在組件初始化的時(shí)候才會(huì)被調(diào)用,但是當(dāng)組件(VM實(shí)例)來自于緩存(如$route.go(-1) 、keep-alive)中時(shí),生命周期函數(shù)將不會(huì)再被調(diào)用。因此,當(dāng)我從單詞詳情頁(yè)面返回至列表頁(yè)面時(shí),找不到一個(gè)恰當(dāng)?shù)臅r(shí)期去出發(fā)數(shù)據(jù)更新。所以上面的場(chǎng)景也就無法很好的去做處理。
當(dāng)然,對(duì)于上面的場(chǎng)景是比較少的,但是beforeEnter鉤子函數(shù)的存在還是有必要的。
構(gòu)造beforeEnter鉤子函數(shù)
依賴知識(shí)點(diǎn):
- 路由:vue-router
- 混入:mixin
- 中央事件總線
1.創(chuàng)建一個(gè)中央事件總線
對(duì)于中央事件總線,簡(jiǎn)單理解,就是創(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è)公共組件,它會(huì)再不同的地方發(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)建全局混入對(duì)象
這里實(shí)現(xiàn)路由切換事件的監(jiān)聽和組件實(shí)例鉤子函數(shù)beforeEnter的觸發(fā)。
libs/beforeEnterMixin.js
import EventBus from './EventBus';
export default {
beforeCreate() {
//獲取當(dāng)前路由名稱,與前面使用to.name對(duì)應(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() {}
};
對(duì)于該混入對(duì)象,使用全局或者局部混入都是可行的。
全局混入:main.js
import beforeEnterMixin from '@/libs/beforeEnterMixin'; Vue.mixin(beforeEnterMixin);
4.在組件中的使用
如:home.vue
<template>
<div>
首頁(yè)
</div>
</template>
<script>
export default {
beforeEnter() {
console.log('首頁(yè) beforeEnter...');
},
created() {
console.log('首頁(yè) created...')
}
}
</script>
至此,我們的 beforeEnter 就完成了,可以做個(gè)demo自己測(cè)試下,目前本人在項(xiàng)目比較多的地方都會(huì)用到它。
在此附上以上代碼的demo鏈接:https://github.com/chaoshenr/Vue-beforeEnter
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(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動(dòng)畫中的js鉤子函數(shù)的實(shí)現(xiàn)
- Vue3生命周期鉤子函數(shù)詳解
相關(guān)文章
Vue中使用計(jì)算屬性的知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于Vue中使用計(jì)算屬性的知識(shí)點(diǎn)總結(jié)內(nèi)容,對(duì)此有興趣的朋友們可以跟著學(xué)習(xí)參考下。2021-12-12
Vue中動(dòng)態(tài)權(quán)限到按鈕的完整實(shí)現(xiàn)方案詳解
這篇文章主要為大家詳細(xì)介紹了Vue如何在現(xiàn)有方案的基礎(chǔ)上加入對(duì)路由的增、刪、改、查權(quán)限控制,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
使用vue2實(shí)現(xiàn)帶地區(qū)編號(hào)和名稱的省市縣三級(jí)聯(lián)動(dòng)效果
我們知道省市區(qū)縣都有名稱和對(duì)應(yīng)的數(shù)字唯一編號(hào),使用編號(hào)可以更方便查詢以及程序處理,我們今天來了解一下使用vue2來實(shí)現(xiàn)常見的省市區(qū)下拉聯(lián)動(dòng)選擇效果,需要的朋友可以參考下2018-11-11
VUE?el-table列表搜索功能純前端實(shí)現(xiàn)方法
Vue表搜索是指在Vue應(yīng)用中實(shí)現(xiàn)對(duì)表格數(shù)據(jù)的搜索功能,下面這篇文章主要給大家介紹了關(guān)于VUE?el-table列表搜索功能純前端實(shí)現(xiàn)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
Nginx部署Vue.js前端項(xiàng)目的實(shí)現(xiàn)
本文主要介紹了Nginx部署Vue.js前端項(xiàng)目指南,幫助您實(shí)現(xiàn)從開發(fā)到線上部署的平滑過渡,確保用戶能夠獲得最佳的訪問體驗(yàn),感興趣的可以了解一下2024-09-09
vue實(shí)現(xiàn)將圖像文件轉(zhuǎn)換為base64
這篇文章主要介紹了vue實(shí)現(xiàn)將圖像文件轉(zhuǎn)換為base64,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
三分鐘讓你快速學(xué)會(huì)axios在vue項(xiàng)目中的基本用法(推薦!)
Axios是一個(gè)基于Promise用于瀏覽器和nodejs的HTTP客戶端,下面這篇文章主要給大家介紹了如何通過三分鐘讓你快速學(xué)會(huì)axios在vue項(xiàng)目中的基本用法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04

