Vue中的偵聽(tīng)器及使用場(chǎng)景
基本示例?
計(jì)算屬性允許我們聲明性地計(jì)算衍生值。然而在有些情況下,我們需要在狀態(tài)變化時(shí)執(zhí)行一些“副作用”:例如更改 DOM,或是根據(jù)異步操作的結(jié)果去修改另一處的狀態(tài)。
在選項(xiàng)式 API 中,我們可以使用watch 選項(xiàng)在每次響應(yīng)式屬性發(fā)生變化時(shí)觸發(fā)一個(gè)函數(shù)。
export default {
data() {
return {
question: '',
answer: 'Questions usually contain a question mark. ;-)'
}
},
watch: {
// 每當(dāng) question 改變時(shí),這個(gè)函數(shù)就會(huì)執(zhí)行
question(newQuestion, oldQuestion) {
if (newQuestion.includes('?')) {
this.getAnswer()
}
}
},
methods: {
async getAnswer() {
this.answer = 'Thinking...'
try {
const res = await fetch('https://yesno.wtf/api')
this.answer = (await res.json()).answer
} catch (error) {
this.answer = 'Error! Could not reach the API. ' + error
}
}
}
}<p>
Ask a yes/no question:
<input v-model="question" />
</p>
<p>{{ answer }}</p>watch選項(xiàng)也支持把鍵設(shè)置成用.分隔的路徑:
export default {
watch: {
// 注意:只能是簡(jiǎn)單的路徑,不支持表達(dá)式。
'some.nested.key'(newValue) {
// ...
}
}
}深層偵聽(tīng)器?
watch默認(rèn)是淺層的:被偵聽(tīng)的屬性,僅在被賦新值時(shí),才會(huì)觸發(fā)回調(diào)函數(shù)——而嵌套屬性的變化不會(huì)觸發(fā)。如果想偵聽(tīng)所有嵌套的變更,你需要深層偵聽(tīng)器:
export default {
watch: {
someObject: {
handler(newValue, oldValue) {
// 注意:在嵌套的變更中,
// 只要沒(méi)有替換對(duì)象本身,
// 那么這里的 `newValue` 和 `oldValue` 相同
},
deep: true
}
}
}謹(jǐn)慎使用
深度偵聽(tīng)需要遍歷被偵聽(tīng)對(duì)象中的所有嵌套的屬性,當(dāng)用于大型數(shù)據(jù)結(jié)構(gòu)時(shí),開(kāi)銷(xiāo)很大。因此請(qǐng)只在必要時(shí)才使用它,并且要留意性能。
即時(shí)回調(diào)的偵聽(tīng)器?
watch默認(rèn)是懶執(zhí)行的:僅當(dāng)數(shù)據(jù)源變化時(shí),才會(huì)執(zhí)行回調(diào)。但在某些場(chǎng)景中,我們希望在創(chuàng)建偵聽(tīng)器時(shí),立即執(zhí)行一遍回調(diào)。舉例來(lái)說(shuō),我們想請(qǐng)求一些初始數(shù)據(jù),然后在相關(guān)狀態(tài)更改時(shí)重新請(qǐng)求數(shù)據(jù)。
我們可以用一個(gè)對(duì)象來(lái)聲明偵聽(tīng)器,這個(gè)對(duì)象有handler方法和immediate: true選項(xiàng),這樣便能強(qiáng)制回調(diào)函數(shù)立即執(zhí)行:
export default {
// ...
watch: {
question: {
handler(newQuestion) {
// 在組件實(shí)例創(chuàng)建時(shí)會(huì)立即調(diào)用
},
// 強(qiáng)制立即執(zhí)行回調(diào)
immediate: true
}
}
// ...
}回調(diào)函數(shù)的初次執(zhí)行就發(fā)生在created鉤子之前。Vue 此時(shí)已經(jīng)處理了data,computed和methods選項(xiàng),所以這些屬性在第一次調(diào)用時(shí)就是可用的。
回調(diào)的觸發(fā)時(shí)機(jī)?
當(dāng)你更改了響應(yīng)式狀態(tài),它可能會(huì)同時(shí)觸發(fā) Vue 組件更新和偵聽(tīng)器回調(diào)。
默認(rèn)情況下,用戶(hù)創(chuàng)建的偵聽(tīng)器回調(diào),都會(huì)在 Vue 組件更新之前被調(diào)用。這意味著你在偵聽(tīng)器回調(diào)中訪問(wèn)的 DOM 將是被 Vue 更新之前的狀態(tài)。
如果想在偵聽(tīng)器回調(diào)中能訪問(wèn)被 Vue 更新之后的 DOM,你需要指明flush: 'post'選項(xiàng):
export default {
// ...
watch: {
key: {
handler() {},
flush: 'post'
}
}
}this.$watch()?
我們也可以使用組件實(shí)例的$watch() 方法來(lái)命令式地創(chuàng)建一個(gè)偵聽(tīng)器:
export default {
created() {
this.$watch('question', (newQuestion) => {
// ...
})
}
}如果要在特定條件下設(shè)置一個(gè)偵聽(tīng)器,或者只偵聽(tīng)響應(yīng)用戶(hù)交互的內(nèi)容,這方法很有用。它還允許你提前停止該偵聽(tīng)器。
停止偵聽(tīng)器?
用watch選項(xiàng)或者$watch()實(shí)例方法聲明的偵聽(tīng)器,會(huì)在宿主組件卸載時(shí)自動(dòng)停止。因此,在大多數(shù)場(chǎng)景下,你無(wú)需關(guān)心怎么停止它。
在少數(shù)情況下,你的確需要在組件卸載之前就停止一個(gè)偵聽(tīng)器,這時(shí)可以調(diào)用$watch()API 返回的函數(shù):
const unwatch = this.$watch('foo', callback)
// ...當(dāng)該偵聽(tīng)器不再需要時(shí)
unwatch()到此這篇關(guān)于Vue中的偵聽(tīng)器及使用場(chǎng)景的文章就介紹到這了,更多相關(guān)Vue偵聽(tīng)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue報(bào)錯(cuò)Component?name"Home"should?always?be?mult
這篇文章主要介紹了Vue報(bào)錯(cuò)Component?name"Home"should?always?be?multi問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
vue?elementUi中的tabs標(biāo)簽頁(yè)使用教程
Tabs 組件提供了選項(xiàng)卡功能,默認(rèn)選中第一個(gè)標(biāo)簽頁(yè),下面這篇文章主要給大家介紹了關(guān)于vue?elementUi中的tabs標(biāo)簽頁(yè)使用的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
Element的el-tree控件后臺(tái)數(shù)據(jù)結(jié)構(gòu)的生成以及方法的抽取
這篇文章主要介紹了Element的el-tree控件后臺(tái)數(shù)據(jù)結(jié)構(gòu)的生成以及方法的抽取,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
解決vue router組件狀態(tài)刷新消失的問(wèn)題
這篇文章主要介紹了vue router組件狀態(tài)刷新消失的問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
vue獲取token(設(shè)置token,清除token)實(shí)現(xiàn)登錄方式
這篇文章主要介紹了vue獲取token(設(shè)置token,清除token)實(shí)現(xiàn)登錄方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09
vue實(shí)現(xiàn)點(diǎn)擊按鈕下載文件功能
這篇文章主要介紹了vue中點(diǎn)擊按鈕下載文件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
Vue?ElementUI?table實(shí)現(xiàn)表格斜線(xiàn)分隔線(xiàn)
這篇文章主要為大家詳細(xì)介紹了Vue?ElementUI?table實(shí)現(xiàn)表格斜線(xiàn)分隔線(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

