Vue3.0响应式原理
最近几个月一直在搞脚手架工具,学习时间少了不少,感觉理论学习落下了很多,vue3就要发布了自己还没看过源码,所以决定研究一波。第一步当然是要把他的源码下载下来,https://github.com/vuejs/vue-next。我们可以将项目跑起来,可以看到生成了dist目录,在html文件中引入,我们就可以使用vue3啦,可以体验一波compositionApi。可以看到package文...
·
最近几个月一直在搞脚手架工具,学习时间少了不少,感觉理论学习落下了很多,vue3就要发布了自己还没看过源码,所以决定研究一波。
第一步当然是要把他的源码下载下来,https://github.com/vuejs/vue-next。我们可以将项目跑起来,可以看到生成了dist目录,在html文件中引入,我们就可以使用vue3啦,可以体验一波compositionApi。
可以看到package文件夹下的reactivity,很明显这就是我们要找的东西了,响应式实现的源码就在这里。
- 基于Proxy和Reflect,可以原生监听数组,可以监听对象属性的添加和删除。
- 不需要一次性遍历data的属性,可以显著提高性能。
- 因为Proxy是ES6新增的属性,有些浏览器还不支持,只能兼容到IE11 。
-
Vue3.0基于Proxy来做数据的劫持代理,可以原生支持到数组的响应式,不需要重写数组的原型,还可以直接支持新增和删除属性, 比Vue2.x的Object.defineProperty更加的清晰明了。
核心代码(非常少)
let data = {
name: "zhangsan",
age: 20
};
const handler = {
get: function (target, key, receive) {
// 只处理本身(非原型)的属性
const ownKeys = Reflect.ownKeys(target)
if (ownKeys.includes(key)) {
console.log('get', key) // 监听
}
const result = Reflect.get(target, key, receive)
return result
},
set: function (target, key, val, reveive) {
// 重复的数据,不处理
const oldVal = target[key]
if (val == oldVal) {
return true
}
const result = Reflect.set(target, key, val, reveive)
console.log(result)
return result
},
// 删除属性
deleteProperty: function (target, key) {
const result = Reflect.deleteProperty(target, key)
return result
}
};
data = new Proxy(data, handler);
data.name = 'lisi'
console.log(data.name)
可以复制下来在控制台体验一下。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献2条内容
所有评论(0)