• Vue3-watch监听ref和reactive数据的五种情况及watchEffect


    何为watch

            文档定义:

    用于声明在数据更改时调用的侦听回调。

    watch 选项期望接受一个对象,其中键是需要侦听的响应式组件实例属性 (例如,通过 data 或 computed 声明的属性)——值是相应的回调函数。该回调函数接受被侦听源的新值和旧值。

    除了一个根级属性,键名也可以是一个简单的由点分隔的路径,例如 a.b.c。注意,这种用法不支持复杂表达式——仅支持由点分隔的路径。如果你需要侦听复杂的数据源,可以使用命令式的 $watch() API。

    值也可以是一个方法名称的字符串 (通过 methods 声明),或包含额外选项的对象。当使用对象语法时,回调函数应被声明在 handler 中。额外的选项包含:

    • immediate:在侦听器创建时立即触发回调。第一次调用时,旧值将为 undefined
    • deep:如果源是对象或数组,则强制深度遍历源,以便在深度变更时触发回调。详见深层侦听器
    • flush:调整回调的刷新时机。详见回调的触发时机及 watchEffect()
    • onTrack / onTrigger:调试侦听器的依赖关系。详见侦听器调试

    声明侦听器回调时避免使用箭头函数,因为它们将无法通过 this 访问组件实例。

    概述:

    • 作用:监视数据的变化(和Vue2中的watch作用一致)

    • 特点:Vue3中的watch只能监视以下四种数据

    1. ref定义的数据。

    2. reactive定义的数据。

    3. 函数返回一个值(getter函数)。

    4. 一个包含上述内容的数组。

    情况1:

    监视ref定义的【基本类型】数据:直接写数据名即可,监视的是其value值的改变。

    1. <script lang="ts" setup name="Person">
    2. import {ref,watch} from 'vue'
    3. // 数据
    4. let sum = ref(0)
    5. // 方法
    6. function changeSum(){
    7. sum.value += 1
    8. }
    9. // 监视,情况一:监视【ref】定义的【基本类型】数据
    10. const stopWatch = watch(sum,(newValue,oldValue)=>{
    11. console.log('sum变化了',newValue,oldValue)
    12. if(newValue >= 10){
    13. stopWatch()
    14. }
    15. })
    16. script>

    情况2:

    监视ref定义的【对象类型】数据:直接写数据名,监视的是对象的【地址值】,若想监视对象内部的数据,要手动开启深度监视。

    注意:

    • 若修改的是ref定义的对象中的属性,newValueoldValue 都是新值,因为它们是同一个对象。

    • 若修改整个ref定义的对象,newValue 是新值, oldValue 是旧值,因为不是同一个对象了。

    1. <script lang="ts" setup name="Person">
    2. import {ref,watch} from 'vue'
    3. // 数据
    4. let person = ref({
    5. name:'张三',
    6. age:18
    7. })
    8. // 方法
    9. function changeName(){
    10. person.value.name += '~'
    11. }
    12. function changeAge(){
    13. person.value.age += 1
    14. }
    15. function changePerson(){
    16. person.value = {name:'李四',age:90}
    17. }
    18. /*
    19. 监视,情况一:监视【ref】定义的【对象类型】数据,监视的是对象的地址值,若想监视对象内部属性的变化,需要手动开启深度监视
    20. watch的第一个参数是:被监视的数据
    21. watch的第二个参数是:监视的回调
    22. watch的第三个参数是:配置对象(deep、immediate等等.....)
    23. */
    24. watch(person,(newValue,oldValue)=>{
    25. console.log('person变化了',newValue,oldValue)
    26. },{deep:true})
    27. script>

    情况3:

    监视reactive定义的【对象类型】数据,且默认开启了深度监视。