Vue动态添加属性到data的实现

一、场景例子


    

{{value}}

效果:点击按钮后,输出的结果中有新添加的新属性,但是页面没有显示新属性。

Vue动态添加属性到data的实现_第1张图片

二、原理分析

vue2使用Object.defineProperty实现数据响应式;

const obj = {}
Object.defineProperty(obj, 'foo', {
        get() {
            console.log(`get foo:${val}`);
            return val
        },
        set(newVal) {
            if (newVal !== val) {
                console.log(`set foo:${newVal}`);
                val = newVal
            }
        }
    })
}
  • 当访问foo属性,或者设置foo值的时候都能触发setter与getter;
  • 但是为obj添加新属性的时候,却无法触发事件属性的拦截
bj.bar = '新属性'

原因是一开始obj的foo属性被设成了响应式数据,而bar是后面新增的属性,并没有通过Object.defineProperty设置成响应式数据

三、解决方案

有三种解决方案:

  • Vue.set()
  • Object.assign()
  • $forcecUpdated()

常用的就是Vue.set(),语法为:Vue.set( target, propertyName/index, value )

Vue动态添加属性到data的实现_第2张图片

到此这篇关于Vue动态添加属性到data的实现的文章就介绍到这了,更多相关Vue动态添加属性内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(Vue动态添加属性到data的实现)