如何实现一个数据响应系统,具体的流程方法是什么
Admin 2022-07-05 群英技术资讯 501 次浏览
其实,这就是一个依赖收集的容器, depend
收集依赖, notify
触发依赖
class Dep{ constructor() { this._subs = []; } depend () { this._subs.push(Dep.target) } notify() { this._subs.forEach(item => { item.fn(); }) } } // 其实就是 dep 和 watcher 基情满满的开始,watcher 中用到 // 通过一个全局属性来存 watcher Dep.target = null; function pushTarget(watch) { Dep.target = watch; } function popTarget() { Dep.target = null; }
递归,将 data 对象所有属性转化为访问器属性
// 转为访问器属性 function defineReactive (obj, key, val, shallow) { // 创建一个依赖收集容器 let dep = new Dep(); let childOb = !shallow && observe(val) Object.defineProperty(obj, key, { enumerable: true, configurable: true, get: function reactiveGetter () { if(Dep.target) { // 收集依赖 dep.depend(); } return val; // ... }, set: function reactiveSetter (newVal) { if(newVal === val) return; // 继续递归遍历 observe(newVal); // 触发依赖 dep.notify(); // ... } }) } class Observer{ constructor(data) { this.walk(data); } walk(data) { const keys = Object.keys(data) for (let i = 0; i < keys.length; i++) { defineReactive(data, keys[i], data[keys[i]]) } } } // 递归,将 data 对象所有属性转化为访问器属性 function observe (data) { if(Object.prototype.toString.call(data) !== '[object Object]') return; new Observer(data); }
此时就可以把任意一个对象的全部属性转为访问器
const data = { a: 1, b: 2 } // 首先监控一个对象 observe(data);
watcher
的主要功能是检测某个属性,当属性变化时触发一个回调
class Watcher{ /** * @params {Function} exp 一个属性表达式 * @params {Function} fn 回调 */ constructor(exp, fn) { this.exp = exp; this.fn = fn; // 存 watcher // Dep.target = this; pushTarget(this); // 先执行一次表达式函数,会在调用过程中, // 触发到 data.a 的访问器, data.a 的 get 被执行, // 触发 dep.depend() 开始收集依赖 this.exp(); // 释放 Dep.target popTarget(); } } // new Watcher 这样一个依赖就被收集了 new Watcher(() => { return data.a + data.b; }, () => { console.log('change') })
data.a = 3; // change data.b = 3; // change
watcher
时,会触发改属性的 get
,get
函数中会把该 watcher
存到该属性的 dep
依赖容器中set
的方法,set
函数中会把 dep
存的依赖都执行免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文依旧给大家分享Javascript设计模式的内容,这篇主要介绍Javascript适配器模式,那么究竟Javascript适配器模式是什么呢?有什么用?如何实现?接下来我们一一了解清楚。
这篇文章主要介绍了怎样在CocosCreator中使用物理引擎关节,对物理引擎感兴趣的同学,着重要看一下
本篇文章给大家带来了关于JavaScript中闭包的相关知识,其中包括从堆栈的角度看待闭包、闭包的共享变量问题等相关问题,希望对大家有帮助。
JavaScript cookie原理及使用实例,什么是cookie?cookie 是本地计算机的临时存储。作用:在浏览器中进行数据的存储,用户名、密码(比如:保存页面信息,自动登录等)。
这篇文章主要为大家详细介绍了vue实现页面添加水印功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008