Reactjs 为什么useMemo会';t记忆价值
我有一个简单的例子:Reactjs 为什么useMemo会';t记忆价值,reactjs,react-hooks,Reactjs,React Hooks,我有一个简单的例子: import { useMemo, useState } from "react"; import "./styles.css"; const calc = (n) => ( Math.random() ) export default function App() { const [n, setN] = useState(1); const r = useMemo(() => calc(n)
import { useMemo, useState } from "react";
import "./styles.css";
const calc = (n) => (
Math.random()
)
export default function App() {
const [n, setN] = useState(1);
const r = useMemo(() =>
calc(n)
, [n])
return (
<div className="App">
<input onChange={e => setN(e.target.value)}/><br/>
<strong>useMemo: {r}</strong><br/>
</div>
);
}
从“react”导入{usemo,useState};
导入“/styles.css”;
常量计算=(n)=>(
数学随机
)
导出默认函数App(){
const[n,setN]=useState(1);
常数r=useMemo(()=>
计算(n)
,[n])
返回(
setN(e.target.value)}/>
使用备忘录:{r}
);
}
为什么对于相同的依赖项n
它在r
中显示不同的结果?
好的,它应该被记忆…,因为当依赖项发生变化时,
usemo
将再次调用。当您更改输入时,setN
将调用,因此状态n
将更改。然后,usemo
中的函数将调用并返回r
的新值,该值来自:
传递一个“create”函数和一组依赖项useMemo仅在其中一个依赖项发生更改时才重新计算记忆值。此优化有助于避免在每次渲染时进行昂贵的计算
示例:
当n=1
时,r
变为0.1234
现在当n=2
时,r
变为0.2345
。(相关性已更改,因此将重新计算)
当n=1
时,r
变为0.1930
。(相关性已更改,因此将重新计算)
因此,
useMemo
按预期工作。但是你可能需要一个不同的工具来完成你想做的事情(可能是类似于一个游戏)。请记住,usemo
是一种性能优化工具(它不是关键值的映射)
到
setN(Number(e.target.value))}/>
现在尝试插入与1相同的值,您将看到它不会触发组件更新。但现在您应该小心,就像您在键盘上键入非数字值一样,您将得到Null
作为Number(e.target.value)
的返回值。这将导致不更新状态
使用null调用setState不再触发更新。这允许
您需要在更新程序函数中决定是否要重新渲染
如果以下答案有用,请单击向上投票按钮(▲) 如果有人回答了您的问题,请单击复选标记(✓) 接受它(一旦系统允许)。这样其他人就会知道你已经(充分)得到了帮助。另请参阅
<input onChange={e => setN(e.target.value)}/><br/>
<input onChange={e => setN(e.target.value)}/><br/>
<input onChange={e => setN(Number(e.target.value))}/><br/>