一文詳解vue中偵聽器的使用
基本示例?
計(jì)算屬性允許我們聲明性地計(jì)算衍生值。然而在有些情況下,我們需要在狀態(tài)變化時執(zhí)行一些“副作用”:例如更改 DOM,或是根據(jù)異步操作的結(jié)果去修改另一處的狀態(tài)。
在組合式 API 中,我們可以使用 watch 函數(shù)在每次響應(yīng)式狀態(tài)發(fā)生變化時觸發(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) // 可以直接偵聽一個 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 的第一個參數(shù)可以是不同形式的“數(shù)據(jù)源”:它可以是一個 ref (包括計(jì)算屬性)、一個響應(yīng)式對象、一個 getter 函數(shù)、或多個數(shù)據(jù)源組成的數(shù)組:
const x = ref(0) const y = ref(0) // 單個 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}`) } ) // 多個來源組成的數(shù)組 watch([x, () => y.value], ([newX, newY]) => { console.log(`x is ${newX} and y is ${newY}`) })
注意,你不能直接偵聽響應(yīng)式對象的屬性值,例如:
const obj = reactive({ count: 0 }) // 錯誤,因?yàn)?watch() 得到的參數(shù)是一個 number watch(obj.count, (count) => { console.log(`count is: ${count}`) })
這里需要用一個返回該屬性的 getter 函數(shù):
// 提供一個 getter 函數(shù) watch( () => obj.count, (count) => { console.log(`count is: ${count}`) } )
深層偵聽器?
直接給 watch() 傳入一個響應(yīng)式對象,會隱式地創(chuàng)建一個深層偵聽器——該回調(diào)函數(shù)在所有嵌套的變更時都會被觸發(fā):
const obj = reactive({ count: 0 }) watch(obj, (newValue, oldValue) => { // 在嵌套的屬性變更時觸發(fā) // 注意:`newValue` 此處和 `oldValue` 是相等的 // 因?yàn)樗鼈兪峭粋€對象! }) obj.count++
相比之下,一個返回響應(yīng)式對象的 getter 函數(shù),只有在返回不同的對象時,才會觸發(fā)回調(diào):
js
watch( () => state.someObject, () => { // 僅當(dāng) state.someObject 被替換時觸發(fā) } )
你也可以給上面這個例子顯式地加上 deep 選項(xiàng),強(qiáng)制轉(zhuǎn)成深層偵聽器:
watch( () => state.someObject, (newValue, oldValue) => { // 注意:`newValue` 此處和 `oldValue` 是相等的 // *除非* state.someObject 被整個替換了 }, { deep: true } )]
到此這篇關(guān)于一文詳解vue中偵聽器的使用的文章就介紹到這了,更多相關(guān)vue偵聽器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue2.5通過json文件讀取數(shù)據(jù)的方法
本文通過實(shí)例代碼給大家詳細(xì)介紹了Vue2.5通過json文件讀取數(shù)據(jù)的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2018-02-02vue實(shí)現(xiàn)點(diǎn)擊按鈕倒計(jì)時
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)點(diǎn)擊按鈕倒計(jì)時,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07Vue3+TS+Vite+NaiveUI搭建一個項(xiàng)目骨架實(shí)現(xiàn)
本文主要介紹了Vue3+TS+Vite+NaiveUI搭建一個項(xiàng)目骨架實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06