vue中watch監(jiān)聽器用法之deep、immediate、flush
一、watch 默認是淺層,使用deep深層監(jiān)聽
被偵聽的 property,僅在被賦新值時,才會觸發(fā)回調(diào)函數(shù)——而嵌套 property 的變化不會觸發(fā)。如果想偵聽所有嵌套的變更,你需要深層偵聽器:設置deep: true
export default {
watch: {
someObject: {
handler(newValue, oldValue) {
// 注意:在嵌套的變更中,
// 只要沒有替換對象本身,
// 那么這里的 `newValue` 和 `oldValue` 相同
},
deep: true
}
}
}
注意:深度偵聽需要遍歷被偵聽對象中的所有嵌套的 property,當用于大型數(shù)據(jù)結構時,開銷很大。因此請只在必要時才使用它,并且要留意性能。
二、watch 默認是懶偵聽,使用immediate即時回調(diào)偵聽
最初綁定的時候是不會執(zhí)行的,要等到 監(jiān)聽的屬性 改變時才執(zhí)行監(jiān)聽計算。那我們想要一開始就讓他最初綁定的時候就執(zhí)行改怎么辦呢?
immediate表示在watch中首次綁定的時候,是否執(zhí)行handler,值為true則表示在watch中聲明的時候,就立即執(zhí)行handler方法,值為false,則和一般使用watch一樣,在數(shù)據(jù)發(fā)生變化的時候才執(zhí)行handler。
export default {
// ...
watch: {
question: {
handler(newQuestion) {
// 在組件實例創(chuàng)建時會立即調(diào)用
},
// 強制立即執(zhí)行回調(diào)
immediate: true
}
}
// ...
}
三、回調(diào)的刷新時機flush: 'post'
當你更改了響應式狀態(tài),它可能會同時觸發(fā) Vue 組件更新和偵聽器回調(diào)。
默認情況下,用戶創(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) => {
// ...
})
}
}
如果要在特定條件下設置一個偵聽器,或者只偵聽響應用戶交互的內(nèi)容,這方法很有用。它還允許你提前停止該偵聽器。
五、停止偵聽器
用 watch 選項或者 $watch() 實例方法聲明的偵聽器,會在宿主組件卸載時自動停止。因此,在大多數(shù)場景下,你無需關心怎么停止它。
在少數(shù)情況下,你的確需要在組件卸載之前就停止一個偵聽器,這時可以調(diào)用 $watch() API 返回的函數(shù):
const unwatch = this.$watch('foo', callback)
// ...當該偵聽器不再需要時
unwatch()
補充:這里一般使用最多的是deep:true,處理對象內(nèi)部屬性的變化,常用寫法如下:
watch:{
// 對象的監(jiān)聽,采用deep:true
obj: {
handler:function(newVal){//監(jiān)聽到屬性變化進行邏輯處理},
deep:true
},
'obj.name': {
handler:function(newVal){//監(jiān)聽到屬性變化進行邏輯處理},
}
}
總結
到此這篇關于vue中watch監(jiān)聽器用法之deep、immediate、flush的文章就介紹到這了,更多相關vue watch監(jiān)聽器用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于Vue3中element-plus的el-dialog對話框無法顯示的問題及解決方法
最近今天在寫一個停車場管理系統(tǒng)的項目時,在用vue3寫前端時,在前端模板選擇上,我一時腦抽,突然決定放棄SpringBoot,選擇了以前幾乎很少用的element-plus,然后果不其然,錯誤連連,下面給大家分享dialog對話框無法顯示的原因,感興趣的朋友一起看看吧2023-10-10
前端插件庫之vue3使用vue-codemirror插件的步驟和實例
CodeMirror是一款基于JavaScript、面向語言的前端代碼編輯器,下面這篇文章主要給大家介紹了關于前端插件庫之vue3使用vue-codemirror插件的步驟和實例,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07

