您可以依赖 useMemo 作为性能优化,而不是作为语义保证 https://reactjs.org/docs/hooks-reference.html#usememo
意义、语义上useMemo
不是正确的方法;您使用它的原因是错误的。因此,即使它现在按预期工作,但您使用它不正确,并且可能会导致将来出现不可预测的行为。
useState
仅当您不希望在计算值时阻塞渲染时,才是正确的选择。
如果在组件的第一次渲染中不需要该值,您可以使用useRef
and useEffect
一起:
const calculatedConstant = useRef(null);
useEffect(() => {
calculatedConstant.current = calculateConstantFactory()
}, [])
// use the value in calcaulatedConstant.current
这与初始化实例字段相同componentDidMount
。当工厂函数运行时,它不会阻止您的布局/绘制。就性能而言,我怀疑任何基准测试都会显示出显着差异。
问题是,初始化 ref 后,组件不会更新以反映该值(这是 ref 的全部目的)。
如果您绝对需要在组件的第一次渲染上使用该值,您可以这样做:
const calculatedConstant = useRef(null);
if (!calculatedConstant.current) {
calculatedConstant.current = calculateConstantFactory();
}
// use the value in calculatedConstant.current;
这会在设置值之前阻止您的组件呈现。
如果你不想渲染被阻塞,你需要useState
和...一起useEffect
:
const [calculated, setCalculated] = useState();
useEffect(() => {
setCalculated(calculateConstantFactory())
}, [])
// use the value in calculated
基本上,如果您需要组件重新渲染自身:使用 state。如果没有必要,请使用参考。