vue watch的用法及新旧值一样问题解决

    今天来聊聊vue中的watch的用法。

    vue官网上描述watch是一个侦听器,来响应数据的变化,我们在项目开发中也是经常用到的,watch就是一个监听器,我们把需要监听变化的对象放到watch中,这个对象要在组件中,然后设置数据变化时要执行的函数。

图片

上面是通常的写法,监听函数有两个参数,第一个是新值,第二个是旧值。

    但是watch有几个特点:一:当值第一次绑定时并不会执行监听函数;二:默认情况下,watch不监听不到复杂对象的属性变化。所以针对以上两个特点,watch还提供了handler方法和immediate、deep两个属性来解决以上两个特点带来的问题。

    handler方法就是上图中的function,所以使用的写法是这样的:

图片

immediate的使用也是非常需要的,比如,父组件传值到子组件时,我们在子组件中把传递的值来监听变化,在首次传递时,子组件并不会执行监听函数,但有些场景中,我们又需要在首次传递时也执行监听函数,这个时候我们就可以通过immediate属性来做到,immediate的属性值是bolean类型,true或者false,默认是false。写法很简单,直接加上就可以了。

图片

另外,在有些时候我们修改一个复杂对象的属性,但是watch中,并没有监听到,导致这个问题的原因很可能就是watch的第二个特性导致的,要避免这个问题,解决方法也很简单,把deep属性设置为true即可,也是直接加上就可以了:

图片

在以上的基础上,有时候可能还会发现一个奇怪的问题,我们监听复杂对象的属性变化时,值变化,监听函数也执行了,但是,我们得到的新旧值是一样的,也就是说虽然监听到对象属性的变化,但是,监听函数中的newVal和oldVal是一样的,当我们需要拿新值和旧值做比较的时候就没办法了。比如,一个复杂的对象,我们给对象新增属性或者删除属性时,就可能出现这个问题。例如:我们给表格新增一行

图片

图片

我们点击新增一行,给表格添加一行数据时,我们就会发现watch中的新值和旧值就是一样的。

图片

我们查找官网上watch的文档,有下面一段解释:

图片

也就是说,watch监听到对象的变化,但是在对对象或数组做变更操作时,删除或添加属性,监听函数中的新值和旧值都指向了同一个对象或数组,并且Vue不会保留变更之前的副本。这种情况下我们怎么拿到旧值呢?还是有办法的,我们可以再设置一个计算属性,保存tableData为副本,然后监听这个副本的变化:

图片

然后点击新增一行,我们在打印中可以看出新值和旧值不一样了。

图片

  以上内容来自微信公众号 ‘HTML开发学习’,会分享一些前端的学习心得及总结,欢迎大家关注。

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​       

 

 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3中可以使用watch函数来监听Pinia的变化。在Pinia中,我们可以通过使用$subscribe方法来订阅监听。首先,需要导入所需的Pinia store,并创建store实例。然后,使用ref函数创建一个响应式的变量,用于保存需要监听的Pinia的。在$subscribe的回调函数中,可以获取到mutation和state,通过state可以获取到需要监听的。在回调函数中,可以对新旧进行处理或执行相应的逻辑。以下是一个示例代码: ```javascript import { useMapStore } from '@/store/index.js' import { ref } from 'vue' const mapStore = useMapStore() const bgurl = ref('') mapStore.$subscribe((mutation, state) => { bgurl.value = state.currentSkin === 'dark' ? 'url(\'../light-dark.svg\')' : 'url(\'../light-white.svg\')' }) // 在这里,bgurl变量会根据currentSkin的变化而更新 ``` 在上述代码中,我们首先导入了所需的Pinia store,并创建了store实例。然后,使用ref函数创建了一个名为bgurl的响应式变量。接下来,通过调用$subscribe方法,传入一个回调函数来订阅监听。在回调函数中,我们可以获取到mutation和state。通过state.currentSkin可以获取到需要监听的Pinia的,然后根据其变化对bgurl进行更新。这样,在Pinia的变化时,bgurl变量会得到相应的更新。123 #### 引用[.reference_title] - *1* *2* [vue3 watch 监听多以及深度监听用法](https://blog.csdn.net/m0_67401761/article/details/123433510)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [Vue3组件不发生变化,如何监听pinia中数据变化?](https://blog.csdn.net/weixin_58195668/article/details/129275407)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值