vue2的响应式
- 实现原理:
- 对象类型:通过
Object.defineProperty()
对属性的读取、修改进行拦截(数据劫持) - 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)
- 对象类型:通过
1 | Object.defineProperty(data, 'count', { |
- 存在问题:
- 新增属性、删除属性, 界面不会更新
- 直接通过下标修改数组, 界面不会自动更新
Vue3的响应式
- 实现原理:
1 | const p = new Proxy(data, { |
- 通过Object.defineProperty去操作
- 使用try…catch… 来捕获错误
1
2
3
4
5
6
7
8
9
10let obj = {a:1,b:2}
try {
Object.defineProperty(obj,'c',{
get(){
return 3
}
})
} catch (error) {
console.log(error)
}
- 使用try…catch… 来捕获错误
- 通过Reflect.defineProperty去操作
- 与 Object.defineProperty操作 差不多,但不需要try…catch…
- 并且 Reflect.defineProperty 是存储到变量里,并通过条件判断来提示