持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
该文章主要分享一些自己对react核心的一些理解的小笔记
小弟不才,其实我认为最好的核心代码笔记,就是写一个最小的可运行的的核心代码
那么现在让我们来一步一步来实现它吧
react 的fiber
有5个优先级的等级
- Immediate
- UserBlocking
- Normal
- Low
- Idle
高阶组件
怎么写一个高阶组件?
- 普通方式
- 装饰器
- 多个高阶组件组合
高阶组件
- 属性代理
-
操作props
-
操作ref
- 继续/劫持
什么是react hooks?
- useState
- useEffect
- useMemo
react hooks 有什么优势
class 的缺点
- 组件间的状态逻辑很难复用
- 复杂业务的有状态组件会越来越复杂
- 监听和定时器的操作,被分散在多个区域
不要在render里写bind
hooks 的优点
- 利于业务逻辑的封装和拆分,可以自由自定义hooks(自己封装的用到了react hooks的公共逻辑) useEffect(()=>{})
- 可以在无需修改组件结构的情况下,复用状态逻辑
- 定时器、监听等等都被聚合到同一块代码下
hooks使用注意事项
- 不能在循环判断里用索引问题
- 只能在 React 的函数组件中调⽤ Hook,不要在其他 JavaScript 函数中调⽤
- 自定义的hook怎样操作组件
diff
计算机世界里,比较两棵树的异同,其实可以抽象为经过一堆操作猛如虎后,就是将一颗树转成另一颗树的过程 假设,将字符串 'hello' -> 'hallo' 需要几步?一眼望去就知道答案是一步,这个时候你脑子里的思考过程其实就是编辑距离算法的模型了,计算机思维 got!
- 抽象一点,对字符串的操作不外乎三种,「替换」「插入」「删除」,执行这三种操作后到达目的的最小操作数,就是最短编辑距离,这里的复杂度就是我们需要考虑的
- a a 跨层级比较
- | | | |
- c b c d
- [a, a]
- [a, c]
- [a, d]
- ...
React diff 复杂度其实是 O(nm),这里只是有一些技巧可以优化成 O(n)
const arr = [a, b, c] vs const newArr = [b, d, e, f]
[a, b]
[b, d]
[c, e]
[null, f]
for (let i = 0, len = oldNodes.length; i < len; i++) {
if (oldNodes[i].type !== newNodes[i].type) {
replace()
}
else if (oldNodes[i].children && oldNodes[i].children.length) { // 如果没有这一层,假设 type 全不相同,那么就是 O(n),最坏复杂度 O(nm)
}
}
- O(n^2)
- O(nlogn)
- 当然,这只是 React 的实现,肯定还是有更优秀的 diff 算法的,比如 inferno 的,能到 O(mlogn),vue3 也是借鉴了这一算法
总结
这里这介绍本人对react核心的一些粗见,核心代码见下期