🦔
React useMemoの内部実装を読んでみました
サンプルコード
import { useMemo, useState } from 'react';
const App = () => {
const [dataInvolved, setDataInvolved] = useState(1)
const [dataNotInvolved, setDataNotInvolved] = useState(1)
const nums = useMemo(() => dataInvolved * dataInvolved, [dataInvolved])
const handleClick = () => {
setDataInvolved(d => d + 1)
}
const handleClick2 = () => {
setDataNotInvolved(d => d + 1)
}
return (
<div className='container'>
<button onClick={handleClick}>click</button>
<button onClick={handleClick2}>click2</button>
<p>count:{nums}</p>
</div>
);
};
export default App
動作
- clickをクリックしたとき、countが変動します
- click2をクリックしたとき、countが変動しません
メモリ図
内部実装
mount時
- Appを実行します
- useMemoを実行します
- mountMemoを実行します
- hookオブジェクトを生成します
- callbackを実行します
- callbackの実行結果と今回のdepsをmemoします
- callbackの実行結果をAppにreturnします
関連stateのアップデート時
- Appを実行します
- useMemoを実行します
- updateMemoを実行します
- memoした値を取り出します
- 今回のdepsとmemoしたdepsを比較します
6-1. 5の結果はfalseの場合、callbackを実行して、新しい値とdepsをmemoし、返します
6-2. 5の結果がtrueの場合、memoした値を返します
説明動画
Discussion