如何实现一个数据响应系统,具体的流程方法是什么
Admin 2022-07-05 群英技术资讯 616 次浏览
其实,这就是一个依赖收集的容器, 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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了详解node.js创建一个web服务器(Server)的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这篇文章主要为大家详细介绍了js实现图片轮播切换效果,图片自动轮播切换、点击上下键图片切换上下图片等,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这篇文章我们来了解jQuery获得与失去焦点事件的方法,在网站中如果存在一些让用户填写内容的表单元素,那么我们能通过焦点事件和失去焦点事件,来给用户作出一些提示的内容。那么jQuery是如何实现获得与失去焦点事件的呢?接下来就跟随小编来一起学习一下吧!
本篇文章给大家带来了关于javascript的相关知识,其中详细介绍了javaScript三种引入方式行内式,嵌入样式、外部样式及其使用方式;下面一起来看一下,希望对大家有帮助。
怎么使用node实现一个图片拼接插件?下面本篇文章给大家介绍一下使用node封装一个图片拼接插件的方法,希望对大家有所帮助!
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008