什么是数据响应式?优点是?
“响应式”,是指当数据改变后,Vue 会通知到使用该数据的代码。例如,视图渲染中使用了数据,数据改变后,视图也会自动更新。
数据(data)响应式的基本代码:
const vm = new Vue({data:{n:0}})
响应式是vue的一大特色,不同于其他框架更新数据时繁杂操作,数据响应式最大的优点就是只要改了data就会自动更新ui。
数据响应式的缺点
数据响应式由于使用的是Object.defineProperty(vue2)这个api,它不能监听还不存在的属性,所以如果你新增了一个属性,vue是没有办法察觉到的。
看下面的这串代码:
Object.defineProperty(obj,"n",{...})
在上面代码当中必须要有一个 n,才能够监听和代理obj.n。这是Object.defineProperty的bug.如果工作中忘记了给这个n,vue就会给出一个警告,例如:
new Vue({
data: {},
template: `<div>{{n}}</div>`
}).$mount("#app");
上面代码当中,data是一个空的,然后再写了一个n,Vue一旦发现是undefined或者是null它都一律不显示在页面上。
在这里控制台会出现一个报错:“属性或者方法n 没有定义在实例上面,但是你却引用了它。”Vue依然会正常的去执行这些代码,但是当它渲染到div的时候却发现找不到n,所以不能再没有定义n的情况下进行使用。
该怎么解决呢?
vue新提供了解决这个问题的api:Vue.set( target, propertyName/index, value )或者this.$set
参数:
● {Object | Array} target (要更改的数据源(可以是对象或者数组))
● {string | number} propertyName/index (要更改的具体数据)
● {any} value(重新赋的值)
返回值:设置的值。
用法:
向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新。它必须用于向响应式对象上添加新 property,因为 Vue 无法探测普通的新增 property (比如 this.myObject.newProperty = 'hi')
注意:对象不能是 Vue 实例,或者 Vue 实例的根数据对象。
还有一件事,忘记给属性赋值可以用提高记性每次都赋好值来规避这个问题,但是如果想给数组新增它的key,value的值,因为你提前不知道数组到底有多少值,如果用Vue.set会很麻烦,所以Vue改造了push()方法,这种操作叫做变异方法。你可以直接采用push()来增加数组内的东西。