如何实现一个数据响应系统,具体的流程方法是什么
Admin 2022-07-05 群英技术资讯 943 次浏览
本篇内容介绍了“如何实现一个数据响应系统,具体的流程方法是什么”的有关知识,在实际项目的操作过程或是学习过程中,不少人都会遇到这样的问题,接下来就让小编带大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!其实,这就是一个依赖收集的容器, 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进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
目录前言FabricObject 基类的实现抽离共同属性抽离共同方法Rect 类的实现本章小结前言在上个章节中我们已经创建了画布,接下来就可以进行物体的绘制了,那具体要怎么画呢?根据文章标题可以猜到应该是要抽象出一个物体基类,归纳出一些它们的共性,那它们能有啥共性呢,毕竟每个物体好像都是各画各的。对于这个问题大家可以先
这篇文章主要给大家分享jquery实现记分进度条效果的内容,感兴趣的朋友可以借鉴参考一下,希望大家阅读完这篇文章能有所收获,下面我们一起来学习一下吧。
开发一个网络游戏,难免要处理网络通信。有几点问题需要注意
vue防抖功能怎样实现?首先防抖就是防止重复点击触发事件,对按钮做防抖是很有必要的,防抖功能能够避免用户在较短时间内进行过快点击,从而引发一系列负面的影响。因此,下面就给大家分享一下关于vue实现防抖的方法,供大家参考。
这篇文章主要给大家介绍了关于在Vue项目中使用mock.js的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008