如何实现一个数据响应系统,具体的流程方法是什么
本篇内容介绍了“如何实现一个数据响应系统,具体的流程方法是什么”的有关知识,在实际项目的操作过程或是学习过程中,不少人都会遇到这样的问题,接下来就让小编带大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
以上就是关于“如何实现一个数据响应系统,具体的流程方法是什么”的相关知识,感谢各位的阅读,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注博信,小编每天都会为大家更新不同的知识。
目录
1、Dep 2、了解 obverser 3、了解 watch 和 observer 4、触发依赖 5、总结一下流程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
存的依赖都执行
以上就是关于“如何实现一个数据响应系统,具体的流程方法是什么”的相关知识,感谢各位的阅读,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注博信,小编每天都会为大家更新不同的知识。
版权声明
本文仅代表作者观点,不代表博信信息网立场。
上一篇:租用低价VPS香港主机要考虑哪些事项?一文带你了解关键要点 下一篇:CSP:买菜