目錄
基本示例?
深層偵聽器?
即時回調(diào)的偵聽器?
回調(diào)的觸發(fā)時機?
this.$watch()?
停止偵聽器?
基本示例?
? ? ? ?計算屬性允許我們聲明性地計算衍生值。然而在有些情況下,我們需要在狀態(tài)變化時執(zhí)行一些“副作用”:例如更改 DOM,或是根據(jù)異步操作的結(jié)果去修改另一處的狀態(tài)。
在選項式 API 中,我們可以使用watch 選項在每次響應(yīng)式屬性發(fā)生變化時觸發(fā)一個函數(shù)。
export default {
data() {
return {
question: '',
answer: 'Questions usually contain a question mark. ;-)'
}
},
watch: {
// 每當(dāng) question 改變時,這個函數(shù)就會執(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
?選項也支持把鍵設(shè)置成用?.
?分隔的路徑:
export default {
watch: {
// 注意:只能是簡單的路徑,不支持表達式。
'some.nested.key'(newValue) {
// ...
}
}
}
深層偵聽器?
? watch
?默認(rèn)是淺層的:被偵聽的屬性,僅在被賦新值時,才會觸發(fā)回調(diào)函數(shù)——而嵌套屬性的變化不會觸發(fā)。如果想偵聽所有嵌套的變更,你需要深層偵聽器:
export default {
watch: {
someObject: {
handler(newValue, oldValue) {
// 注意:在嵌套的變更中,
// 只要沒有替換對象本身,
// 那么這里的 `newValue` 和 `oldValue` 相同
},
deep: true
}
}
}
謹(jǐn)慎使用
深度偵聽需要遍歷被偵聽對象中的所有嵌套的屬性,當(dāng)用于大型數(shù)據(jù)結(jié)構(gòu)時,開銷很大。因此請只在必要時才使用它,并且要留意性能。
即時回調(diào)的偵聽器?
? watch
?默認(rèn)是懶執(zhí)行的:僅當(dāng)數(shù)據(jù)源變化時,才會執(zhí)行回調(diào)。但在某些場景中,我們希望在創(chuàng)建偵聽器時,立即執(zhí)行一遍回調(diào)。舉例來說,我們想請求一些初始數(shù)據(jù),然后在相關(guān)狀態(tài)更改時重新請求數(shù)據(jù)。
我們可以用一個對象來聲明偵聽器,這個對象有?handler
?方法和?immediate: true
?選項,這樣便能強制回調(diào)函數(shù)立即執(zhí)行:
export default {
// ...
watch: {
question: {
handler(newQuestion) {
// 在組件實例創(chuàng)建時會立即調(diào)用
},
// 強制立即執(zhí)行回調(diào)
immediate: true
}
}
// ...
}
?回調(diào)函數(shù)的初次執(zhí)行就發(fā)生在?created
?鉤子之前。Vue 此時已經(jīng)處理了?data,
computed
?和?methods
?選項,所以這些屬性在第一次調(diào)用時就是可用的。
回調(diào)的觸發(fā)時機?
? ? ? 當(dāng)你更改了響應(yīng)式狀態(tài),它可能會同時觸發(fā) Vue 組件更新和偵聽器回調(diào)。
默認(rèn)情況下,用戶創(chuàng)建的偵聽器回調(diào),都會在 Vue 組件更新之前被調(diào)用。這意味著你在偵聽器回調(diào)中訪問的 DOM 將是被 Vue 更新之前的狀態(tài)。
如果想在偵聽器回調(diào)中能訪問被 Vue 更新之后的 DOM,你需要指明?flush: 'post'
?選項:
export default {
// ...
watch: {
key: {
handler() {},
flush: 'post'
}
}
}
this.$watch()?
我們也可以使用組件實例的$watch() 方法?來命令式地創(chuàng)建一個偵聽器:
export default {
created() {
this.$watch('question', (newQuestion) => {
// ...
})
}
}
如果要在特定條件下設(shè)置一個偵聽器,或者只偵聽響應(yīng)用戶交互的內(nèi)容,這方法很有用。它還允許你提前停止該偵聽器。
停止偵聽器?
用?watch
?選項或者?$watch()
?實例方法聲明的偵聽器,會在宿主組件卸載時自動停止。因此,在大多數(shù)場景下,你無需關(guān)心怎么停止它。文章來源:http://www.zghlxwxcb.cn/news/detail-412231.html
在少數(shù)情況下,你的確需要在組件卸載之前就停止一個偵聽器,這時可以調(diào)用?$watch()
?API 返回的函數(shù):文章來源地址http://www.zghlxwxcb.cn/news/detail-412231.html
const unwatch = this.$watch('foo', callback)
// ...當(dāng)該偵聽器不再需要時
unwatch()
到了這里,關(guān)于Vue——偵聽器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!