前提
CodeSandBox
・1秒ずつカウントアップしていき、現在のカウント数を表示するコンポーネントがあります。
・コンポーネントは現在カウント数のほか、imgやテキストなども含まれています。
・コンソールにレンダリングされた回数が表示されます。
疑問
再レンダリングが必要なのは現在カウント数の部分のみですが、現在カウント数以外の要素も再レンダリングされています。
たまにならいいのですが、再レンダリングしなくてよい要素を1秒毎にレンダリングするのは、なんだか心地が良くないです。
そこでuseMemo
で現在カウント数以外の要素をメモ化すれば、1秒毎にカウント数以外の要素を再レンダリングしなくてよいのではないかと考えました。
js
1const otherItems = useMemo(() => ( 2 <> 3 カウント数以外の要素 4 </> 5),[])
しかし、useMemo
の使い方について諸々とググったのですが、DOMをメモ化している例を見つけられませんでした。
また、メモ化したい要素としたくない要素が入り組んでいる場合は、useMemo
を複数回に渡って書かなければいけなさそうで、それはそれで労多くして益少なしという感じがしています。
以上のような場合、DOMをメモ化した方がよいですか?
そもそも上記のケースにおいて、メモ化以外によいパフォーマンスチューニングの方法があればご教示いただきたいです。
DOMのレンダリングなんてたいしたことないからほっとけ、とか、img要素だけはメモ化しとけ、などのご意見もあればいただきたいです。
該当のソースコード
js
1const useCount = () => { 2 const [count, setCount] = useState(0); 3 useEffect(() => { 4 setTimeout(() => setCount(count + 1), 1000); 5 }, [count]); 6 return count; 7}; 8 9const App = () => { 10 console.count(); 11 const count = useCount(); 12 return ( 13 <> 14 <p>{count}</p> 15 <div style={box}></div> 16 <img style={img} src={onsen} alt="onsen" /> 17 <p>test</p> 18 <input type="range" style={{ width: "100%" }} /> 19 <button style={button}>button</button> 20 <iframe 21 width="560" 22 height="315" 23 src="https://www.youtube.com/embed/AhmI6KVwNJw" 24 frameborder="0" 25 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 26 allowfullscreen 27 ></iframe> 28 </> 29 ); 30}
あなたの回答
tips
プレビュー