使用 Javascript 从头开始构建反应式商店
响应式编程是一种巧妙的方法,允许您创建动态反映数据更改的应用程序。它是 react 和 vue 等许多现代 javascript 框架背后的核心技术 - 它会根据用户操作或其他状态变化进行更新。理解反应性背后的内容可能感觉工作量太大,感觉就像框架所针对的“神奇”抽象之一。但是,如果您可以自己构建一个小型反应式系统来看看它是如何工作的呢?
本文将通过使用 javascript 从头开始构建一个简单的反应式存储来介绍反应式编程的基础知识。我们将以最小的实现方式介绍关键概念,包括依赖性跟踪和自动更新。最后,您应该能够了解如何创建反应式数据结构,以便在状态发生变化时自动跟踪依赖关系并触发更新。这种方法将帮助您理解反应性,并为您提供自行实验的工具,并可能将其应用到您的项目中。
让我们开始看看我们将要使用的反应式系统的核心组件:
- 效果:自动运行以响应反应数据变化的函数。它们是使用效果函数注册的,该函数跟踪对任何访问信号的依赖关系。
- 信号:反应性数据属性,每当其值发生变化时通知依赖效应。
- 依赖性:信号和依赖于它们的效果之间的关系。跟踪依赖关系,以便信号的变化触发相关效果的更新。
现在我们已经了解了响应式编程定义,让我们也提一下我们将要使用的 javascript api:
proxy:proxy 对象允许您为另一个对象创建代理,使您能够为基本操作(如属性访问和分配)定义自定义行为。在此代码中,它用于使反应式存储(状态对象)响应更改。
reflect:reflect api 提供可拦截 javascript 操作的方法。它用于在响应式函数中执行诸如 reflect.get 和 reflect.set 之类的操作,从而允许代理处理属性访问和赋值,同时保持对象的原始行为。
map:map 对象是一个保存键值对的集合,其中键可以是任何数据类型。在此实现中使用它来创建 dependencymap,该依赖关系跟踪与每个信号关联的依赖关系。
现在,让我们开始定义我们的初始状态:
// let's define a map object to track our dependencies const dependencytrackermap = new map(); // the activeeffect variable will hold the currently executing // effect function. // it will be set when an effect is run and will be used // to track which effects depend on specific reactive properties. let activeeffect = null // this function will make an object reactive function reactive(target) { return new proxy(target, { get(obj, prop) { trackdependency(prop); // track dependency return reflect.get(obj, prop); }, set(obj, prop, value) { const result = reflect.set(obj, prop, value); triggerdependency(prop); // trigger reactions return result; } }); } // the effect function will register reactive functions function effect(fn) { activeeffect = fn; fn(); // run the function once to register dependencies activeeffect = null; } // this function will track dependencies function trackdependency(key) { if (activeeffect) { if (!dependencytrackermap.has(key)) { dependencytrackermap.set(key, new set()); } dependencytrackermap.get(key).add(activeeffect); } } // this function will trigger dependencies function triggerdependency(key) { const deps = dependencytrackermap.get(key); if (deps) { deps.foreach(effect => effect()); } } // this will create a reactive object with an initial state // count and message here are signals const state = reactive({ count: 0, message: "hello" });
- 东莞网络营销外包:专业团队助力···
- 人才招聘网建站系统中,企业如何···
- 中小型企业如何策划全网营销方案···
- 海外好物轻松购:打造专属代购网···
- 如何下载淘宝应用?
- 好用到飞起!四款神器助你高效改···
- SEO优化,七步到位,效果显著···
- 珠海神马SEO推广价格解析:如···
- 苏州网站优化,快速提升企业网络···
- 微信小程序:view(视图容器···
- 800元建站小程序:选择模板时···
- 专业的SEO接入:为您的网站提···
- notepad++如何给选中文···
- 新疆农业大学,一本名校,实力雄···
- “关键词成本速算公式”
- SEO利器,网站排名加速站
- 高流量下,大型网站对服务器网络···
- SEO综合查询网站入口速查
- dedecms怎么换水印
- 网店推广新风向,紧跟潮流趋势!
- 如何快速生成ASP一键建站模板···
- 获取友情链接,轻松对接!
- 如何用 Nginx 将子网站路···
- 超级外链发布工具:网站优化的秘···
- PHPCMS能用Vue开发吗?
- 抖音连麦怎么做?
- 珠海视频端SEO优化方法:提升···
- 为什么选择VPS建站后安全问题···
- 网界新纪元
- 品牌升级,网络领航,竞争力飞跃
- thinkphp如何实现全选和···
- 人力外包与派遣服务
- 在北京进行互联网建站时,如何确···
- 阳山SEO优化专家
- 没本钱怎么在手机一天赚500?···
- 抖音IP属地定位实时吗?如何设···
- 免费AI一键生成文章,让写作轻···
- 珠海SEO计费管理,助力企业数···
- 微信小程序在本地提取数据的方法···
- 云服务器与建站主机在安全性方面···
- SEO网站优化服务:让您的网站···
- 市场破冰,产品速推!
- 搜狗收录量提高怎么不显示出来?···
- AI智能生成的文章算原创吗?深···
- SEO搜索推广技巧,快速提升网···
- 淘宝联盟如何快速招募6个新成员···
- linux 不能输入中文怎么办
- 2021年不能错过的10个实用···
- tp5不能访问index.ph···
- 微信流量凸显小程序价值