手写vue3响应系统

简介: 手写vue3响应系统

1.目标:


假设我现在有一个对象obj

let obj = {text:"hello 小明"}

还有一个函数effect

1. function effect (){
2. //document.body.innerHTMl看作是页面上的值
3. document.body.innerHTMl = obj.text
4. }

我们希望修改值obj.text = "hello vue3"时,effect函数页执行,使得页面数据发生变化

想要的效果是修改obj.text的值,页面也跟着变化,这就是响应式

再明确一下目标:修改对象的值,使页面自动更新我们修改的最新值(数据)

2.原理


vue2使用的是obj.defineproperty函数实现,而vue3使用的proxy代理对象实现,这里使用proxy。

完成上述的目的有两个重要的信息:

第一个时当执行effect的时候会触发obj.text的读取操作

第二个是当修改obj.text的时候会触发obj.text的设置操作

当然,重头戏就是代理对象proxy来实现了

3.实现代码


const bucket = new Set() //类数组结构,用来存储effect函数
const data = {text:"hello xiaoming"} //原始数据
const obj = new Proxy(data,{
    //拦截读取操作
    get(target,key){
    //将effect添加到bucket
    bucket.add(effect)
    //返回属性值
    return targrt[key]
         },
    //拦截设置操作
    set(target,key,newval){
    //设置属性值
    target[key] = newval
    //把effect从bucket中取出来并执行
    bucket.forEach(fn => fn())
    //返回true代表设置成功
    return true
    }
})

接下来执行以下看效果

function effect(){
    document.body.innerHTML = obj.text
}
effect()//执行
//过1秒后执行修改,看看页面是否变化
setTimeout(()=>{
    obj.text = "看看修改成功了没有"
},1000)

ps:肯定有人疑问为啥bucket是干嘛的,其实就是为了实现页面变化,细品一下。

这个bucket的作用就是修改dom元素使页面及时变化

要理解proxy”代理“这两个字,举个简单的例子,本来有一个苹果,但是想要的是苹果汁,那么在苹果变成苹果汁的过程可以看作被代理了,这么理解的话,proxy就很容易理解了。

4.小结:


到目前为止,响应式数据完成了,但是不够完善,但这就是响应式原理的最简单实现代码。后续我会写一个完善版的响应式文章。

在上面,我们创建了一个存储副作用的桶bucket,他是set类型。接着定义原始数据类型data,obj是原始数据的代理对象,我们分别设置了get 和 set拦截函数,用于拦截和读取操作。当读取属性时将副作用effect函数放到桶里,即bucket.add(effect),然后返回属性值。当设置属性值时先更新原始数据,然后将副作用函数从桶里取出来并且执行,这样我们就实现了响应式数据。

相关文章
|
2天前
|
存储 JavaScript 开发者
Vue 3 组件通信方式总结
Vue 3 组件通信方式总结
|
2天前
|
JavaScript
在 Vue 3 组件通信方式中,Provide / Inject 与 Vuex 的区别是什么?
在 Vue 3 组件通信方式中,Provide / Inject 与 Vuex 的区别是什么?
|
2天前
|
存储 JavaScript
Vue 3 组件通信方式
Vue 3 组件通信方式
|
1天前
|
JavaScript 前端开发 API
vue3的传送门teleport究竟有多神奇?suspense发起异步请求有多简约?
该文章介绍了Vue3中新特性Teleport和Suspense的使用方法,演示了如何使用Teleport进行DOM节点的非父子关系传送,以及Suspense在处理异步组件加载时的优雅展示和错误处理技巧。
|
1天前
|
JavaScript
particles 粒子背景插件在vue3中的使用
本文介绍了如何在Vue 3项目中使用`particles.vue3`库来创建粒子背景特效。文章提供了粒子背景插件的概述、安装步骤、配置参数说明,并展示了粒子特效的实现效果。同时,提供了在main.js中进行全局配置、在Vue组件中使用粒子背景组件的示例代码,以及完整代码的下载链接。
|
1天前
|
缓存 JavaScript 算法
卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!
该文章深入讲解了Vue3的进阶新特性,包括`watchEffect`的使用、性能优化策略、Vite构建工具的优势以及全局API的变化等内容,帮助开发者更好地掌握Vue3的开发技巧。
卷不动也得继续学!紧跟vue3的步伐,再来get一波进阶新特性!
|
1天前
vue2的响应式原理学“废”了吗?继续观摩vue3响应式原理Proxy
该文章对比了Vue2与Vue3在响应式原理上的不同,重点介绍了Vue3如何利用Proxy替代Object.defineProperty来实现更高效的数据响应机制,并探讨了这种方式带来的优势与挑战。
vue2的响应式原理学“废”了吗?继续观摩vue3响应式原理Proxy
|
1天前
|
JavaScript 前端开发 UED
组件库实战 | 用vue3+ts实现全局Header和列表数据渲染ColumnList
该文章详细介绍了如何使用Vue3结合TypeScript来开发全局Header组件和列表数据渲染组件ColumnList,并提供了从设计到实现的完整步骤指导。
|
1天前
|
JavaScript API
模块化妙用!用vue3实现一个鼠标追踪器和异步加载组件
该文章展示了如何使用Vue3的Composition API实现鼠标追踪器功能,并介绍了创建异步加载组件的方法,利用TS泛型增强了组件的灵活性与可维护性。
|
1天前
|
JavaScript API
卷死了!再不学vue3就没有人要你了!速来围观vue3新特性
该文章强调了学习Vue3的重要性,并详细介绍了Vue3相较于Vue2的新特性与改进,包括Composition API、响应式系统的变化以及其他API的更新等内容。