vue3 watch监听函数的使用方法汇总

46 篇文章 1 订阅
25 篇文章 1 订阅

watch介绍

 vue中watch用来监听数据的响应式变化.获取数据变化前后的值

 watch监听器可以监听一个getter函数,这个getter要返回一个响应式对象

当该对象更新后,会执行对应的回调函

// watch的完整入参

watch(监听的数据,副作用函数,配置对象)
watch(data, (newVal, oldVal) => {}, {immediate: true, deep: true})

watch监听的不同场景

import { ref, watch, reactive } from "vue";

// 创建响应式数据
let name = ref("小红");
let age = ref(18);
let state = reactive({
  sex: "女",
  city: {
    hainan: {
      haikoushi: "海口市",
    },
  },
});

监听单个refimpl数据

watch(name, (newName, oldName) => {
  console.log("newName", newName);
});

监听多个refimpl数据,任何一个响应式对象更新,就会执行回调函数

 方式一:vue3允许多个watch监听器存在

watch(name, (newValue, oldValue) => {
  console.log("new", newValue, "old", oldValue);
});

watch(age, (newValue, oldValue) => {
  console.log("new", newValue, "old", oldValue);
});

 方式二:将需要监听的数据添加到数组

//第一种写法
watch([name, age], (newValue, oldValue) => {
  // 返回的数据是数组
  console.log("new", newValue, "old", oldValue); 
  //[newName, newAge] [oldName, oldAge]
});
//还有第二种写法
watch([name, age], ([newName, newAge], [oldName, oldAge]) => { 
})

监听proxy数据

 监听 reactive 定义的响应式数据

 此时vue3将强制开启deep深度监听
 当监听值为proxy对象时,oldValue值将出现异常,此时与newValue相同

  newValue=== oldValue,根本就是同一个内容地址,就是对象本身

// 监听proxy对象
watch(state, (newValue, oldValue) => {
  console.log("newValue", newValue, "oldValue", oldValue);
});

监听proxy数据的某个属性

需要将监听值写成函数返回形式,vue3无法直接监听对象的某个属性变化 

监听的属性值是基本类型数据,需要写成函数返回该属性的方式才能监听到

watch(
  () => state.sex,
  (newValue, oldValue) => {
    console.log("newValue",newValue, "oldvalue", oldValue);
  }
);

 当监听proxy对象的属性为复杂数据类型时,需要开启deep深度监听

watch(
  () => person.city,
  (newvalue, oldvalue) => {
    console.log("person.city newvalue", newvalue, "oldvalue", oldvalue);
  },{ deep: true , immediate: true }
);

监听proxy数据的某些属性

watch([() => state.age, () => state.name], (newValue, oldValue) => {
  // 此时newValue为数组
  console.log("state.age", newValue, oldValue);
});

watchEffect的使用

watchEffect会立即执行;

不需要手动传入所需要监听的数据;

接收的参数为一个回调函数;

只能获取新值,无法获取修改之前的值

// 监听数据
watchEffect(() => {
  console.log(state.sex,'--',state.city)
});

停止监听

// 监听数据
let stop = watchEffect(() => {
  console.log(state.sex,'--',state.city)
  setTimeout(()=>{
     stop();
  },3000);
});

总结

 监听reactive定义的proxy代理数据时

oldValue无法正确获取

强制开启deep深度监听(无法关闭)

监听reactive定义的proxy代理对象某个属性时deep配置项生效

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值