React相关【笔记】

200 阅读3分钟

React hooks

hooks解决了什么问题?

  • 更好的拥抱了函数式,彻底改变了react的编程风格,函数即组件
  • 更好的实现了关注点分离

hooks是什么

  • hook是一种通知机制,在react中是一种特殊的函数

useState

是允许你在 React 函数组件中添加 state 的 Hook

useMemo/useCallback

  • useMemouseCallback 其实是两个低频能力。 总体来说,它们和useRef 能力是相似的,都是在闭包间同步一个per virtualdom instance per location 的值。类似一个静态的,基于词法作用域的缓存
  • 作用不太大,大都属于微优化
用处
  • 减少闭包,在onclick方法中使用
  • 减少复杂的计算(理论上复杂计算不应该在这里出现,可以放在服务端或者service worker)
  • 阻止子组件更新
// 阻止子组件更新
function ParentComponent(props){
    return useMemo(() => <ChildComponent someProp={props.fooProp} />, [props.someProp])
}
​
function ChildrenComponent() {
    return <div>....</div>
}
if(...) {
  useEffect(() => {}, [])
}
<Button text="点我" />
// 到
<Button text="请按键" />
function FiberNode(...) {
  // 工作类型(Fiber类型)
  this.tag = tag;
​
  // ReactElement.key
  this.key = key;
​
  // ReactElement.type
  this.elementType = null;
​
  // Fiber
  // 执行完当前工作返回的Fiber
  this.return = null;
​
  // 当前Fiber的(最左侧)子Fiber
  this.child = null;
​
  // 当前Fiber的下一个同级Fiber
  this.sibling = null;
​
}
render = Reconciler(HostConfig)
  • VirtualDom: 对组件层级结构的描述

  • Reconciliation:计算DOM DIFF

  • HostConfig:对react渲染对应具体端(dom,react-native)的封装

    • 删除元素的能力
    • 改变元素属性的能力
    • 插入元素的能力
    • 替换元素的能力

虚拟DOM DIFF计算出更新步骤之后,由reconsiler(调和器)来将三部分结合起来:

github.com/facebook/re…

提供DOM DIFF的模块叫react-reconciler

reconciler

  • 如果是新节点,创建新Fiber
  • 计算阶段:如果是变更,那么计算出Work In Progress Fiber
  • 计算阶段:render库执行,利用react的DOM DIFF算法进行更新
  • 提交阶段:应用更新

2、上述情况发生时,render库(如ReactDOM)会触发Fiber的执行

  • 跟节点render函数调用(例如: ReactDOM.render( ,) )
  • setState
  • props变更

1、驱动Fiber的执行:

Fiber的执行
  • 计算阶段(可中断)

    • 计算 worInProgress Fiber
    • 进行DOM Diff,计算DOM的更新
  • 提交阶段(不可中断)

    • 提交所有的更新
Fiber更新的两个阶段
  • 当发生变更时,产生workInProgress Fiber,与原来的Fiber之间互相引用。
  • DOMDiff 发生在Current FiberworkInProgress Fiber之间
  • 这是一种处理并发的技巧,叫 Copy On Write —— 当有变更时复制原有对象,变更完成之后替换原有对象
Fiber的workInProgress
  • React Element描述组件的信息、组件的层级关系
  • Fiber描述组件的Diff工作的调用关系
  • Dom对应实际的渲染效果
DOM、Element、Fiber什么关系
  • Fiber是React Element数据的镜像
  • Fiber是一份Diff工作
  • Fiber模拟函数调用关系
是什么

Fiber

  • 没有key,对比和替换
  • 有key,根据key来对比,然后再递归这个节点的子节点
乱序的节点
  • 为什么不再深入diff,因为太麻烦了。是一个O(n3)算法
不同类型的节点直接替换掉
相同类型的节点替换属性

DOM-DIFF

React原理

  • hooks是声明式的,if式分支控制,不能一起使用
  • 实现层hooks是用一个链表维护的,react是按照hooks的声明位置存储的
hooks + 控制流

Hooks小技巧