fanxinjie / blog

issues blog
0 stars 0 forks source link

学习笔记《深入浅出搞定 React》 #6

Open fanxinjie opened 2 years ago

fanxinjie commented 2 years ago

001 JSX

三个问题:

fanxinjie commented 2 years ago

002 React 15、16 生命周期

react 15、16 版本两个生命周期进行探讨、对比、总结。

关键词:组件、虚拟 DOM

image

fanxinjie commented 2 years ago

003 数据组件间流动

发布订阅代码实现

class myEventEmitter {
  constructor() {
    // eventMap 用来存储事件和监听函数之间的关系
    this.eventMap = {};
  }
  // type 这里就代表事件的名称
  on(type, handler) {
    // hanlder 必须是一个函数,如果不是直接报错
    if (!(handler instanceof Function)) {
      throw new Error("哥 你错了 请传一个函数");
    }
    // 判断 type 事件对应的队列是否存在
    if (!this.eventMap[type]) {
      // 若不存在,新建该队列
      this.eventMap[type] = [];
    }
    // 若存在,直接往队列里推入 handler
    this.eventMap[type].push(handler);
  }
  // 别忘了我们前面说过触发时是可以携带数据的,params 就是数据的载体
  emit(type, params) {
    // 假设该事件是有订阅的(对应的事件队列存在)
    if (this.eventMap[type]) {
      // 将事件队列里的 handler 依次执行出队
      this.eventMap[type].forEach((handler, index) => {
        // 注意别忘了读取 params
        handler(params);
      });
    }
  }
  off(type, handler) {
    if (this.eventMap[type]) {
      this.eventMap[type].splice(this.eventMap[type].indexOf(handler) >>> 0, 1);
    }
  }
}
fanxinjie commented 2 years ago

004 React-hooks 设计动机与工作模式

fanxinjie commented 2 years ago

005 React-hooks 工作机制

一句话总结:根据源码介绍了 hooks 的 首次渲染、更新渲染 流程和机制。进而得到 hooks 渲染机制是依次遍历, hooks 本质是 链表。

fanxinjie commented 2 years ago

006 虚拟 DOM

一句话总结:首先回顾 DOM 操作解决方案发展史,明确了虚拟 DOM 定位和解决的主要问题,之后对虚拟 DOM 流程分析。过程中需要格外注意 diff:是指对比两颗虚拟 DOM 树之间差异的过程


最后,虚拟 DOM 的存在,不能片面的说他解决了真实DOM更新试图带来的性能问题,是提升试图渲染性能存在的。虚拟DOM 是让diff 算法提供了可能。并且为编译多平台代码提供了可能,我们可以在虚拟dom转换真是节点做文章,除此之外,还提升了开发体验和开发效率,使得UI=fn(state) 数据驱动视图的函数式、声明式编程成为可能。

fanxinjie commented 2 years ago

007 栈调和过程

一句话介绍:首先介绍了 调和 和 diff 区别,其次说明了 react 15 diff 整体逻辑,把握到“树递归”这一层即可。

fanxinjie commented 2 years ago

008 setState 介绍

setState 被 React 的 isBatchingUpdates 变量管控是直接执行还是批量处理,isBatchingUpdates 被 batchingUpdates 事件管控,batchingUpdates 事件触发在 React 可控范围内的每一次事件。batchingUpdates 结束后,会由“事务”机制执行 close,将isBatchingUpdates 更改为 false,因此在 setTimeout、setInterval 等事件中执行为同步,因为已经在真正执行内容前已经被设置为 false。还有在 React 无法控制,如原生事件内也为同步。

image