汗流浃背(褒义)
- 之前实习过吗(没有,感觉已经寄80%了)
- 介绍一下常用布局
- 选择器优先级
- 介绍一下定位
- absolute 设置top:10px会发生什么
- JS的异步方法
- await后面都能跟些什么
- TS的特点
- TS的数据类型
- TS怎么类型声明
- TS的interface和type的区别
- TS的工具类
- div包裹div,外层div的内联样式会影响到内部吗
- 写过自定义Hook吗
- less和sass的优点
- ==和===的区别
- []==[]会发生什么(false)
- react常用的HOOKS
- Hooks的执行顺序 (完全不知道捏)
- 第一个useeffect的依赖项[a],第二个useeffect依赖项[a,b],a变化时会一起触发渲染吗
- sql语句(不会)
- linux常用命令
213
-
- 首先,React 会执行组件的函数体,开始渲染过程。在这个阶段,使用
useMemo
和useCallback
的代码会被执行。 useMemo
会根据依赖项的变化来计算并返回缓存的值。如果依赖项没有变化,则返回之前缓存的值。useCallback
会根据依赖项的变化返回一个缓存的函数引用。如果依赖项没有变化,则返回之前的函数引用。
- 首先,React 会执行组件的函数体,开始渲染过程。在这个阶段,使用
- DOM 更新:
- 在渲染过程结束后,React 会进行 DOM 更新,将计算得到的值和组件的渲染结果应用到 DOM 中。
- 副作用处理:
- 在所有的渲染和 DOM 更新完成后,React 才会执行
useEffect
中定义的副作用函数。如果组件在这一过程中被卸载,相关的清理函数(如果定义了)也会被调用。
- 在所有的渲染和 DOM 更新完成后,React 才会执行
执行顺序总结
- 首先执行
useMemo
和useCallback
:在组件渲染函数中计算值和函数引用。 - 随后进行 DOM 更新:将渲染结果应用到 DOM。
- 最后执行
useEffect
中的副作用函数:处理副作用,与数据获取、订阅等相关。
这种执行顺序确保了在调用 effect 时,组件已经完成了渲染,并且可以安全地使用渲染过程中创建的值和函数引用。希望这能帮助你理解这三个钩子的执行顺序!useEffect
在 React 的执行顺序中被设计为在组件渲染后执行,这样的设计有几个重要原因:
1. 渲染结果的可用性
useEffect
依赖于组件渲染后的状态和 DOM 节点。如果在渲染过程之前执行 useEffect
,那么它可能会尝试访问未更新的状态或未渲染的 DOM 结构,这会导致不可预测的行为和错误。因此,React 选择在渲染完成后再执行 useEffect
,以确保所有的渲染结果和状态都是最新的。
2. 性能优化
在组件渲染期间,React 会进行虚拟 DOM 的计算和对比,以决定如何高效地更新实际 DOM。如果将副作用放在渲染过程中,可能会导致不必要的渲染延迟和性能损失。通过将副作用放在渲染的下一步,React 可以优化这些操作,从而提升性能。
3. 避免副作用影响渲染
副作用通常涉及异步操作(如数据获取、订阅等),这些操作可能需要时间才能完成。如果在渲染期间执行这些操作,会导致组件的显示延迟或不一致。将副作用放在渲染后,可以确保用户看到的是稳定的 UI,而不会因为运行副作用而造成闪烁或不一致的体验。
总结
通过在渲染完成后才执行 useEffect
,React 能够确保:
- 访问的是最新的状态和 DOM;
- 不影响渲染性能和用户体验;
- 副作用可以安全地处理和清理。
这种设计使得 React 的组件能够更加高效和稳定。