新闻中心

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响应式原理实现的详细内容,更多请关注其它相关文章!


# 来实现  # 闵行区专业营销推广中心  # 免费b2b网站推广柠檬视频  # 电影营销推广方案ppt内容  # 潍城抖音seo  # 建材网站怎样推广赚钱的  # 网站静态页面优化  # 昌平网站优化推广哪家好  # 蚌埠企业网站建设  # seo免费咨询营销  # 推广网站有哪些问题  # 回调  # 谁在  # vue  # 解决问题  # 中文网  # 相关文章  # 遍历  # 都能  # 这一  # 自己的  # proxy  # java  # javascript  # react 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Linux如何排查内存不足OOME问题_LinuxOOM分析教程  12306选座怎么选到临时改签座_12306改签选座策略与步骤  qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程  将HTML Canvas内容转换为可上传的图像文件(File对象)  Go语言中动态执行代码字符串的策略与实践  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  Promise错误处理:在catch后终止链式then执行的策略  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  HTML长属性值处理:表单action路径优化与代码规范应对  Python大型XML文件高效流式解析教程  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  c++ 获取系统当前时间 c++时间戳获取方法  星露谷物语官网入口 星露谷物语游戏官网入口  微博网页版主页入口 微博官方网站免登录访问  J*aScript中向JSON对象添加新属性的正确姿势  qq音乐在线播放入口_qq音乐电脑版登录链接  Centos/Linux 系统下安装 composer 的完整步骤  Mac终端命令大全_Mac常用Terminal指令速查  12306怎么选座位选到安静区_12306选座安静区域选择策略  神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正  Vue.js 图片显示异常排查:理解应用挂载范围与DOM ID唯一性  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明  微信群消息显示延迟如何解决 微信群消息刷新优化方法  《噬血代码2》新预告片发布 展示游戏剧情  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  J*aScript数组对象转换:按指定键分组与值收集  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】  最新韩小圈网页版登录入口_官网在线观看官方链接  如何在离线环境中使用Composer_Composer离线安装依赖包的技巧与策略  漫蛙官网正版漫画入口 漫蛙2官方网页登录地址  微博网页版官方账号登录 微博网页版内容浏览使用指南  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用  Win11怎么开启省电模式_Win11电池节电模式自动开启  优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题  Go语言中Map值调用指针接收器方法的限制与应对  汽车之家官方网站官网入口_汽车之家网页版直接进入  c++ dfs和bfs代码 c++深度广度优先搜索算法  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  Android Studio计算器C键功能异常排查与修复教程  如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置  AO3中文官网链接_AO3网页版稳定镜像站  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  在Go Martini框架中高效服务动态生成图像的实践指南 

搜索