JavaScript响应式原理实现

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

javascript响应式原理实现

JavaScript响应式系统的核心是数据变化能自动触发视图更新。实现这一机制的关键在于“监听数据变化”和“依赖收集与派发更新”。目前主流框架如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 -> effectsconst 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 函数包装需要响应式的操作,比如页面渲染。

无阶未来模型擂台/AI 应用平台 无阶未来模型擂台/AI 应用平台

无阶未来模型擂台/AI 应用平台,一站式模型+应用平台

无阶未来模型擂台/AI 应用平台 35 查看详情 无阶未来模型擂台/AI 应用平台

立即学习“Java免费学习笔记(深入)”;

实现一个简单的 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 + 依赖收集,就掌握了现代 JavaScript 响应式的基础。不复杂但容易忽略细节。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/308689.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月5日 04:16:26
下一篇 2025年11月5日 04:21:29

相关推荐

  • Vue.js结合PHP Ajax获取数据时,如何解决数据渲染问题?

    vue.js 与 php 框架中 ajax 获取数据遇到的渲染问题 在 vue.js 框架中,配合 php 后端语言使用 ajax 获取数据时,有时会出现数据无法正常渲染的情况。其中,常见原因之一是数据未正确转换为 javascript 对象。 问题描述 选择项目:立即学习“PHP免费学习笔记(深入…

    2025年12月9日
    000
  • Vue.js与PHP后台交互:AJAX数据渲染失败的原因是什么?

    vue.js 框架和 php 后台:ajax 数据获取后无法正常渲染 在使用 vue.js 作为前端框架和 php 作为后台语言时,通过 ajax 获取数据后可能无法正常渲染到前端页面。该问题可能是由于数据类型转换问题所致。 在 vue.js 中,如果从 php 后端获取的 ajax 响应是一个字符…

    2025年12月9日
    000
  • Vue.js AJAX数据渲染失败:如何正确处理PHP后台返回的数据?

    vue.js:ajax 数据获取渲染异常 本文涉及 vue.js 框架结合 php 后端语言使用 ajax 获取数据并渲染到页面上的问题。 在 vue.js 中,我们通常会通过以下代码来获取后端数据并渲染到视图: 选择项目:立即学习“PHP免费学习笔记(深入)”; // 获取后端数据并渲染this.…

    2025年12月9日
    000
  • Vue.js和PHP交互:Ajax请求数据无法渲染,如何解决?

    vue.js 框架与 php 后台交互,ajax 请求无法正常渲染 在使用 vue.js 框架和 php 作为后台语言时,通过 ajax 获取数据却无法正常渲染在页面上,可能是由于以下问题: 问题根源: 如代码示例所示,在 v-bind:value 绑定数据时,_self.todos = json.…

    2025年12月9日
    000
  • Vue.js Ajax获取数据后渲染异常:如何正确处理PHP返回的JSON数据?

    ajax数据获取后vue.js渲染异常 使用vue.js框架,以php为后端语言,通过ajax获取数据后,在前端页面展示时出现渲染异常。 问题表现: html结构为: 立即学习“PHP免费学习笔记(深入)”; 选择项目: 魔术橡皮擦 智能擦除、填补背景内容 80 查看详情 通过ajax获取到数据后,…

    2025年12月9日 好文分享
    000
  • ‌一文了解:TypeScript和‌JavaScript的主要区别

    JavaScript 和 TypeScript 是两种流行的编程语言,具有不同的特性和优点:类型系统:JavaScript 是弱类型的,而 TypeScript 是强类型的,要求变量指定类型。静态类型检查:JavaScript 是解释型的,并在运行时检测错误,而 TypeScript 是编译型的,并…

    2025年12月9日
    000
  • PHP 与前端技术集成:综合指南

    在 web 开发领域,集成后端和前端技术对于创建动态、交互式和用户友好的 web 应用程序至关重要。 php是一种流行的服务器端脚本语言,已广泛用于后端开发。然而,它与前端技术的集成对于提供无缝的用户体验同样重要。这份综合指南将引导您了解将 php 与前端技术集成的各种方法,重点介绍可以增强您的 w…

    2025年12月9日
    000
  • 开发简易可编程控制器云端管理系统

    这两天在修改云上可编程控制器的管理系统,采用vue作为前端框架,php作为后端开发语言,mysql和redis来存储数据。 redis存储运行过程中的实时数据,比如设备输入输出的实时状态,而mysql存储配置数据,包括用户和设备数据。 前端由云服务器上的物联网网关通过websocket通信进行转发,…

    2025年12月9日
    000
  • Vue请求PHP时PHPSESSID不断变化的原因是什么?

    Vue每次请求PHP时PHPSESSID不断变化的原因 在Vue和PHP Slim框架结合开发中,如果后端请求的PHPSESSID每次都不同,导致前台无法获取到有效会话,造成无法使用会话信息。 根据问题描述,这个问题可能是由于前端使用微信开发,而微信小程序和公众号不支持会话(session)导致的。…

    2025年12月9日
    000
  • UniApp 中如何限制用户每天分享一次?

    在 uniapp 中限制每天分享一次 如何限制 uniapp 应用中的分享功能,使其在每天只允许用户分享一次?这篇文章将详细解答这一问题,并提供可行解决方案。 解决方案: 采用数据库的方式来实现每天只分享一次的限制。 创建一张记录分享信息的表: 表中包含字段,例如 user_id(用户 id)、da…

    2025年12月9日
    000
  • TP5.1 + Vue 项目用户列表无数据:前端数据赋值错误,如何排查?

    tp5.1 + vue 用户列表展示无数据 在使用 TP5.1 + Vue 的项目中,遇到了用户列表展示没有数据的现象。下面详细介绍问题解决过程: 问题描述 Vue 前端页面显示用户列表没有数据。TP5.1 接口成功获取到用户信息。 问题分析 根据前端展示效果和接口返回数据,可以判断问题出在前端。前…

    2025年12月9日
    000
  • ## Vue 中使用 Axios 动态加载数据到 Echarts,为何图表始终为空白?

    vue 中使用 axios 动态加载数据到 echarts 中 在 vue.js 应用中,想通过 axios 从 php 后端获取数据并展示在 echarts 中,但出现数据显示失败的问题。 问题描述 根据提供的代码,可以看出开发者已设置了 echarts 实例并定义了加载数据的 mounted 生…

    2025年12月9日
    000
  • ## Vue 中使用 Axios 获取动态数据显示在 Echarts 时,如何避免图表渲染失败?

    在 vue 中使用 axios 动态获取数据并显示在 echarts 中 在 vue 应用中使用 axios 获取动态数据并将其显示在 echarts 图表中时,有时会出现数据无法显示的问题。要解决此问题,需要对代码进行一些调整。 问题分析 你提供的代码中,在 mounted 生命周期钩子中调用了 …

    2025年12月9日
    000
  • ## Vue 中使用 Axios 和 ECharts 渲染图表时,数据显示不出的问题该如何解决?

    vue 中使用 axios 异步请求并渲染 echarts 图表的常见问题 在 vue 项目中,结合 axios 和 echarts 库加载动态数据并展示图表时,可能会遇到数据显示不出的问题。 问题分析: 根据您提供的代码,问题可能出在以下两方面: 立即学习“前端免费学习笔记(深入)”; 数据请求时…

    2025年12月9日
    000
  • 理解 Laravel 11 中 pluck() 和 select() 之间的区别

    laravel 是最流行的 php 框架之一,提供了一系列强大的数据操作方法。其中,pluck() 和 select() 在处理集合时经常使用。尽管它们看起来相似,但它们的目的不同。在本文中,我们将探讨这两种方法之间的差异,解释何时使用每种方法,并提供实际的编码示例来演示它们在 laravel 11…

    2025年12月9日
    000
  • 善用 PHP 正则表达式,提升字符串处理效率

    正则表达式可有效提升 php 字符串处理效率。通过实战案例,本文展示了如何利用正则表达式:验证电子邮件地址替换字符串中的所有空格从 html 中提取链接匹配特定格式的日期 善用 PHP 正则表达式,提升字符串处理效率 正则表达式是一种强大的文本搜索和替换工具,在处理字符串时可以显著提高 PHP 应用…

    2025年12月9日
    000
  • PHP函数代码风格的在线资源

    PHP 函数代码风格的在线资源 保持一致的代码风格对于代码可读性和可维护性至关重要。对于 PHP,有一些在线资源可以帮助您遵守最佳实践。 PHP_CodeSniffer PHP_CodeSniffer 是一款静态分析工具,可根据一组预定义的规则检查 PHP 代码。它可以检测编码标准违规并建议修复。您…

    2025年12月9日
    000
  • PHP 函数命名规范解读:面向对象命名惯例

    php oop 函数命名规范要求:私有函数以下划线开头。公共方法以小写字母开头。类方法后缀与方法类型匹配(getter:_get、setter:_set、其他:_do)。静态方法以小写字母和下划线开头,后跟方法名称。函数名称应描述功能,明确参数和返回值,避免缩写和混淆术语。 PHP 函数命名规范解读…

    2025年12月9日
    000
  • 自定义函数封装对象和方法

    自定义函数封装对象和方法 简介自定义函数是一种将代码组织成可重用组件的强大技术,可以提高代码的可读性和可维护性。封装是面向对象编程的一项基本原则,它涉及到将数据及其相关方法捆绑成单一对象。 实战案例让我们从一个简单的学生对象开始,该对象包含有关学生姓名、学号和成绩的信息: class Student…

    2025年12月9日
    000
  • php函数跨语言调用实战指导

    #%#$#%@%@%$#%$#%#%#$%@_e1bfd762321e409c++ee4ac0b6e841963c 可通过外部函数接口(ffi)实现与其他语言的跨语言调用。实战案例:安装 ffi 扩展定义 c++ 函数签名加载 c++ 函数库使用 ffi 库调用 c++ 函数,实现从 php 调用其…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信