当前位置: 首页 > news >正文

Vue响应式系统的简单实现

一、什么是副作用函数和响应式数据?

副作用函数: 可以产生副作用的函数,那么什么是副作用呢?举个栗子:

let count = 1

function effect() {
  count++
}

function fn() {
  if (count == 1) {
    console.log('执行1')
  } else {
	console.log('执行2')
  }
}
effect()
fn()

当执行effect函数时会修改全局变量count的值,count值的修改就是effect函数执行带来的副作用,由于count变量被effect、fn函数所共享,effect函数修改了count值后会对fn函数产生影响,即effect函数的执行对fn函数产生了副作用。

响应式数据: 当数据发生变化时会触发相关副作用函数自动执行,我们将这样的数据称为响应式数据。比如下面的例子,一开始obj.title的值为 首页,而后修改obj.title的值为详情页,当修改了obj.title的值之后若effect函数自动执行,则称obj为响应式数据。

const obj = { title: '首页' }
function effect() {
  document.body.innerText = obj.title
}
obj.title = '详情页'

二、响应式数据的简单实现

首先我们要清楚对象操作的基本语意:

  1. 读取” 操作又称之为 get
  2. 设置” 操作又称之为 set
    我们可以通过Proxy代理目标对象的读取设置操作,读取和设置操作的语意比较宽泛,在这里只介绍比较简单的getset,我们来看下面这个例子:
// 桶,用于存储代理对象和副作用函数之间的对应关系
const bucket = new Set()
// 用于存储临时的副作用函数
const activateEffect = null

const data = {
  num: 1
}

function effect(fn) {
  activateEffect = fn
  fn()
}
function track() {
  if (!activateEffect) {
    return
  }
  bucket.add(activateEffect)
}

function trigger() {
  bucket.forEach(fn => fn())
}
const proxy = new Proxy(data, {
  get(target, key, receiver) {
    track()
    return Reflect.get(target, key, receiver)
  },
  set(target, key, value, receiver) {
    trigger
    return Reflect.set(target, key, value, receiver)
  }
})

effect(() => console.log(proxy.num))
proxy.num++

上述例子中实现了一个简单的响应式功能,当读取proxy代理对象的属性时,代理对象中的get方法会收集副作用函数,当设置proxy对象的属性时set方法中的trigger函数会触发副作用函数的执行。但例子中的响应式系统还存在缺陷,作者还会不断完善。

相关文章:

  • 机器学习 从入门到精通 day_01
  • 文件存储的路径简单分析
  • 使用Prometheus监控systemd服务并可视化
  • Completablefuture的底层原理是什么
  • 优艾智合人形机器人“巡霄”,开启具身多模态新时代
  • GeoTime:主要用于执法、公共安全和情报分析领域GIS软件
  • AI训练存储架构革命:存储选型白皮书与万卡集群实战解析
  • git `switch` 命令详解与实用示例
  • 图论----拓扑排序
  • MyBatis的第三天笔记
  • VSCode使用Remote-SSH连接服务器时启动失败glibc不符合
  • Java学习——day23(反射的对象创建与方法调用)
  • Text-to-SQL技术深度解析:从理论突破到工程实践
  • Jmeter+Jenkins+Ant自动化持续集成环境搭建
  • [ctfshow web入门] web7
  • PyQt6实例_A股日数据维护工具_完整项目代码_终结章
  • Gis相关记录备忘录
  • 软件工程第五章习题
  • 15-产品经理-维护需求
  • redis 和 MongoDB都可以存储键值对,并且值可以是复杂json,用完整例子分别展示说明两者在存储json键值对上的使用对比
  • “共栖与绵延”系列对话|张国捷、刘帅:以蚁为序的生命网络
  • 以色列“全面接管”加沙“雷声大雨点小”:援助政策引内讧,美欧失去耐心
  • 中方敦促美国停止将溯源问题政治化
  • 北师大发布《短视频家长指南》,回应短视频时代家庭教育挑战
  • 最高法:政府信息公开案件审理应避免泄露国家秘密、商业秘密
  • 文化破冰,土耳其亚美尼亚合拍摄影大师阿拉·古勒传记片