手写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),然后返回属性值。当设置属性值时先更新原始数据,然后将副作用函数从桶里取出来并且执行,这样我们就实现了响应式数据。

相关文章
|
9天前
|
缓存 监控 UED
升级 Vue3 时,如何减少打包体积的增加?
升级 Vue3 时,如何减少打包体积的增加?
92 59
|
9天前
|
API UED
如何实现Vue2项目升级Vue3?
如何实现Vue2项目升级Vue3?
95 59
|
8天前
|
JavaScript
在vue3中(vite)引入unocss,安装配置unocss
在vue3中(vite)引入unocss,安装配置unocss
|
9天前
|
API UED
升级 Vue3 后,项目的打包体积会有什么变化?
升级 Vue3 后,项目的打包体积会有什么变化?
99 57
|
9天前
|
缓存 JavaScript 前端开发
「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系
该文章全面覆盖了Vue.js从基础知识到进阶原理的48个核心知识点,包括Vue CLI项目结构、组件生命周期、响应式原理、Composition API的使用等内容,并针对Vue 2与Vue 3的不同特性进行了详细对比与讲解。
「offer来了」从基础到进阶原理,从vue2到vue3,48个知识点保姆级带你巩固vuejs知识体系
|
11天前
|
JavaScript 前端开发 API
vue3的传送门teleport究竟有多神奇?suspense发起异步请求有多简约?
该文章介绍了Vue3中新特性Teleport和Suspense的使用方法,演示了如何使用Teleport进行DOM节点的非父子关系传送,以及Suspense在处理异步组件加载时的优雅展示和错误处理技巧。
|
11天前
|
JavaScript
particles 粒子背景插件在vue3中的使用
本文介绍了如何在Vue 3项目中使用`particles.vue3`库来创建粒子背景特效。文章提供了粒子背景插件的概述、安装步骤、配置参数说明,并展示了粒子特效的实现效果。同时,提供了在main.js中进行全局配置、在Vue组件中使用粒子背景组件的示例代码,以及完整代码的下载链接。
|
10天前
|
JavaScript API
再不学vue3就没有人要你了!速来围观vue3
这篇技术文章介绍了作者从最初对学习 Vue3 抵触到最终决定投入学习的心路历程,展示了 Vue3 相较于 Vue2 的诸多改进和新特性,如更优的性能、更小的代码体积及更佳的 TypeScript 支持。文章重点阐述了 Vue3 中 createApp 的使用变化、emits 机制、多事件处理、Fragment 的引入等重要功能升级。此外,还深入探讨了 Composition API 和 Options API 的区别,强调 Composition API 在代码组织和逻辑复用方面的优势,并给出了在不同项目规模中选择合适 API 的建议。
23 0
|
11天前
|
JavaScript 前端开发 UED
组件库实战 | 用vue3+ts实现全局Header和列表数据渲染ColumnList
该文章详细介绍了如何使用Vue3结合TypeScript来开发全局Header组件和列表数据渲染组件ColumnList,并提供了从设计到实现的完整步骤指导。
|
11天前
|
JavaScript API
模块化妙用!用vue3实现一个鼠标追踪器和异步加载组件
该文章展示了如何使用Vue3的Composition API实现鼠标追踪器功能,并介绍了创建异步加载组件的方法,利用TS泛型增强了组件的灵活性与可维护性。