vue3+ts,watch函数监听props数据的使用,以及对immediate和deep属性的作用解释记录


前言

在开发过程中遇到这样的需求:子组件接收父组件传过来的数据,如果父组件数据发生变化,子组件也要随之变化。这时我们就要用到vue提供的watch函数监听数据发生变化。

提示:以下是本篇文章正文内容,下面案例可供参考

一、实现步骤

1.在父组件中通过es6语法的冒号“:”给子组件传递数据

代码如下(示例):

<div v-if="stepActive === 1" class="steps-pane">
 <customs-info ref="customsInfoRef" :dec-inner-data="DecInnerdata"/>
</div>

如上代码片段,通过冒号给CustomsInfo子组件传递了一个名为dec-inner-data的参数。

2.在子组件接收参数

代码如下(示例):

const props = defineProps({
  decInnerData: {
    type: Object,
    default: () => {
      return {}
    }
  }
})

首先在子组件通过定义props接收父组件传来的decInnerData数据,该数据是一个对象类型的数据,也就是引用数据类型。

3.在子组件通过watch函数监听值的变化情况

代码如下(示例):

watch(
  () => props.decInnerData,
  (newVal) => {
    if (newVal,oldVal) {
      //这里是数据更新变化后需要执行的动作
      console.log("新数据:",newVal)
      console.log("旧数据:",oldVal)
    }
  },
  { immediate: true, deep: true }
)

大家在刚开始用的时候,可能会不注意遗漏掉watch后面的括号,这个写法是不对的,不会得到响应,在vue3源码中是通过一个getter()函数来获取值变化的,所以括号遗漏掉就不能获取变化值,具体的大家可以去研究一下vue3watch函数实现的源代码。也就是以下的错误示例不会监听得到变化值。
错误代码示例如下:

//不会获得数据变化响应的情况
watch(
  props.decInnerData,
  (newVal) => {
    if (newVal,oldVal) {
      //这里是数据更新变化后需要执行的动作
      console.log("新数据:",newVal)
      console.log("旧数据:",oldVal)
    }
  },
  { immediate: true, deep: true }
)

4.{ immediate: true, deep: true }的作用解释

1.首先我们要知道watch()函数有一个特点,就是在最初绑定数据的时候并不会执行,而是在传递过来的数据发生变化的时候才会执行。如果我们的需求是需要在初始化绑定数据的时候就执行,就可以将watch函数的immediate属性值设为true,反之设为false。

2.watch函数还有一个属性deep,默认值是fasle,意思是是否进行深度监听进行深度监听的话,监听器会一层层的往下遍历,给数据的所有属性都加上这个监听器,但是这样性能开销就会非常大,性能会降低。

假设上面的decInnerData数据有一个info属性,
①如果deep为false,那么info变化时候,监听decInnerData数据会监听不到变化。
②如果deep为true,那么info变化时候,监听decInnerData数据可以监听到变化。
③如果deep为false,immediate为true,那么info变化时候,监听decInnerData,可以监听到一次,后续的变化监听不到。


总结

以上介绍了watch()函数的语法和使用场景,以及对{ immediate: true, deep: true }进行一些解释记录,后面忘记可以回来参考、学习。

  • 51
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue3中,可以使用`watch`函数监听父组件传给子组件的值。根据引用[1]中的代码,子组件通过`defineExpose`暴露了自己的属性`inputVal`和方法`exposeFun`。在父组件中,可以使用`watch`函数监听子组件的属性变化。例如,如果要监听子组件的`inputVal`属性,可以这样写: ```javascript import { watch } from 'vue'; watch(() => SonVue.inputVal, (newVal, oldVal) => { console.log('子组件的inputVal发生变化', newVal, oldVal); }); ``` 这样,当子组件的`inputVal`属性发生变化时,回调函数就会被触发,并打印出新值和旧值。需要注意的是,`watch`函数的第一个参数是一个函数,返回要监听的值,而不是直接传入要监听的值本身。所以在这里,我们使用了箭头函数来返回`SonVue.inputVal`。 另外,根据引用[3]中的代码,`watch`函数还可以监听多个值或对象的属性。如果要监听多个值,可以将这些值放在一个数组中传入`watch`函数。如果要监听对象的属性,可以将一个函数返回这个属性的值。例如,如果要监听子组件的`inputVal`和父组件的`msg`,可以这样写: ```javascript watch([() => SonVue.inputVal, () => msg.value], ([newInputVal, newMsg], [oldInputVal, oldMsg]) => { console.log('子组件的inputVal和父组件的msg任意一个发生变化都触发', newInputVal, oldInputVal, newMsg, oldMsg); }); ``` 这样,当子组件的`inputVal`或父组件的`msg`发生变化时,回调函数就会被触发,并打印出新值和旧值。 总结起来,Vue3中可以使用`watch`函数监听父组件传给子组件的值,可以监听单个值、多个值或对象的属性

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值