信息发布→ 登录 注册 退出

J*aScript响应式原理实现

发布时间:2025-10-30

点击量:
响应式系统通过Proxy拦截数据操作,利用track和trigger实现依赖收集与更新。当读取属性时收集副作用函数,修改属性时触发对应更新,结合effect建立响应式联系,从而自动同步数据与视图。

javascript响应式原理实现

J*aScript响应式系统的核心是数据变化能自动触发视图更新。实现这一机制的关键在于“监听数据变化”和“依赖收集与派发更新”。目前主流框架如Vue 2.x使用Object.defineProperty,Vue 3则改用Proxy来实现响应式。下面通过一个简化版的实现帮助理解其原理。

1. 使用 Proxy 拦截对象操作

Proxy 可以代理整个对象,拦截 get、set、delete 等操作,比 Object.defineProperty 更强大。

示例代码:

function reactive(target) {
  return new Proxy(target, {
    get(obj, key) {
      // 收集依赖(谁在读这个属性)
      track(obj, key);
      return Reflect.get(obj, key);
    },
    set(obj, key, value) {
      // 触发更新(属性变化后通知更新)
      const result = Reflect.set(obj, key, value);
      trigger(obj, key);
      return result;
    }
  });
}

2. 依赖收集与更新触发

当读取属性时记录当前副作用函数(如渲染函数),当属性变化时重新执行这些函数。

定义两个核心函数 track 和 trigger:

// 存储依赖关系:target -> key -> effects
const targetMap = new WeakMap();

function track(target, key) {
  if (!activeEffect) return; // 没有正在执行的副作用
  let depsMap = targetMap.get(target);
  if (!depsMap) {
    depsMap = new Map();
    targetMap.set(target, depsMap);
  }
  let dep = depsMap.get(key);
  if (!dep) {
    dep = new Set();
    depsMap.set(key, dep);
  }
  dep.add(activeEffect); // 收集当前 effect
}

function trigger(target, key) {
  const depsMap = targetMap.get(target);
  if (!depsMap) return;
  const dep = depsMap.get(key);
  if (dep) {
    dep.forEach(effect => effect());
  }
}

3. 副作用函数与响应式执行

使用 effect 函数包装需要响应式的操作,比如页面渲染。

千帆AppBuilder 千帆AppBuilder

百度推出的一站式的AI原生应用开发资源和工具平台,致力于实现人人都能开发自己的AI原生应用。

千帆AppBuilder 208 查看详情 千帆AppBuilder 实现一个简单的 effect 函数:

let activeEffect = null;

function effect(fn) {
  const effectFn = () => {
    activeEffect = effectFn;
    fn(); // 执行函数,触发 getter,从而收集依赖
    activeEffect = null;
  };
  effectFn(); // 立即执行一次
  return effectFn;
}

使用示例:

const state = reactive({ count: 0 });

effect(() => {
  console.log('count 更新了:', state.count);
});

state.count++; // 输出: count 更新了: 1

4. 完整流程梳理

响应式系统的执行流程如下:

  • 调用 reactive 创建响应式对象,通过 Proxy 拦截 get/set
  • 执行 effect 函数时,将回调赋值给 activeEffect
  • 读取属性触发 get,track 收集 activeEffect 到依赖集合
  • 修改属性触发 set,trigger 遍历并执行所有依赖函数

基本上就这些。虽然实际框架中还有调度器、计算属性、嵌套对象处理等优化,但核心思想一致:依赖追踪 + 自动更新。理解 Proxy + effect + 依赖收集,就掌握了现代 J*aScript 响应式的基础。不复杂但容易忽略细节。

以上就是J*aScript响应式原理实现的详细内容,更多请关注其它相关文章!


相关文章: 如何在Python中使用Optional类型处理可变对象并避免Pylint警告  Python多版本共存与虚拟环境管理深度指南  qq邮箱日历功能怎么用_创建日程与会议邀请的技巧  优化大型XML文件解析:基于Python流式处理的内存高效方案  解决Bootstrap卡片顶部边距导致背景图下移的问题  铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则  在Typer应用中优雅地处理和重组任意命令行参数  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  Pyrogram与g4f集成:异步编程实践与常见错误解决  J*aScript map 方法中处理循环元素为空数组的策略  C++如何跨平台操作文件和目录_C++17标准库std::filesystem的使用教程  天眼查企业查询官网入口 天眼查官方网页版查询  sublime侧边栏怎么增强功能_SideBarEnhancements for sublime安装与配置  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  composer 和 npm/yarn 在管理依赖方面有什么核心思想差异?  J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析  三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】  Python模块化编程:有效管理依赖与避免循环引用  Yii2模块参数配置指南:正确声明与访问模块级配置  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  XML中包含HTML标签导致解析错误? 正确嵌入非XML数据的两种方法  我的世界官方游戏入口 我的世界官网平台直达链接  MongoDB聚合管道:正确匹配对象数组中_id的方法  mc.js游戏直达 mc.js网页免下载版本秒进地址  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  J*aScript Promise链中如何正确终止后续.then执行并处理错误  J*aScript对象创建方式_J*aScript设计模式应用  J*aScript 字符串标签转换:使用正则表达式高效替换  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站  mysql如何设置表访问权限_mysql表访问权限配置  想当下一个《2077》?《心之眼》Steam评价升至"多半好评"  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  Tailwind CSS line-clamp 布局问题解析与修复指南  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  优化 Jest 模拟:强制未实现函数抛出错误以提升测试效率  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  漫蛙2(台版)官方入口地址 漫蛙2(台版)正版漫画网页端  优化MinIO list_objects_v2 操作的性能瓶颈与最佳实践  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  WooCommerce产品页高级定制:实现基于分类的交叉销售  铁路12306的积分有效期是多久_铁路12306积分有效期说明  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  学习通网页版快速入口 学习通官网网页版直接打开  Python中高效且防溢出的双曲正弦计算:基于对数空间的优化策略  抖音创作助手登录入口_抖音创作辅助工具官网直达 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!