Vue指令的鉤子函數(shù)使用方法
在Vue 中可以把一系列復(fù)雜的操作包裝為一個(gè)指令。
什么是復(fù)雜的操作?
我的理解是:復(fù)雜邏輯功能的包裝、違背數(shù)據(jù)驅(qū)動(dòng)的 DOM 操作以及對(duì)一些 Hack 手段的掩蓋等。我們總是期望以操作數(shù)據(jù)的形式來(lái)實(shí)現(xiàn)功能邏輯。
鉤子函數(shù)
對(duì)于自定義指令的定義,Vue2 有 5 個(gè)可選的鉤子函數(shù)。
bind: 只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用,用這個(gè)鉤子函數(shù)可以定義一個(gè)在綁定時(shí)執(zhí)行一次的初始化動(dòng)作。
inserted: 被綁定元素插入父節(jié)點(diǎn)時(shí)調(diào)用(父節(jié)點(diǎn)存在即可調(diào)用,不必存在于 document 中)。
update: 被綁定元素所在的模板更新時(shí)調(diào)用,而不論綁定值是否變化。
componentUpdated: 被綁定元素所在模板完成一次更新周期時(shí)調(diào)用。
unbind: 只調(diào)用一次,指令與元素解綁時(shí)調(diào)用。
接下來(lái),定義一個(gè)簡(jiǎn)單的指令以驗(yàn)證這些鉤子函數(shù)的觸發(fā)時(shí)機(jī)。
template
<div id="app"> <my-comp v-if="msg" :msg="msg"></my-comp> <button @click="update">更新</button> <button @click="uninstall">卸載</button> <button @click="install">安裝</button> </div>
script
Vue.directive('hello', {
bind: function (el) {
console.log('bind')
},
inserted: function (el) {
console.log('inserted')
},
update: function (el) {
console.log('update')
},
componentUpdated: function (el) {
console.log('componentUpdated')
},
unbind: function (el) {
console.log('unbind')
}
})
var myComp = {
template: '<h1 v-hello>{{msg}}</h1>',
props: {
msg: String
}
}
new Vue({
el: '#app',
data: {
msg: 'Hello'
},
components: {
myComp: myComp
},
methods: {
update: function () {
this.msg = 'Hi'
},
uninstall: function () {
this.msg = ''
},
install: function () {
this.msg = 'Hello'
}
}
})
頁(yè)面加載時(shí)
bind
inserted
組件更新時(shí)
點(diǎn)擊“更新”按鈕,更改數(shù)據(jù)觸發(fā)組件更新。
update
componentUpdated
卸載組件時(shí)
點(diǎn)擊“卸載”按鈕,數(shù)據(jù)置空否定判斷以觸發(fā)組件卸載。
unbind
重新安裝組件時(shí)
點(diǎn)擊“安裝”按鈕,數(shù)據(jù)賦值肯定判斷以觸發(fā)組件重新安裝。
bind
inserted
區(qū)別
從案例的運(yùn)行中,對(duì) 5 個(gè)鉤子函數(shù)的觸發(fā)時(shí)機(jī)有了初步的認(rèn)識(shí)。存疑的也就是bind和inserted、update和componentUpdated的區(qū)別了。
bind 和 inserted
據(jù)文檔所說(shuō),插入父節(jié)點(diǎn)時(shí)調(diào)用 inserted,來(lái)個(gè)測(cè)試。
bind: function (el) {
console.log(el.parentNode) // null
console.log('bind')
},
inserted: function (el) {
console.log(el.parentNode) // <div id="app">...</div>
console.log('inserted')
}
分別在兩個(gè)鉤子函數(shù)中輸出父節(jié)點(diǎn):bind 時(shí)父節(jié)點(diǎn)為 null,inserted 時(shí)父節(jié)點(diǎn)存在。
update 和 componentUpdated
關(guān)于這兩個(gè)的介紹,從字眼上看感覺(jué)是組件更新周期有關(guān),繼續(xù)驗(yàn)證。
update: function (el) {
console.log(el.innerHTML) // Hello
console.log('update')
},
componentUpdated: function (el) {
console.log(el.innerHTML) // Hi
console.log('componentUpdated')
}
沒(méi)毛病,update 和 componentUpdated 就是組件更新前和更新后的區(qū)別。
結(jié)論
文檔說(shuō)的沒(méi)錯(cuò)……
Demo
最佳實(shí)踐
根據(jù)需求的不同,我們要選擇恰當(dāng)?shù)臅r(shí)機(jī)去初始化指令、更新指令調(diào)用參數(shù)以及釋放指令存在時(shí)的內(nèi)存占用等。
比較常見(jiàn)的場(chǎng)景是:用指令包裝一些無(wú)依賴(lài)的第三方庫(kù)以擴(kuò)展組件功能。而一個(gè)健壯的庫(kù)通常會(huì)包含:初始化實(shí)例、參數(shù)更新和釋放實(shí)例資源占用等操作。
Vue.directive('hello', {
bind: function (el, binding) {
// 在 bind 鉤子中初始化庫(kù)實(shí)例
// 如果需要使用父節(jié)點(diǎn),也可以在 inserted 鉤子中執(zhí)行
el.__library__ = new Library(el, binding.value)
},
update: function (el, binding) {
// 模版更新意味著指令的參數(shù)可能被改變,這里可以對(duì)庫(kù)實(shí)例的參數(shù)作更新
// 酌情使用 update 或 componentUpdated 鉤子
el.__library__.setOptions(Object.assign(binding.oldValue, binding.value))
},
unbind: function (el) {
// 釋放實(shí)例
el.__library__.destory()
}
})
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS中call()和apply()的功能及用法實(shí)例分析
這篇文章主要介紹了JS中call()和apply()的功能及用法,結(jié)合實(shí)例形式詳細(xì)分析了JS中call()和apply()的功能、區(qū)別、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-06-06
JS實(shí)現(xiàn)頭像循環(huán)滾動(dòng)示例
這篇文章主要為大家介紹了JS實(shí)現(xiàn)頭像循環(huán)滾動(dòng)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
實(shí)現(xiàn)div可編輯的常見(jiàn)方法總結(jié)
實(shí)現(xiàn)div可編輯的常見(jiàn)方法總結(jié)...2007-04-04
用JS實(shí)現(xiàn)網(wǎng)頁(yè)元素陰影效果的研究總結(jié)
用JS實(shí)現(xiàn)網(wǎng)頁(yè)元素陰影效果的研究總結(jié)...2007-08-08
javascript獲取當(dāng)前的時(shí)間戳的方法匯總
這篇文章主要介紹了javascript獲取當(dāng)前的時(shí)間戳的方法匯總的相關(guān)資料,需要的朋友可以參考下2015-07-07
js深度合并兩個(gè)數(shù)組對(duì)象的實(shí)現(xiàn)
這篇文章主要介紹了js深度合并兩個(gè)數(shù)組對(duì)象的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
javascript function調(diào)用時(shí)的參數(shù)檢測(cè)常用辦法
js中并不直接支持類(lèi)似c#的方法重載,所以只能變相的來(lái)解決,示意代碼:(利用了內(nèi)置屬性arguments)2010-02-02

