目录
最近被一家大厂面试,问到react hooks,在if语句中可不可以使用hooks,我回答不可以,记得之前写代码还犯过这样的错还去搜了,结果没记住,没答出面试官想要的原理答案,记下这个教训。
一、hoooks是什么?
React Hooks 是 React 16.8 引入的函数式组件开发范式,主要用于在函数组件中实现类组件功能。
- 只能在函数组件顶层调用
- 不可在条件/循环语句中使用
- 遵循 use 前缀命名规范
- 解决类组件生命周期碎片化问题
- 实现逻辑复用(自定义 Hooks)
- 更直观的函数式编程体验
二、核心原理:调用顺序一致性
React 通过维护 调用顺序链表 来追踪 Hooks 状态。每个 Hook 调用都会被分配一个固定的「内存插槽」,通过固定的调用顺序保证状态对应关系
三、底层实现机制
1.Fiber节点存储
// React 内部伪代码
type Hook = {
memoizedState: any, // 当前状态值
next: Hook | null // 链表指针
};
2.渲染过程
每次渲染都会按顺序遍历 Hook 链表,如果条件分支导致 Hook 数量变化,会导致后续 Hooks 错位引用。
四、正确实践方案
1.条件逻辑后置
const [data, setData] = useState(null);
useEffect(() => {
if (condition) { // ✅ 条件后置到 Hook 内部
fetchData().then(setData);
}
}, [condition]);
2. 动态初始化
const initialState = condition ? 0 : '';
const [value] = useState(initialState); // ✅ 初始化值可动态
3. 自定义 Hook 封装
function useConditionalHook(condition) {
const [state] = useState(0);
useEffect(() => {
if (condition) { // ✅ 条件内置于 Hook
// 业务逻辑
}
}, [condition]);
return state;
}
总结
此设计确保了 React 的状态追踪系统能正确工作,违反规则会导致状态混乱和难以追踪的 bug。