[解決済み] 関数コンポーネントのshouldComponentUpdate
質問
Reactの
shouldComponentUpdate
(について質問があります(上書きされていない場合)。私は純粋な、関数コンポーネントが好きですが、私はprops/stateが変更されていないにもかかわらず、それが毎回更新されることを恐れています。
だから私は代わりにPureComponentクラスを使用することを検討しています。
それに関する私の質問です。
ファンクション コンポーネントには、同じ
shouldComponentUpdate
のチェックはPureComponentsと同じですか?それとも毎回更新されるのでしょうか?
どのように解決するのですか?
Reactでは、機能コンポーネントはステートレスであり、ライフサイクルメソッドを持ちません。 ステートレス・コンポーネントは、バンドルに多くのコードを記述することなくReactコンポーネントを記述するエレガントな方法です。 しかし、内部的には、Statelessコンポーネントは現在最適化が適用されていないクラスでラップされています。つまり、ステートレス・コンポーネントもステートフル・コンポーネントも、内部的には同じコードパスを持っています(定義は違いますが)。
しかし、将来的にはここに書かれているように、Reactはステートレスコンポーネントを最適化する可能性があります。
将来的には、不要なチェックやメモリを回避することで、これらのコンポーネントに特化したパフォーマンスの最適化も可能になるでしょう 不必要なチェックやメモリの割り当てを避けることで、これらのコンポーネントに特化したパフォーマンスの最適化ができるようになるでしょう。 を回避することで、これらのコンポーネントに特化したパフォーマンスの最適化が可能になります。 [ もっと読む... ]。
shouldComponentUpdate
ここで、独自の最適化を適用し、コンポーネントの不要な再描画を回避することができます。さまざまなタイプのコンポーネントでこのメソッドを使用する方法を以下に説明します。
-
機能的なステートレス・コンポーネント
前述したように、ステートレス・コンポーネントはライフサイクル・メソッドを持たないので、このようなコンポーネントを
shouldComponentUpdate
. しかし、それらは別の方法ですでに最適化されており、よりシンプルでエレガントなコード構造を持っており、すべてのライフサイクルフックを持つコンポーネントよりも少ないバイト数で済みます。 -
はReact.PureComponentを拡張します。
から React v15.3.0 という新しいベースクラスがあります。
PureComponent
で拡張しPureRenderMixin
が組み込まれています。ボンネットの中で、これは現在のプロップ/状態と次のプロップ/状態の浅い比較を行います。shouldComponentUpdate
.とはいえ、私たちはまだ
PureComponent
クラスに依存することはできません。この異常なケースは、プロップがObject
型(配列、日付、プレーンオブジェクト)を持つ小道具がある場合に起こります。これは、オブジェクトを比較するときにこの問題が発生するためです。const obj1 = { id: 1 }; const obj2 = { id: 1 }; console.log(obj1 === obj2); // prints false
したがって、浅い比較では、物事が変わったかどうかを判断するのに十分ではありません。しかし
PureComponent
クラスは、プロップが単なる文字列、数値、ブーリアンなどであり、オブジェクトでない場合に使用します。また、独自の最適化を実装したくない場合にも、これを使用します。 -
React.Componentを拡張します。
上記の例で考えてみましょう。
id
が変更された場合、オブジェクトが変更されたことがわかれば、そのオブジェクトを比較することによって、独自の最適化を実装することができます。obj1.id === obj2.id
. そこで、私たちはextend
通常のComponent
をベースクラスとしshouldComponentUpdate
を使用して、特定のキーの比較を自分自身で行うことができます。
関連
-
[解決済み】<Router>の外側で<Link>を使用してはならない
-
[解決済み】無効な設定オブジェクトです。APIスキーマと一致しない設定オブジェクトを使用してWebpackが初期化されました。
-
[解決済み] react-router-domを使用する際に「Function components cannot be given refs」を回避するにはどうすればよいですか?
-
[解決済み] ReactjsのEsLintの "react / jsx-props-no-spreading "エラーを無効化する。
-
[解決済み] react.jsでng-ifに相当するものは何ですか?
-
[解決済み] ReactコンポーネントのJest SnapshotテストにおけるSnapshotテストの仕組みとtoMatchSnapshot()関数は何をするのか?
-
[解決済み] componentWillReceivePropsライフサイクルメソッドはいつ使用するのですか?
-
[解決済み] Reactプロジェクトに.envファイルを追加する
-
[解決済み] Reactコンポーネントに条件付きで属性を追加するにはどうすればよいですか?
-
[解決済み】Reactの機能的なステートレスコンポーネント、PureComponent、Component、どのような違いがあり、いつ何を使うべきですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エラー: 未定義のプロパティ 'map' を読み取ることができません。
-
[解決済み] Apolloクライアントでログアウトした後、ストアをリセットする
-
[解決済み] FontAwesomeの無料パッケージに含まれているアイコンのオブジェクト名はどこにあるのですか?
-
[解決済み] MUI Boxは何のためのコンポーネントですか?
-
[解決済み] React-Router 4 キャッチオールルート
-
[解決済み] React - 予想外のトークン、予想外の;
-
[解決済み] eslint: no-case-declaration - case ブロックで予期しない字句の宣言があった。
-
[解決済み] react-navigation v5を使ったreact-nativeアプリのAppNavigatorの構文を更新する。
-
[解決済み] ESLintとTSLintの違い【クローズド】について
-
[解決済み】Reactの機能的なステートレスコンポーネント、PureComponent、Component、どのような違いがあり、いつ何を使うべきですか?