React Hooks 的限制主要有两条:
-
不要在循环、条件或嵌套函数中调用 Hook;
-
在 React 的函数组件中调用 Hook。
Hooks 的设计初衷是为了改进 React 组件的开发模式。在旧有的开发模式下遇到了三个问题。
-
组件之间难以复用状态逻辑。过去常见的解决方案是高阶组件、render props 及状态管理框架。
-
复杂的组件变得难以理解。生命周期函数与业务逻辑耦合太深,导致关联部分难以拆分。
-
人和机器都很容易混淆类。常见的有 this 的问题,但在 React 团队中还有类难以优化的问题,他们希望在编译优化层面做出一些改进。
如果在条件语句中使用hooks,React会抛出 error。
这与React Hooks的底层设计的数据结构相关
hooks 的渲染是通过“依次遍历”来定位每个 hooks 内容的。如果前后两次读到的链表在顺序上出现差异,那么渲染的结果自然是不可控的。
这个现象有点像我们构建了一个长度确定的数组,数组中的每个坑位都对应着一块确切的信息,后续每次从数组里取值的时候,只能够通过索引(也就是位置)来定位数据。也正因为如此,在许多文章里,都会直截了当地下这样的定义:Hooks 的本质就是数组。但是Hooks 的本质其实是链表。react用链表来严格保证hooks的顺序。