根据https://react.dev/reference/react/useMemo,它表示useMemo使用Object.is()
函数计算deps值,因此如果deps值是非基元的,如数组或对象,useMemo将在每次渲染时计算值.
import { useMemo, useState } from "react";
export default function App() {
const temp = { a: 1 };
const [a, setA] = useState({ a: 1 });
const [aa, setAA] = useState(1);
const obj = useMemo(() => {
console.log("obj");
return { b: a.a };
}, [a]);
const obj2 = useMemo(() => {
console.log("obj2");
return { b: temp.a };
}, [temp]);
return (
<div className="App">
<button onClick={() => setA((prev) => ({ a: prev.a + 1 }))}>
button {a.a}
</button>
<div>{obj.b}</div>
<div>{obj2.b}</div>
<button onClick={() => setAA((prev) => prev + 1)}>premitive {aa}</button>
</div>
);
}
当我单击第一个或第二个按钮时,控制台输出obj2
,这是有意义的,因为变量temp
是一个对象,并使用Memo计算每次呈现的值.
但是,当我单击第二个按钮时,即使变量a
是对象状态,控制台也不会输出obj
.
为什么会发生这种事呢?我假设第一个useMemo也计算每次呈现的值,但不知何故并非如此