【React】关于React.memo和useMemo
组件的记忆化 memo
由于父组件的状态变量text的更新,导致没有任何变化的Child1也会被多余地重新渲染。
const Child1 = () => {
return (
<div>
<p>子コンポーネント1</p>
</div>
);
};
export const Parent = () => {
// 状態変数textが更新される度にParentがレンダリングされる
// Child1の中身に変化はないが、Child1まで再レンダリングされてしまう
const [text, setText] = React.useState('');
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setText(e.target.value);
};
return (
<div>
<p>親コンポーネント</p>
<input type="text" onChange={handleChange} />
<Child1 />
</div>
);
};
React.memo 会通过检查等值性(即值是否相等)来判断是否重新渲染。如果前后的值没有变化,则不会重新渲染。
在以下的情况下,已经进行了记忆化的Child1将不会被渲染。
Child2没有进行记忆化,因此会被渲染出来。
const Child1 = React.memo(() => {
return (
<>
<p>子コンポーネント1</p>
</>
);
});
const Child2 = () => {
return (
<>
<p>子コンポーネント2</p>
</>
);
};
export const Parent = () => {
const [text, setText] = React.useState('');
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setText(e.target.value);
};
return (
<div>
<p>親コンポーネント</p>
<input type="text" onChange={handleChange} />
<Child1 />
<Child2 />
</div>
);
};
使用useMemo进行复杂计算处理的记忆化
当处理复杂思维时,父组件每次渲染时,子组件会执行繁重的计算处理,即使计算结果没有变化,这将导致无谓的渲染浪费。
在以下情况下
-
- フォームに入力すると状態変数のtextが変化する。
-
- すると親コンポーネントがレンダリングされる。
doubleCountという計算処理が再度走る。
textを更新しただけでは、doubleCountの計算処理結果は変わらないので、余分な処理になってしまう。
export const Parent = () => {
const [text, setText] = React.useState('');
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setText(e.target.value);
};
const [count, setCount] = React.useState(0);
// 重い計算処理
const double = (count: number) => {
let i = 0;
while (i < 100000000) i++;
return count * 2;
};
const doubleCount = double(count);
return (
<div>
<p>親コンポーネント</p>
<input type="text" onChange={handleChange} />
<p>重い計算処理</p>
<p>{doubleCount}</p>
<button onClick={() => setCount(count + 1)}>カウントアップ</button>
</div>
);
};
通过使用useMemo,可以跳过不必要的重新计算。仅在依赖数组更新时才执行重新计算。
只在count发生变化时运行计算处理,需要注意的是,对于轻量级处理的记忆化可能会适得其反。
export const Parent = () => {
const [text, setText] = React.useState('');
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setText(e.target.value);
};
const [count, setCount] = React.useState(0);
const double = (count: number) => {
let i = 0;
while (i < 100000000) i++;
return count * 2;
};
// useMemoを使用することで、依存配列が更新された場合のみ再計算が実行される
const doubleCount = React.useMemo(() => double(count), [count]);
return (
<div>
<p>親コンポーネント</p>
<input type="text" onChange={handleChange} />
<p>重い計算処理</p>
<p>
{count}
{doubleCount}
</p>
<button onClick={() => setCount(count + 1)}>カウントアップ</button>
</div>
);
};
请参考