質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

0回答

781閲覧

useMemoでDOMをメモ化するのってコスパが悪いですか?

evgenia

総合スコア28

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2020/11/08 13:02

前提

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問