Vue自定義指令 + 生命周期用法操作
Vue 中的自定義指令和生命周期是前端開(kāi)發(fā)的核心基礎(chǔ),也是面試高頻考點(diǎn)。本文將從實(shí)用角度出發(fā),梳理兩大知識(shí)點(diǎn)的核心用法,內(nèi)容簡(jiǎn)潔易懂,貼合實(shí)際開(kāi)發(fā)場(chǎng)景,助力快速掌握!
一、自定義指令:高效封裝 DOM 操作
自定義指令是 Vue 擴(kuò)展 DOM 操作能力的核心方式,專(zhuān)門(mén)用來(lái)封裝重復(fù)的 DOM 相關(guān)邏輯,輕量且易復(fù)用,是內(nèi)置指令的重要補(bǔ)充。
1. 函數(shù)式自定義指令
基礎(chǔ)極簡(jiǎn)寫(xiě)法,適合無(wú)多階段控制的簡(jiǎn)單場(chǎng)景,函數(shù)會(huì)在指令綁定元素和數(shù)據(jù)更新時(shí)自動(dòng)執(zhí)行。
// 全局注冊(cè):v-focus 輸入框自動(dòng)聚焦
Vue.directive('focus', (el) => {
el.focus() // el為指令綁定的DOM元素,可直接操作
})
適用場(chǎng)景:輸入框自動(dòng)聚焦、簡(jiǎn)單文本格式化、快速修改 DOM 基礎(chǔ)樣式等。
2. 對(duì)象式自定義指令
適合邏輯復(fù)雜的場(chǎng)景,通過(guò)多個(gè)內(nèi)置鉤子函數(shù),實(shí)現(xiàn)指令從綁定到解綁的全階段精確控制,每個(gè)鉤子各司其職。
// 全局注冊(cè):對(duì)象式自定義指令
Vue.directive('指令名', {
bind(el) { // 指令綁定元素時(shí)執(zhí)行
el.style.color = 'red'
},
update(el, binding) { // 數(shù)據(jù)更新時(shí)執(zhí)行
el.innerText = binding.value
}
})適用場(chǎng)景:元素拖拽、圖片懶加載、DOM 事件監(jiān)聽(tīng) / 解綁等需要分階段處理的邏輯。
3. 自定義指令核心總結(jié)
核心鉤子執(zhí)行順序
bind(綁定)→ inserted(插入 DOM)→ update(數(shù)據(jù)更新)→ unbind(解綁)
關(guān)鍵注意事項(xiàng)
- 所有鉤子中 this 指向 window,無(wú)法通過(guò) this 訪(fǎng)問(wèn)組件實(shí)例;
- 全局注冊(cè)需在 Vue 實(shí)例創(chuàng)建前執(zhí)行,局部注冊(cè)僅當(dāng)前組件可用;
- 涉及事件 / 定時(shí)器時(shí),務(wù)必在 unbind 中清理,避免內(nèi)存泄漏。
二、Vue 生命周期:精準(zhǔn)控制組件的 “一生”
生命周期是 Vue 組件從創(chuàng)建→掛載→更新→銷(xiāo)毀的完整流程,Vue 會(huì)按固定順序自動(dòng)觸發(fā)對(duì)應(yīng)的鉤子函數(shù)。
1. 生命周期核心階段:掛載流程
掛載階段是組件從初始化到渲染到頁(yè)面的核心過(guò)程,開(kāi)發(fā)中最常用,執(zhí)行順序固定:beforeCreate → created → beforeMount → mounted,僅執(zhí)行一次。
export default {
data() {
return {
message: '生命周期演示',
list: []
}
},
beforeCreate() {
console.log('beforeCreate:data/props 未初始化,無(wú)法訪(fǎng)問(wèn)')
},
created() {
console.log('created:data/props 已初始化,可訪(fǎng)問(wèn)', this.message)
this.getList() // 發(fā)送初始化數(shù)據(jù)請(qǐng)求(無(wú)需依賴(lài)DOM)
},
beforeMount() {
console.log('beforeMount:模板編譯完成,即將掛載到DOM')
},
mounted() {
console.log('mounted:DOM已掛載,可操作', this.$el)
},
methods: {
// 模擬數(shù)據(jù)請(qǐng)求
getList() {
setTimeout(() => {
this.list = ['Vue', '自定義指令', '生命周期']
}, 500)
}
}
}- beforeCreate:實(shí)例剛創(chuàng)建,無(wú)數(shù)據(jù)、無(wú) DOM,幾乎不用;
- created:數(shù)據(jù)就緒,可訪(fǎng)問(wèn) data/props,適合初始化數(shù)據(jù)、發(fā)送無(wú) DOM 依賴(lài)的請(qǐng)求;
- beforeMount:模板編譯完成,未掛載 DOM,可做最后一次數(shù)據(jù)修改;
- mounted:DOM 就緒,可訪(fǎng)問(wèn) / 操作 DOM,適合初始化第三方插件、執(zhí)行 DOM 相關(guān)邏輯。
2. 生命周期核心階段:更新 + 銷(xiāo)毀流程
更新階段會(huì)隨數(shù)據(jù)變化多次觸發(fā),銷(xiāo)毀階段僅執(zhí)行一次,核心是清理資源,避免內(nèi)存泄漏。
export default {
data() {
return {
message: '初始數(shù)據(jù)',
timer: null
}
},
created() {
// 初始化定時(shí)器
this.timer = setInterval(() => {
console.log('定時(shí)器運(yùn)行中')
}, 1000)
},
// 更新階段:數(shù)據(jù)變化,視圖未更新時(shí)執(zhí)行
beforeUpdate() {
console.log('beforeUpdate:數(shù)據(jù)已改,視圖未更')
},
// 更新階段:數(shù)據(jù)變化,視圖更新完成后執(zhí)行
updated() {
console.log('updated:數(shù)據(jù)已改,視圖已更', this.message)
},
// 銷(xiāo)毀階段:組件即將卸載,實(shí)例仍可訪(fǎng)問(wèn)(核心:清理資源)
beforeDestroy() {
console.log('beforeDestroy:組件即將銷(xiāo)毀,清理資源')
clearInterval(this.timer) // 清除定時(shí)器
this.$el = null // 釋放DOM引用
},
// 銷(xiāo)毀階段:組件已卸載,數(shù)據(jù)/DOM均不可訪(fǎng)問(wèn)
destroyed() {
console.log('destroyed:組件已銷(xiāo)毀,無(wú)法操作')
},
methods: {
// 修改數(shù)據(jù),觸發(fā)更新階段
updateMsg() {
this.message = '修改后的新數(shù)據(jù)'
}
}
}
3. 生命周期核心總結(jié)
整體執(zhí)行順序
創(chuàng)建階段→ 掛載階段→ 更新階段→ 銷(xiāo)毀階段
核心開(kāi)發(fā)原則
- 數(shù)據(jù)相關(guān)邏輯(請(qǐng)求、初始化)放 created,DOM 相關(guān)邏輯放 mounted;
- 數(shù)據(jù)更新后需操作 DOM,優(yōu)先用 this.$nextTick,而非 updated;
- 組件銷(xiāo)毀前,必須在 beforeDestroy 中清理所有資源(定時(shí)器、事件、插件實(shí)例);
總結(jié)
自定義指令和生命周期是 Vue 開(kāi)發(fā)的基礎(chǔ)中的基礎(chǔ),也是進(jìn)階的關(guān)鍵:
- 自定義指令:讓 DOM 操作更高效、更復(fù)用,核心是按需選擇函數(shù)式 / 對(duì)象式,做好資源清理;
- 生命周期:讓組件行為更可控,核心是分清數(shù)據(jù)就緒和 DOM 就緒時(shí)機(jī),牢記銷(xiāo)毀階段清理資源。
到此這篇關(guān)于Vue 教程 自定義指令 + 生命周期全解析的文章就介紹到這了,更多相關(guān)vue自定義指令 生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
element-plus中el-table點(diǎn)擊單行修改背景色方法
這篇文章主要給大家介紹了關(guān)于element-plus中el-table點(diǎn)擊單行修改背景色的相關(guān)資料,這是產(chǎn)品新加了的一個(gè)需求,分享給同樣遇到這個(gè)需求的朋友,需要的朋友可以參考下2023-07-07
基于Vuejs框架實(shí)現(xiàn)翻頁(yè)組件
這篇文章主要為大家詳細(xì)介紹了基于VueJs框架的翻頁(yè)組件,小巧精致,性能優(yōu)異的MVVM框架實(shí)現(xiàn)翻頁(yè)組件,也適用于angular,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
vue 實(shí)現(xiàn)LED數(shù)字時(shí)鐘效果(開(kāi)箱即用)
這篇文章主要介紹了vue 實(shí)現(xiàn)LED數(shù)字時(shí)鐘效果(開(kāi)箱即用),每一個(gè)數(shù)字由七個(gè)元素構(gòu)成,即每一個(gè)segment元素,本文給大家分享實(shí)現(xiàn)實(shí)例,感興趣的朋友一起看看吧2019-12-12
vue + any-touch實(shí)現(xiàn)一個(gè)iscroll 實(shí)現(xiàn)拖拽和滑動(dòng)動(dòng)畫(huà)效果
這篇文章主要介紹了vue + any-touch實(shí)現(xiàn)一個(gè)iscroll實(shí)現(xiàn)拖拽和滑動(dòng)動(dòng)畫(huà)效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
vue清除動(dòng)態(tài)路由的問(wèn)題記錄
項(xiàng)目中往往都是添加動(dòng)態(tài)路由,如何刪除已經(jīng)添加進(jìn)來(lái)的路由往往被忽視,為此這里做一下記錄,感興趣的朋友跟隨小編一起看看吧2023-10-10
Vue3中watch監(jiān)聽(tīng)對(duì)象的屬性值(監(jiān)聽(tīng)源必須是一個(gè)getter函數(shù))
這篇文章主要介紹了Vue3中watch監(jiān)聽(tīng)對(duì)象的屬性值,監(jiān)聽(tīng)源必須是一個(gè)getter函數(shù),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
在Vue項(xiàng)目中引入JQuery-ui插件的講解
今天小編就為大家分享一篇關(guān)于在Vue項(xiàng)目中引入JQuery-ui插件的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
vue同一個(gè)瀏覽器登錄不同賬號(hào)數(shù)據(jù)覆蓋問(wèn)題解決方案
同一個(gè)瀏覽器登錄不同賬號(hào)session一致,這就導(dǎo)致后面登錄的用戶(hù)數(shù)據(jù)會(huì)把前面登錄的用戶(hù)數(shù)據(jù)覆蓋掉,這個(gè)問(wèn)題很常見(jiàn),當(dāng)前我這邊解決的就是同一個(gè)瀏覽器不同窗口只能登錄一個(gè)用戶(hù),對(duì)vue同一個(gè)瀏覽器登錄不同賬號(hào)數(shù)據(jù)覆蓋問(wèn)題解決方法感興趣的朋友一起看看吧2024-01-01

