vue、watch功能对Array和Object的监听oldVal,val新老值一样的解决方案

大家都知道,在vue.js中给我们提供了watch的方法来做对象变化的监听,而且在callback中会返回两个对象,分别是oldValue和newValue.
因为Object是引用类型,所以,如果你在vue中watch一个对象或者数组,那么你收到的新老值是一样的,
我们看下面的例子,组件有一个变量instanceInfo,是一个Object。

export default {
    props: {
        instanceInfo: Object
    },
    watch: {
        instanceInfo:{
            handler(val,oldVal){
                console.log('new:' + val.name, 'old:' + oldVal.name);
            },
            deep:1
        }
    }
};

我们多次修改instanceInfo的name属性,只有第一次新老值不一致,后面多次修改新老对象竟然一致了。


这是因为watch并没有做缓存,遇到基础类型,还好说,遇到引用类型,就无法正确的获取oldVal了。

这时候我们要解决这个问题,就需要用到一个属性,就是computed是有缓存的这个特性。我们就需要借助computed来解决这个问题,

export default {
        props: {
            instanceInfo: Object
        },
        computed: {
            tempObj() {
                return Object.assign({}, this.instanceInfo);
            }
        },
        watch: {
            tempObj: {
                handler(val, oldVal) {
                    if (oldVal) {
                        console.log('new:' + val.name, 'old:' + oldVal.name);
                    }
                },
                deep: true,
                immediate: true
            }
        }
    };

我们把instanceInfo通过在computed里面生成一个模拟变量,返回一个Object.assign新对象,注意一定是新对象,他有独立的引用。
然后我们watch这个在computed里面的tempObj,就可以监听新老值了。


image.png

当然,如果instanceInfo里面的某个属性,是引用类型,这种方法还需要,监听这个属性才能获取新老值。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • vue概述 在官方文档中,有一句话对Vue的定位说的很明确:Vue.js 的核心是一个允许采用简洁的模板语法来声明...
    li4065阅读 12,115评论 0 25
  • 1.引子 在了解vue中的监听器的详细知识前,我们需要先从Vue的一个实例创建来说起。 我们以一个例子作为引子。下...
    SophieRabbit阅读 7,104评论 0 1
  • VUE介绍 Vue的特点构建用户界面,只关注View层简单易学,简洁、轻量、快速渐进式框架 框架VS库库,是一封装...
    多多酱_DuoDuo_阅读 7,727评论 1 17
  • 一:什么是闭包?闭包的用处? (1)闭包就是能够读取其他函数内部变量的函数。在本质上,闭包就 是将函数内部和函数外...
    xuguibin阅读 13,305评论 1 52
  • 一、计算属性(computed) 1、说明 当一些数据需要根据其它数据变化时,需要进行处理才能去展示,虽然vue提...
    唯老阅读 5,805评论 1 4

友情链接更多精彩内容