Vue中watch的高级用法

1、深度监听(deep): 当需要监听一个嵌套对象内部属性的变化时,可以设置deep: true。

data() {
  return {
    nestedObj: {
      a: 1,
      b: {
        c: 2,
        d: [3, 4]
      }
    }
  };
},
watch: {
  // 使用深度监听
  nestedObj: {
    handler(newNestedObj, oldNestedObj) {
      console.log(newNestedObj);
    },
    deep: true
  }
}

当nestedObj内的任意层级属性发生变化,比如nestedObj.b.c = 3或者nestedObj.b.d.push(5),都会触发handler函数。

2、immediate: 通过设置immediate: true,可以在定义watcher时立即执行一次handler函数,而不只是在值发生改变时才执行。

data() {
  return {
    initialValue: 0, // 从服务器获取的数据或者是一个默认值
    computedValue: null // 这是我们基于initialValue计算出的值,需要在初始和后续变化时更新
  };
},
created() {
  // 如果没有使用immediate,这里可能需要手动触发一次计算逻辑
  // this.updateComputedValue();
},
watch: {
  // 使用immediate选项
  initialValue: {
    handler(newVal, oldVal) {
      this.computedValue = newVal * 2; // 示例:简单地将初始值乘以2作为计算结果
      console.log('Initial or updated value:', newVal, ', Computed value:', this.computedValue);
    },
    immediate: true // 开启后,会在watcher绑定后立即执行handler函数
  }
}

由于设置了immediate: true,当组件实例创建并开始挂载(即created钩子执行)时,watch中的handler函数会立刻执行一次,即使initialValue尚未发生变化。这意味着首次加载页面时,我们将根据initialValue的初始值来计算并设置computedValue的值。随后,每当initialValue发生变化时,handler函数都会再次被执行。

3、处理多个属性变化(数组形式): 可以同时监听多个属性,并使用同一个handler来处理这些属性的变化。

data() {
  return {
    propA: 'Initial A',
    propB: 'Initial B'
  };
},
watch: {
  ['propA', 'propB']: function(newValues, oldValues) {
      const [newPropA, newPropB] = newValues;
      const [oldPropA, oldPropB] = oldValues;

    // 可以根据新的值执行相应的逻辑
    // ...
  }
},

4、异步监听器:如果需要在数据变化后进行异步操作,可以将handler声明为返回Promise的函数,Vue将会等待Promise解决或拒绝后再进行下一个状态更新。

data() {
  return {
    // 定义异步属性
    asyncProp: '初始值',
    // 定义一个状态变量来跟踪异步操作是否完成
    asyncOperationStatus: ''
  };
},
watch: {
  async asyncProp(newValue, oldValue) {
    // 等待异步操作完成
    await this.performAsyncOperation(newValue);

    // 在异步操作完成后可以执行其他逻辑
    console.log('异步操作已结束。');
  }
},
methods: {
  // 模拟一个异步操作(例如API调用或长时间计算)
  async performAsyncOperation(newValue) {
    // 使用setTimeout模拟2秒的延迟
    await new Promise((resolve) => setTimeout(resolve, 2000));

    // 打印出新值,表示异步操作已使用该值完成
    console.log('使用新值:“' + newValue + '”完成异步操作。');
  }
}

5、 函数式监听器:直接提供一个函数作为watch对象的键,而不是一个字符串,这样可以动态决定要监听哪个属性。

data() {
  return {
    selectedMetric: 'metricA',
    metricsData: {
      metricA: { value: 0 },
      metricB: { value: 50 },
      // 更多指标...
    }
  };
},
watch: {
  // 动态监听当前选中的度量指标的数据变化
  [function () {
    return `metricsData.${this.selectedMetric}.value`;
  }]: function(newValue, oldValue) {
    console.log('Selected metric value changed:', oldValue, '->', newValue);
    // 在这里执行与选定指标值变化相关的逻辑
  }
}
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值