使用 (例如对于密集函数调用) 而不是使用和useMemo的组合有什么好处吗?useEffect``useState
useMemo
useEffect``useState
这里有两个自定义钩子,乍一看,它们的工作原理完全相同,除了useMemo的返回值是null在第一次渲染时:
null
import { expensiveCalculation } from "foo"; function useCalculate(someNumber: number): number | null { const [result, setResult] = useState<number | null>(null); useEffect(() => { setResult(expensiveCalculation(someNumber)); }, [someNumber]); return result; }
import { expensiveCalculation } from "foo"; function useCalculateWithMemo(someNumber: number): number { return useMemo(() => { return expensiveCalculation(someNumber); }, [someNumber]); };
每次参数发生变化时,两者都会计算结果,启动时someNumber的记忆useMemo在哪里?
someNumber
每次更改useEffect都会setState引发额外的渲染:第一次渲染会因为陈旧数据而“落后”,然后它会立即使用新数据排队进行额外的渲染。
useEffect
setState
假设我们有:
// Maybe I'm running this on a literal potato function expensiveCalculation(x) { return x + 1; };
假设x最初为 0:
x
1
那么如果我们改为x2:
3
就运行频率而言expensiveCalculation,两者的行为相同,但该useEffect版本导致两倍的渲染,这会因其他原因而对性能产生不利影响。
expensiveCalculation
另外,在我看来,这个useMemo版本更简洁,更易读。它不会引入不必要的可变状态,移动部件也更少。
因此您最好只使用useMemo这里。