[解決済み] Reactメモを使うべきではない場合とは?
質問
私はこれまで
React
16.6.0
のアイデアが大好きで、最近
リアクト メモ
のアイデアが大好きなのですが、それを実装するのに最適なシナリオに関するものを見つけることができませんでした。
Reactのドキュメント( https://reactjs.org/docs/react-api.html#reactmemo ) は、機能的なコンポーネントのすべてにそれを投げることから、どんな意味合いも示唆していないようです。
再レンダリングが必要かどうかを判断するために浅い比較を行うので、次のような状況が発生することはありますか?
がパフォーマンスにマイナスの影響を与えるような状況はありますか?
このような状況は、実装のための当然の選択のように思えます。
// NameComponent.js
import React from "react";
const NameComponent = ({ name }) => <div>{name}</div>;
export default React.memo(NameComponent);
// CountComponent.js
import React from "react";
const CountComponent = ({ count }) => <div>{count}</div>;
export default CountComponent;
// App.js
import React from "react";
import NameComponent from "./NameComponent";
import CountComponent from "./CountComponent";
class App extends Component {
state = {
name: "Keith",
count: 0
};
handleClick = e => {
this.setState({ count: this.state.count + 1 });
};
render() {
return (
<div>
<NameComponent name={this.state.name} />
<CountComponent count={this.state.count} />
<button onClick={this.handleClick}>Add Count</button>
</div>
);
}
}
なぜなら
name
はこの文脈では決して変更されないので、この文脈では
をメモする
.
しかし、プロップが頻繁に変わるような状況ではどうでしょうか?
もし、別のボタンを追加して、そのボタンが他の状態を変化させ、再レンダリングを引き起こすとしたら、ラップする意味があるでしょうか?
CountComponent
で
メモ
は、このコンポーネントの設計上、頻繁に更新されることになっているにもかかわらず、?
私の主な疑問は すべてが純粋なままである限り、React Memoで機能的なコンポーネントをラップしない状況があるのでしょうか?
どのように解決するのですか?
すべてのリアクトコンポーネントは
shouldComponentUpdate()
メソッドを実装しています.デフォルトでは(
React.Component
を拡張したコンポーネント) では、これは常に真を返します。コンポーネントをメモすることで、(
React.memo
を通して) メモすることができるようになりました。
React.PureComponent
を拡張したもの) が導入されます。
shouldComponentUpdate()
メソッドの実装です。このメソッドは状態とプロップの浅い比較を行います。
を見ると
ドキュメントを見ると
を見ると、コンポーネントのライフサイクル・メソッドに関する
shouldComponentUpdate()
は
常に
はレンダリングが行われる前に呼び出されます。これは、コンポーネントをメモすることで、更新のたびにこの追加の浅い比較が含まれることを意味します。
このことを考慮すると、コンポーネントをメモすることは は はパフォーマンスに影響を及ぼし、その影響の大きさは、アプリケーションをプロファイリングして、メモ化の有無によって動作が良くなるかどうかを判断することによって決定されるべきです。
あなたの質問に答えるために、私はあなたがコンポーネントをメモするべきまたはそうでないときの明確なルールがあるとは思いません。
shouldComponentUpdate()
: パフォーマンスの問題を見つけるには、提案されている
プロファイリングツール
を使用してパフォーマンスの問題を発見し、コンポーネントを最適化する必要があるかどうかを識別します。
関連
-
[解決済み] 正規表現で変数を使うには?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み] varキーワードの目的と、どのような場合に使用する(または省略する)べきですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] encodeURI / encodeURIComponentの代わりにescapeを使用するのはどのような場合ですか?
-
[解決済み] React-routerのURLを更新したり、手動で書き込んだりするとうまくいかない
-
[解決済み] ES6インポートで中括弧を使用するのはどのような場合ですか?
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] URL/アドレスバーからJavascriptの関数を呼び出す
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] JavaScriptのtoString()関数をオーバーライドして、デバッグ用に意味のある出力を提供することは可能でしょうか?
-
[解決済み] サブドメインにまたがってlocalStorageを使用する
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] Angular 2 パスが存在しない場合に404や他のパスにリダイレクトする方法 [重複]について
-
[解決済み] WebpackでjQueryを本物のWindowオブジェクトに公開する
-
[解決済み] ドット記法の文字列を使用してオブジェクトの子プロパティにアクセスする [重複].
-
[解決済み] JavaScriptでクエリ文字列が存在するかどうかを確認するには?
-
[解決済み] バックボーンビュー。親からイベントを継承・拡張する