我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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{
  
  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 存的依赖都执行

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java中怎么实现实现一个简单得数据响应系统

这篇文章主要介绍“Java中怎么实现实现一个简单得数据响应系统”,在日常操作中,相信很多人在Java中怎么实现实现一个简单得数据响应系统问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中怎么实现实现一个
2023-06-25

MySQL数据库实验实现简单数据库应用系统设计

目录一、实验目的二、实验要求三、实现内容及步骤1、学生表:student2、寝室表:dormitory3、管理员表:admin四、编程客栈实验总结观前提示:本篇内容为mysql数据库实验,代码内容经测试过,可能一小部分有所疏漏,也有会不符合
2022-06-20

怎么使用PHP和数据库实现一个简单的队列系统

本篇内容介绍了“怎么使用PHP和数据库实现一个简单的队列系统”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、数据库队列的基本原理数据库队列
2023-07-06

基于C++实现一个简单的音乐系统

C++中的Beep函数是一个发出嗡鸣声的函数,本文将利用这个函数实现制作一个简单的声音系统。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2022-12-29

基于Python实现一个简单的学生管理系统

这篇文章主要为大家详细介绍了如何利用python实现简单的学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-12-31

使用CSS怎么实现一个响应式布局系统

这篇文章将为大家详细讲解有关使用CSS怎么实现一个响应式布局系统,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是csscss是一种用来表现HTML或XML等文件样式的计算机语言,主要是用
2023-06-08

利用Rust实现一个简单的Ping应用

这两年Rust火的一塌糊涂,甚至都烧到了前端,再不学习怕是要落伍了。最近翻了翻文档,写了个简单的Ping应用练练手,感兴趣的小伙伴可以了解一下
2022-12-08

python实现一个简单的web应用框架

这篇文章主要为大家介绍了使用python写一个简单的web应用框架实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-18

基于Python怎样实现一个简易的数据管理系统

这期内容当中小编将会给大家带来有关基于Python怎样实现一个简易的数据管理系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。为了方便的实现记录数据、修改数据没有精力去做一个完整的系统去管理数据。因此,在
2023-06-22

怎么用代码实现一个迷你响应式系统vue

这篇文章主要讲解了“怎么用代码实现一个迷你响应式系统vue”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用代码实现一个迷你响应式系统vue”吧!基本定义什么是响应式系统?学术上的定义,我
2023-07-05

怎么用Rust实现一个简单的Ping应用

这篇文章主要介绍了怎么用Rust实现一个简单的Ping应用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Rust实现一个简单的Ping应用文章都会有所收获,下面我们一起来看看吧。目标实现一个Ping,功能
2023-07-04

如何使用C++实现一个简单的文件管理系统?

如何使用C++实现一个简单的文件管理系统?概述:文件管理系统是计算机中非常重要的一个功能模块,它负责对计算机中的文件进行创建、修改、删除等操作。本文将介绍如何使用C++编程语言实现一个简单的文件管理系统,通过该系统,可以实现对文件的基本管理
如何使用C++实现一个简单的文件管理系统?
2023-11-02

编程热搜

目录