Vue2中watch使用方法
在有些情况下,我们需要在状态变化时执行一些“副作用”:例如更改 DOM,或是根据异步操作的结果去修改另一处的状态。下面是两种侦听属性的写法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| export default { data(){ return{ value:1, form:{ name:"zhangsan" } } }, watch:{ value:{ handler(newValue,oldValue){ console.log(newVaalue,oldValue); } }, 'form.name':{ handler(newValue,oldValue){ console.log(newVaalue,oldValue); } } } }
|
Vue3中watch的使用方法
- 在有些情况下,我们需要在状态变化时执行一些“副作用”:例如更改 DOM,或是根据异步操作的结果去修改另一处的状态。
在组合式 API 中,我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <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>
|
- 侦听数据源类型
watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| const x = ref(0) const y = ref(0)
// 单个 ref watch(x, (newX) => { console.log(`x is ${newX}`) })
// getter 函数 watch( () => x.value + y.value, (sum) => { console.log(`sum of x + y is: ${sum}`) } )
// 多个来源组成的数组 watch([x, () => y.value], ([newX, newY]) => { console.log(`x is ${newX} and y is ${newY}`) })
|
注意,你不能直接侦听响应式对象的属性值,例如:
1 2 3 4 5 6
| const obj = reactive({ count: 0 })
// 错误,因为 watch() 得到的参数是一个 number watch(obj.count, (count) => { console.log(`count is: ${count}`) })
|
这里需要用一个返回该属性的 getter 函数:
1 2 3 4 5 6 7
| // 提供一个 getter 函数 watch( () => obj.count, (count) => { console.log(`count is: ${count}`) } )
|