注意
在开始本章学习前,你需要了解Hooks
的基本用法。
如果你还未使用过Hooks
,可以从官方文档 (opens new window)开始。
你可以从这里 (opens new window)了解Hooks
的设计动机。作为一名框架使用者
,了解设计动机
对于我们日常开发就足够了。
但是,为了更好的理解Hooks
的源码架构
,我们需要转换身份,以框架开发者
的角度来看待Hooks
的设计理念
。
从LOGO聊起
React
LOGO
的图案是代表原子
(atom
)的符号。世间万物由原子
组成,原子
的类型
与属性
决定了事物的外观与表现。
同样,在React
中,我们可以将UI
拆分为很多独立的单元,每个单元被称为Component
。这些Component
的属性
与类型
决定了UI
的外观与表现。
讽刺的是,原子
在希腊语中的意思为不可分割的
(indivisible
),但随后科学家在原子中发现了更小的粒子 —— 电子(electron
)。电子可以很好的解释原子
是如何工作的。
在React
中,我们可以说ClassComponent
是一类原子
。
但对于Hooks
来说,与其说是一类原子
,不如说他是更贴近事物运行规律
的电子
。
我们知道,React
的架构遵循schedule - render - commit
的运行流程,这个流程是React
世界最底层的运行规律
。
ClassComponent
作为React
世界的原子
,他的生命周期
(componentWillXXX
/componentDidXXX
)是为了介入React
的运行流程而实现的更上层抽象,这么做是为了方便框架使用者
更容易上手。
相比于ClassComponent
的更上层抽象,Hooks
则更贴近React
内部运行的各种概念(state
| context
| life-cycle
)。
作为使用React
技术栈的开发者,当我们初次学习Hooks
时,不管是官方文档还是身边有经验的同事,总会拿ClassComponent
的生命周期来类比Hooks API
的执行时机。
这固然是很好的上手方式,但是当我们熟练运用Hooks
时,就会发现,这两者的概念有很多割裂感,并不是同一抽象层次可以互相替代的概念。
比如:替代componentWillReceiveProps
的Hooks
是什么呢?
可能有些同学会回答,是useEffect
:
useEffect( () => {
console.log('something updated');
}, [props.something])
但是componentWillReceiveProps
是在render阶段
执行,而useEffect
是在commit阶段
完成渲染后异步执行。
这篇文章可以帮你更好理解
componentWillReceiveProps
:深入源码剖析componentWillXXX为什么UNSAFE (opens new window)
所以,从源码运行规律的角度看待Hooks
,可能是更好的角度。这也是为什么上文说Hooks
是React
世界的电子
而不是原子
的原因。
以上见解参考自React Core Team Dan在 React Conf2018的演讲 (opens new window)
总结
Concurrent Mode
是React
未来的发展方向,而Hooks
是能够最大限度发挥Concurrent Mode
潜力的Component
构建方式。
正如Dan在React Conf 2018
演讲结尾所说:你可以从React
的LOGO
中看到这些围绕着核心
的电子飞行轨道
,Hooks
可能一直就在其中。