[解決済み] リアクトのシャローコンパールはどのように機能するのか
2022-05-15 23:03:35
質問
で このドキュメント を見ると、React の
shallowCompareは、現在のpropsとnextPropsオブジェクト、および現在のstateとnextStateオブジェクトに対して浅い等式チェックを実行します。
私が理解できないことは、それが浅くオブジェクトを比較する場合、shouldComponentUpdateメソッドは常にtrueを返すということです。
状態を変化させるべきではありません。
で、状態を変更しない場合、比較は常に false を返すので、shouldComponent の更新は常に true を返します。これがどのように動作しているのか、またパフォーマンスを上げるためにどのようにオーバーライドするのか、混乱しています。
どのように解決するのですか?
浅い比較では、等しいかどうかをチェックします。スカラー値 (数値、文字列) を比較する場合は、その値を比較します。オブジェクトを比較する場合は、属性を比較せず、参照のみを比較します(例:"同じオブジェクトを指しているか?")。
次のような
user
オブジェクト
user = {
name: "John",
surname: "Doe"
}
例1:
const user = this.state.user;
user.name = "Jane";
console.log(user === this.state.user); // true
ユーザー名を変更したことに注意してください。この変更にもかかわらず、オブジェクトは同等です。参照はまったく同じです。
例2:
const user = clone(this.state.user);
console.log(user === this.state.user); // false
さて、オブジェクトのプロパティに何の変更も加えなければ、それらは完全に異なるものになります。元のオブジェクトのクローンを作成することで、異なる参照を持つ新しいコピーを作成することができます。
クローン関数は以下のようになります(ES6構文)。
const clone = obj => Object.assign({}, ...obj);
浅い比較は、変更を検出する効率的な方法です。これはデータを変更しないことを前提としています。
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] なぜGoogleはJSONレスポンスにwhile(1);を前置するのでしょうか?
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み】別のウェブページにリダイレクトするにはどうすればいいですか?
-
[解決済み] javascriptからフィールドを無効とすることはできますか?
-
[解決済み] React.jsでテキスト入力のchange/focusOutイベントを正しくキャッチする方法とは?
-
[解決済み] ネストされたJSONオブジェクト - すべてに配列を使用しなければならないのか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] useEffectの無限ループ
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] マングース ユーザーの全リストを取得する
-
[解決済み] ネストしたオブジェクトのプロパティを動的に設定する
-
[解決済み] Firebase用Cloud Functionsのトリガーは時間通り?
-
[解決済み] React Router v4 <NavLink>と<Link>の違いについて
-
[解決済み] AngularJsでng-repeatを使用してフィルタリング(キー、値)を行うには?
-
[解決済み] JavaScriptでユーザーのローカルLANのIPアドレスを取得できるか?