最简单的解释:
使用效果:
当你有一些逻辑被执行作为对状态变化的反应或变化即将发生之前。
useEffect(() => {
// execute when state changed
() => {
// execute before state is changed
}
}, [state]);
或者在没有依赖的情况下:
useEffect(() => {
// execute when component has mounted
() => {
// execute when component will unmount
}
}, []);
使用回调:
只要你有一个依赖于特定状态的函数。此挂钩用于性能优化,并防止重新分配组件内的函数,除非依赖状态发生更改。
const myFunction = useCallback(() => {
// execute your logic for myFunction
}, [state]);
如果没有 useCallback,myFunction 将在每次渲染时重新分配。因此,它会像使用 useCallback 一样使用更多的计算时间。
使用备忘录
只要您有一个取决于特定状态的值。与 useCallback 相同,useMemo 用于减少重新分配以优化性能。
const myValue = useMemo(() => {
// return calculated value
}, [state]);
与 useCallback 相同,myValue 仅在状态更改时分配,因此会减少计算时间。否则 myValue 将在每次渲染时重新分配。
!模仿 componentWillMount 生命周期的技巧
useMemo(() => {
// execute componentWillMount logic
]}, []);
因为 useEffect 在第一次渲染之后调用,然后在每次依赖项更改时调用。它永远不会在第一次渲染之前运行。
useMemo 与您的 JS 内联执行,因此将在它到达您的组件返回语句之前执行。
!NOTE:带有 useCallback 的函数和带有 useMemo 的值可以在 useCallback、useMemo 和 useEffect 中用作依赖项。强烈建议使用这些钩子,以便在组件中拥有结构良好且可读的状态流。这些钩子不会触发渲染。只有 useState 和 useReducer 可以!
如果你想保持不触发重新渲染或任何上述钩子的状态,你可以使用 useRef。 useRef 将在渲染过程中保持值一致,而不会触发任何与状态相关的值或效果。