リソースを消費する関数を実行する際に、メモリと実行時間を最小限に抑えることができるパフォーマンスチューニングの一つ。関数が計算した値、あるいはオブジェクトをキャッシュすることにより機能する。
propsが変更されない限り、再レンダリングをスキップする。
重い処理があり、propsで渡ったcountを表示するコンポーネント。
export const Memo = memo(({ count }: Props) => {
console.log('Memo rendering');
setTimeout(() => {
console.log('Memo: HeavyProcessing done');
}, 1000);
return <p>Memo: secont-count is {count}</p>;
});
secondCountの値が変わったときのみMemoコンポーネントを再レンダリングする。
function App() {
const [firstCount, setFirstCount] = useState(0);
const [secondCount, setSecondCount] = useState(0);
const handleClickFirstCount = () => {
setFirstCount(firstCount + 1);
};
const handleClickSecondCount = () => {
setSecondCount(secondCount + 1);
};
return (
<>
<h1>Performance-tuning</h1>
<div className='card'>
<button onClick={handleClickFirstCount}>
first-count is {firstCount}
</button>
<button onClick={handleClickSecondCount}>
second-count is {secondCount} (memo)
</button>
</div>
<Memo count={secondCount} />
</>
);
}
export default App;
関数をメモ化するフック。依存する値が変化しない限り、キャッシュしたコールバック関数を使用する。
重い処理があり、propsで関数が渡されるコンポーネント。
export const UseCallback = memo(({ handleClick }: Props) => {
console.log('useCallback rendering');
setTimeout(() => {
console.log('useCallback: HeavyProcessing done');
}, 1000);
return <button onClick={handleClick}>CallBack</button>;
});