可以是响应式ref或者计算属性、响应式对象、getter函数、多个数据源
组合成的数组
vue2中methods中可以通过this.属性名访问vue3中setup中的数据,watch也可以监听Vue3中的数据变化 vue3中watch默认开启深度监听
从vue中引入,且在setup中作为函数调用
tsimport {watch} from "vue";
setup{
...
watch("要监听的数据",(更改之后的值,更改之前的值)=>{})
...
}
若需要监听多个数据,多个数据发生变化后都执行同一个事件。则watch第一个参数可以传入数组,用于监听多个数据发生变化 此时回调事件中新值和旧值都是数组类型
tsimport {watch} from "vue";
setup{
...
watch(["要监听的数据1","要监听的数据2"],(更改之后的值,更改之前的值)=>{})
...
}
默认开启深度监听,对于引用类型,内存地址指向是不变的。所以watch监听的新值和旧值是一样的;
若需要监听对象中的某个对象的属性,则此时深度监听不到,需要手动开始深度监听,watch添加第三个参数{deep:true}
tswatch(()=>people.hobby,(n,o)=>{
console.log("people变化了",n,o)
},{deep:true})
watch中第三个参数作为配置项除了传入deep:true
开启深度监听,还可以添加immediate:true
实现watch内的函数立即执行
watch(()=>people.hobby,(n,o)=>{ console.log("people变化了",n,o) },{deep:true,immediate:true})
都在vue
组件更新之前被调用(即:在回调中访问的DOM
都是vue
更新之前的状态),若需要在回调中访问更新后的DOM
可以采用flush:'post'
选项指定
tswatch(source, callback, {
flush: 'post'
})
watchEffect(callback, {
flush: 'post'
})
对于watchEffect
可以采用flush:'post'
或者直接采用watchPostEffect
tsimport { watchPostEffect } from 'vue';
watchPostEffect(() => { /* 在 Vue 更新后执行 */ })
同样都是组件挂载后和更新后触发 watchEffect自动追踪依赖,而useEffect需要手动指定
vue<template> <h1 @click="changeProple">{{people}}</h1> </template> <script> import {reactive,watchEffect} from "vue"; export default { name: 'HelloWorld', setup(){ let people = reactive({ name:"xm", hobby:{ gender:0, food:"chicken", love:{ gender:0, age:18 } } }) function changeProple(){ people.hobby.love.age = 24 } watchEffect(()=>{ console.log("watchEffect",people.hobby.love.age) }) return { people, changeProple, } }, } </script> <style scoped> </style>
本文作者:RKLS
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!