一文詳解vue中偵聽器的使用
基本示例?
計(jì)算屬性允許我們聲明性地計(jì)算衍生值。然而在有些情況下,我們需要在狀態(tài)變化時(shí)執(zhí)行一些“副作用”:例如更改 DOM,或是根據(jù)異步操作的結(jié)果去修改另一處的狀態(tài)。
在組合式 API 中,我們可以使用 watch 函數(shù)在每次響應(yīng)式狀態(tài)發(fā)生變化時(shí)觸發(fā)回調(diào)函數(shù):
<script setup> import { ref, watch } from 'vue' const question = ref('') const answer = ref('Questions usually contain a question mark. ;-)') const loading = ref(false) // 可以直接偵聽一個(gè) ref watch(question, async (newQuestion, oldQuestion) => { if (newQuestion.includes('?')) { loading.value = true answer.value = 'Thinking...' try { const res = await fetch('https://yesno.wtf/api') answer.value = (await res.json()).answer } catch (error) { answer.value = 'Error! Could not reach the API. ' + error } finally { loading.value = false } } }) </script> <template> <p> Ask a yes/no question: <input v-model="question" :disabled="loading" /> </p> <p>{{ answer }}</p> </template>
偵聽數(shù)據(jù)源類型?
watch 的第一個(gè)參數(shù)可以是不同形式的“數(shù)據(jù)源”:它可以是一個(gè) ref (包括計(jì)算屬性)、一個(gè)響應(yīng)式對(duì)象、一個(gè) getter 函數(shù)、或多個(gè)數(shù)據(jù)源組成的數(shù)組:
const x = ref(0) const y = ref(0) // 單個(gè) ref watch(x, (newX) => { console.log(`x is ${newX}`) }) // getter 函數(shù) watch( () => x.value + y.value, (sum) => { console.log(`sum of x + y is: ${sum}`) } ) // 多個(gè)來(lái)源組成的數(shù)組 watch([x, () => y.value], ([newX, newY]) => { console.log(`x is ${newX} and y is ${newY}`) })
注意,你不能直接偵聽響應(yīng)式對(duì)象的屬性值,例如:
const obj = reactive({ count: 0 }) // 錯(cuò)誤,因?yàn)?watch() 得到的參數(shù)是一個(gè) number watch(obj.count, (count) => { console.log(`count is: ${count}`) })
這里需要用一個(gè)返回該屬性的 getter 函數(shù):
// 提供一個(gè) getter 函數(shù) watch( () => obj.count, (count) => { console.log(`count is: ${count}`) } )
深層偵聽器?
直接給 watch() 傳入一個(gè)響應(yīng)式對(duì)象,會(huì)隱式地創(chuàng)建一個(gè)深層偵聽器——該回調(diào)函數(shù)在所有嵌套的變更時(shí)都會(huì)被觸發(fā):
const obj = reactive({ count: 0 }) watch(obj, (newValue, oldValue) => { // 在嵌套的屬性變更時(shí)觸發(fā) // 注意:`newValue` 此處和 `oldValue` 是相等的 // 因?yàn)樗鼈兪峭粋€(gè)對(duì)象! }) obj.count++
相比之下,一個(gè)返回響應(yīng)式對(duì)象的 getter 函數(shù),只有在返回不同的對(duì)象時(shí),才會(huì)觸發(fā)回調(diào):
js
watch( () => state.someObject, () => { // 僅當(dāng) state.someObject 被替換時(shí)觸發(fā) } )
你也可以給上面這個(gè)例子顯式地加上 deep 選項(xiàng),強(qiáng)制轉(zhuǎn)成深層偵聽器:
watch( () => state.someObject, (newValue, oldValue) => { // 注意:`newValue` 此處和 `oldValue` 是相等的 // *除非* state.someObject 被整個(gè)替換了 }, { deep: true } )]
到此這篇關(guān)于一文詳解vue中偵聽器的使用的文章就介紹到這了,更多相關(guān)vue偵聽器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue2.5通過(guò)json文件讀取數(shù)據(jù)的方法
本文通過(guò)實(shí)例代碼給大家詳細(xì)介紹了Vue2.5通過(guò)json文件讀取數(shù)據(jù)的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-02-02解決vue過(guò)濾器filters獲取不到this對(duì)象的問(wèn)題
這篇文章主要介紹了解決vue過(guò)濾器filters獲取不到this對(duì)象的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01vue resource post請(qǐng)求時(shí)遇到的坑
這篇文章主要介紹了vue resource post請(qǐng)求時(shí)遇到的坑,需要的朋友可以參考下2017-10-10vue實(shí)現(xiàn)點(diǎn)擊按鈕倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)點(diǎn)擊按鈕倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07Vue3+TS+Vite+NaiveUI搭建一個(gè)項(xiàng)目骨架實(shí)現(xiàn)
本文主要介紹了Vue3+TS+Vite+NaiveUI搭建一個(gè)項(xiàng)目骨架實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06