const memoizedValue = useMemo(() => {
// factory function
}, [obj]);
假设
obj
有几个嵌套的道具。
在这个使用useMemo钩子的示例中:
如果
obj
的引用更改?
,则会重新计算工厂函数给出的值。
或
obj
上应用了一个
深/浅比较
,然后如果一些道具更改了,则重新计算值
,而不管它的引用是什么??
发布于 2022-02-23 20:40:00
如果对obj的引用发生变化,
将重新计算工厂函数给出的值?
据我所知和理解,React使用浅引用相等检查。
考虑以下代码:
function App() {
const [c, setC] = React.useState(0);
const [obj, setObj] = React.useState({ prop: 10 });
const forceRender = () => setC((c) => c + 1);
const memoizedValue1 = React.useMemo(() => {
console.log("`obj` dependency updated, recomputing value.");
return obj.prop;
}, [obj]);
const memoizedValue2 = React.useMemo(() => {
console.log("`obj.prop` dependency updated, recomputing value.");
return obj.prop;
}, [obj.prop]);
const immutableHandler = () => {
setObj(() => {
console.log("Immutable update returns new object.");
return { prop: 42 };
forceRender();
const mutableHandler = () => {
setObj((obj) => {
console.log("Mutable update returns same object with updated property.");
obj.prop = 13; // DON'T DO THIS IN REAL CODE, IT'S A MUTATION!!
return obj;
forceRender();
return (
<div className="App">
<div>memoizedValue1: {memoizedValue1} - memoizedValue2: {memoizedValue2}</div>
<button type="button" onClick={immutableHandler}>
Immutable Update
</button>
<button type="button" onClick={mutableHandler}>
Mutable Update
</button>
<button type="button" onClick={() => setObj({ prop: 10 })}>
Reset
</button>
const rootElement = document.getElementById("root");
ReactDOM.render(
<React.StrictMode>