一、什么是响应式
一个物体受到外界的刺激,做出相应反应,就是响应式。
二、Vue 的 data 是响应式的
const vm = new Vue({
data:{n:0}
})
- 如果修改
vm.n
,那么UI中的n就会相应我。 - Vue2通过
Object.definedProperty
来实现数据响应式。
三、Object.definedProperty 是什么
Object.definedProperty
- 可以给对象添加属性、value
- 可以给对象添加getter和Setter
- getter和Setter用于对属性的读写进行监控
用法
let obj = {
姓:'高',
名: '圆圆',
get 姓名() {
return this.姓+this.名
},
set 姓名(xxx) {
this.姓 = xxx[0],
this.名 = xxx.substring(1)
}
}
let _xxx = 0
Object.defineProperty(obj, 'xxx', {
get() {
return _xxx
},
set(value) {
return _xxx = value
}
})
obj.姓名 = '刘诗诗'
console.log(obj)//{姓: "刘", 名: "诗诗"}
四、Object.definedProperty 有一个问题
Object.definedProperty(obj,'n',{...})
- 必须有一个’n’,才能监听或代理obj.n
new Vue({
data: {
obj: {
a:0 //obj.a 会被Vue监听
}
},
template: `
<div>
{{obj.b}}
<button @click="setB">set b</button>
</div>
`,
methods: {
setB() {
this.obj.b=1 //页面不会显示1,因为data里没有b
}
}
}).$mount('#app')
(二)怎么解决这问题
1 把要用的key提前声明好
2 使用Vue.set
或this.$set
作用
- 新增key
- 自动创建代理和监听
- 触发UI更新
示例
this.$set(this.object,'m',100)
五、data中有数组
1 没有办法提前声明key
- 数组的长度可以一直增加,下标就是key
- 所有只剩第二种方法,用set。
- 但是,我们不能每次都用
Vue.set
,数组里的key也许会很多
2 因此尤雨溪篡改了数组API,七个变异方法
- push()
- pop()
- shift()
- unshift()
- splice()
- sort()
- reverse()
小结
这7个API都会被Vue篡改,调用后回更新UI
六、总结
1 对象中新增的key
Vue没有办法事先监听,可以提前写好key,或者用set来新增key,更新UI
2 数组中新增key
- 可以用set
- 但是最好用尤雨溪篡改的7个API,更方便。