[英]React.useMemo vs React.useState
我看到其他人询问useState + useEffect
。 但我想知道这两个实现中未更改的(const)变量有什么不同:
function optionA(){
const [Mesh] = useState(()=> new Mesh)
return "...someRender"
}
function optionB(){
const Mesh = useMemo(()=> new Mesh)
return "...someRender"
}
编辑:
我知道useRef(someValue)
更适合这个,但我发现它“不明确地”在任何地方写Mesh.current
关键是你说“不变”的地方。 在 state 中设置一个永远不会改变的值是没有意义的。 state 的目的是保存信息,这些信息在更改时会导致渲染更新。 如果你从不改变它,就没有理由把它放在 state 中。
但是,不要为此使用useMemo
。 从文档中:
您可能依赖 useMemo 作为性能优化,而不是语义保证。 将来,React 可能会选择“忘记”一些以前记忆的值并在下一次渲染时重新计算它们,例如为屏幕外组件释放 memory。 编写您的代码,使其在没有
useMemo
的情况下仍能正常工作——然后添加它以优化性能。
(他们的重点)
如果您有想要在组件的整个生命周期内静态保存的信息,请使用useRef
而不是useMemo
:
function Example() {
const refMesh = useRef(null);
if (!refMesh.current) {
// One-time initialization
refMesh.current = new Mesh();
}
const mesh = refMesh.current;
// ...use `mesh` from here on out...
}
与useMemo
不同,您可以确定在组件的生命周期内只会创建一个Mesh
实例。 (这还有一个小优点,即您不必不断创建 function 来在每次渲染时传递useMemo
。)
我有时会使用存储 object 的单个 ref 来保存不适合 state 的多条实例信息(包括子组件的稳定回调函数)。 这很方便。
重新编辑:
我知道
useRef(someValue)
更适合这个,但我发现它“不明确地”在任何地方写Mesh.current
你不知道。 见const mesh = refMesh.current;
在上面,您将在整个组件的其余部分使用mesh
而不是refMesh.current
。
如果你发现if
很尴尬,你可以将它包装在一个钩子中,它提供了useMemo
不提供的语义保证,代价是在每个渲染上创建一个 function(与useMemo
, useCallback
等):
const useData = (instanceInitializer) => {
const ref = useRef(null);
if (!ref.current) {
ref.current = instanceInitializer();
}
return ref.current;
};
那么它将是:
function Example() {
const mesh = useData(() => new Mesh());
// ...use `mesh` from here on out...
}
与 function 的创建相比,这有(非常)轻微的额外成本,但更好的人体工程学。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.