watch 监听属性

watch 函数接收三个参数

第一个为 指定要监听的数据

第二个为 监听的执行函数

第三个为 watch 执行时的配置

  • 定义 watch 监听属性

    import { watch , ref } from 'vue'
    export default {
      setup( ) {
        let a = ref( 0 )
    
        //定义 watch 监听属性
        watch( a , ( newValue , oldValue ) => {
            监听属性执行体...
        })
    
        return { a }
      }
    }
    
  • watch 监听多个数据

    import { watch, ref } from "vue";
    export default {
      setup() {
        let a = ref(0);
        let b = ref("xxx");
    
        //定义 watch 监听多个数据
        watch([a, b], (newValue, oldValue) => {
          // newValue: [  ]
          // oldValue: [ 0 , 'xxx' ]
        });
    
        return { a };
      },
    };
    

    当监听的对象为数组形式时,可以同时监听多项数据,同时执行函数中接收到的 newValue 和 oldValue 也变为了数组形式。数组内数据的顺序与定义时,指定监听的多项数据顺序一致。

  • watch 设置项

    设置 immediate、deep 配置项

    watch 接收的第三个参数进行配置

    import { watch , ref } from 'vue'
    export default {
      setup( ) {
        let a = ref( 0 )
    
        //定义 watch 监听属性
        watch( a ,
          ( newValue , oldValue ) => {
              监听属性执行体...
          } ,
          {
            immediate: true, //设置 immediate
            deep: true //设置 deep
          }
        )
    
        return { a }
      }
    }
    
  • 监听对象为 对象 时

    import { reactive , watch } from 'vue'
    export default {
      setup( ) {
        let a = reactive({
          a: 1,
          b: 2
        })
    
        //定义 对象 复杂类型的监听属性
        watch( a ,
        ( newValue , oldValue ) => {
            监听属性执行体...
        },
        {
          immediate: true,
          deep: true //此处为强制开启 deep
        } )
      }
    }
    

    当监听的对象为 reactive 声明的响应式数据时,强制性深度监听内部属性,且无法关闭,即便 deep 为 false 也无效

  • 监听 对象数据中的某一个属性

    import { reactive , watch } from 'vue'
    export default {
      setup( ) {
        let a = reactive({
          a: 1,
          b: 2
        })
    
        //定义 对象 复杂类型中某一属性的监听
        watch( ( ) => a.b ,
        ( newValue , oldValue ) => {
            监听属性执行体...
        } )
      }
    }
    

    需要监听对象中某一个属性时,需要将第一个参数改为函数式写法,这个函数的返回值为需要进行监听的某一个属性。此处返回值为 a.b ,将只会监听对象 a 中的属性 b

  • 监听 对象数据中的某一些属性

    import { reactive , watch } from 'vue'
    export default {
      setup( ) {
        let a = reactive({
          a: 1,
          b: 2
        })
    
        //定义 对象 复杂类型中某一些属性的监听
        watch( [
            ( ) => a.b ,
            ( ) => a.a
         ] ,
        ( newValue , oldValue ) => {
            监听属性执行体...
        } )
      }
    }
    

    将第一个参数改为数组形式,数组中定义多个函数,每个返回值代表监听某一个属性。通过指定多个函数,实现监听对象中的一些属性

  • 特殊情况

    监听 reactive 函数声明的响应式对象数据中的某一项属性,且这项属性为多层结构时,需要开启 deep ,才能监听到深层次中的数据

    import { reactive , watch } from 'vue'
    export default {
      setup( ) {
        let a = reactive({
          a: 1,
          b: 2,
          c: {
            d: {
              e: 3
             }
           }
        })
    
        //定义 对象 复杂类型中某一多层次属性的监听
        watch( ( ) => a.c ,
          ( newValue , oldValue ) => {
              监听属性执行体...
          } ,
          {
            deep: true
          }
        )
      }
    }
    

    此处,当对 a.c.d.e 这个属性进行修改时,且监听的方式为函数返回值的方式进行,则必须配置 deep 为 true 才能监听到属性的变化。而监听的是整个 reactive 声明的对象数据时,则是强制性的开启了 deep 深度监听。

  • 当使用 ref 函数定义复杂数据类型时,实现数据的监听

    import { ref , watch } from 'vue'
    export default {
      setup( ) {
        let a = ref({
          a: 1,
          b: 2
        })
    
        // 方式一 使用 ref 引用实现的 .value
        watch( a.value ,
        ( newValue , oldValue ) => {
            监听属性执行体...
        } )
    
        // 方式二 开启 deep 深度监听
        watch( a ,
        ( newValue , oldValue ) => {
            监听属性执行体...
        } ,
        {
          deep: true
        })
      }
    }
    
上次更新:
贡献者: Roking-wang