实现一个简单得数据响应系统


Posted in Javascript onNovember 11, 2021

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 时,会触发改属性的 getget 函数中会把该 watcher 存到该属性的 dep 依赖容器中
  • 当这个属性发生变化时,会出发改属性的 set 的方法,set 函数中会把 dep 存的依赖都执行

到此这篇关于实现一个简单得数据响应系统的文章就介绍到这了,更多相关数据响应系统内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
得到文本框选中的文字,动态插入文字的js代码
Mar 07 Javascript
服务器端的JavaScript脚本 Node.js 使用入门
Mar 07 Javascript
详解JavaScript逻辑Not运算符
Dec 04 Javascript
jQuery实现图片文字淡入淡出效果
Dec 21 Javascript
利用原生JS自动生成文章标题树的实例
Aug 22 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
Apr 07 jQuery
解决ionic和angular上拉加载的问题
Aug 03 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
Aug 30 Javascript
vue中echarts3.0自适应的方法
Feb 26 Javascript
如何编写一个d.ts文件的步骤详解
Apr 13 Javascript
vue实现瀑布流组件滑动加载更多
Mar 10 Javascript
Javascript设计模式之原型模式详细
Oct 05 Javascript
JavaScript函数柯里化
Nov 07 #Javascript
JS数组去重详情
Nov 07 #Javascript
手写实现JS中的new
Nov 07 #Javascript
用JS写一个发布订阅模式
Nov 07 #Javascript
浅谈JavaScript浅拷贝和深拷贝
JavaScript严格模式不支持八进制的问题讲解
Javascript使用integrity属性进行安全验证
Nov 07 #Javascript
You might like
逐步提升php框架的性能
2008/01/10 PHP
php 获取完整url地址
2008/12/20 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
2020/07/21 PHP
php调用自己java程序的方法详解
2016/05/13 PHP
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
AngularJS 如何在控制台进行错误调试
2016/06/07 Javascript
javascript时间差插件分享
2016/07/18 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
vue进入页面时滚动条始终在底部代码实例
2019/03/26 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
python中redis的安装和使用
2016/12/04 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
python 调试冷知识(小结)
2019/11/11 Python
使用Python第三方库pygame写个贪吃蛇小游戏
2020/03/06 Python
python实现扫雷小游戏
2020/04/24 Python
python 使用三引号时容易犯的小错误
2020/10/21 Python
Python学习之time模块的基本使用
2021/01/17 Python
浅谈css3中的前缀
2016/07/20 HTML / CSS
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
学生实习推荐信范文
2013/11/26 职场文书
普通院校学生的自荐信
2013/11/27 职场文书
幼儿园教育教学反思
2014/01/31 职场文书
兴趣小组活动总结
2014/05/05 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
优秀共产党员演讲稿
2014/09/04 职场文书
教师党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2019年年中工作总结讲话稿模板
2019/03/25 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python