实现一个简单得数据响应系统
程序员文章站
2022-06-17 09:28:43
目录1、dep2、了解 obverser3、了解 watch 和 observer4、触发依赖5、总结一下流程1、dep其实,这就是一个依赖收集的容器, depend 收集依赖, notify 触发依...
1、dep
其实,这就是一个依赖收集的容器, 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; }
2、了解 obverser
递归,将 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); }
此时就可以把任意一个对象的全部属性转为访问器
3、了解 watch 和 observer
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') })
4、触发依赖
data.a = 3; // change data.b = 3; // change
5、总结一下流程
- 把一个对象的全部属性转化为访问器
- 当为某一个属性增加
watcher
时,会触发改属性的get
,get
函数中会把该watcher
存到该属性的dep
依赖容器中 - 当这个属性发生变化时,会出发改属性的
set
的方法,set
函数中会把dep
存的依赖都执行
到此这篇关于实现一个简单得数据响应系统的文章就介绍到这了,更多相关数据响应系统内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
推荐阅读
-
一个简单的php实现的MySQL数据浏览器
-
不到40行代码用Python实现一个简单的推荐系统
-
使用MongoDB和JSP实现一个简单的购物车系统实例
-
一个简单的php实现的MySQL数据浏览器
-
.net实现一个简单的通用查询数据、导出Excel的网页
-
PHP实现的一个简单的数据库操作类
-
typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 连接 postgresql 数据库
-
回顾数据结构(Java版)——写一个简单的循环队列(数组实现)
-
利用Object.defineProperty简单实现vue的数据响应式原理
-
使用MongoDB和JSP实现一个简单的购物车系统实例