Reactにおける不変値の説明

Reactにおける不変値の説明

不変の値とは何ですか?

関数型プログラミングとは、プログラム内の関数と式が数学の関数のようになることを意味します。入力値が与えられると、出力は確実になります。例えば

a = 1 とします。
b = a + 1 とします。
=> a = 1 b = 2;

変数 b が現れ、変数 a の値が使用されるものの、a の値は変更されません。

よく知っているReactのコードを見てみましょう。this.state = { count: 1 } を初期化すると

コンポーネントマウント() {
    const newState = { ...状態、カウント: 2 }; // { カウント: 2 }
    新しい状態を設定します。
}

this.state を使用しましたが、this.state の参照アドレスを変更したり、count の値を直接変更したりはしていません。this.props についても同様です。

不変の値を使用するのはなぜですか?

React の公式ウェブサイトでは、次の 3 つの利点が説明されています。

  • 複雑な機能を簡素化

不変性により、複雑な機能の実装が容易になります。

  • データの変更の追跡

データを直接変更すると、変更を追跡することが難しくなります。データの変更を追跡するには、変更可能なオブジェクトを変更前のバージョンと比較する必要があるため、オブジェクト ツリー全体を 1 回走査する必要があります。

不変データへの変更を追跡するのは比較的簡単です。オブジェクトが新しいオブジェクトになったことがわかった場合、オブジェクトは変更されたと言えます。

  • Reactで再レンダリングするタイミングを決定する

不変性の主な利点は、React で純粋なコンポーネントを作成するのに役立つことです。不変データが変更されたかどうか、そしてコンポーネントをいつ再レンダリングするかを簡単に判断できます。

Reactのパフォーマンス最適化は不変の値と切り離せない

  • まず、shouldComponentUpdate フック関数はデフォルトで true を返す、つまり親コンポーネントが更新される限り、子コンポーネントも更新される必要があることは誰もが知っています。
  • shouldComponentUdpate は、nextProps と nextState の 2 つのパラメータを受け取ることができます。this.props.xxx が nextProps.xxx に等しく、this.state.xxx が nextState.xxx に等しいと判断された場合、戻り値を false に設定して、今回はサブコンポーネントを更新する必要がないことを示すことができます。
クラス CounterButton は React.Component を拡張します {
  コンストラクタ(props) {
    スーパー(小道具);
    this.state = {count: 1};
  }

  コンポーネントを更新する必要があります(次のプロパティ、次の状態) {
    if (this.props.color !== nextProps.color) {
      true を返します。
    }
    if (this.state.count !== nextState.count) {
      true を返します。
    }
    false を返します。
  }

  与える() {
    戻る (
      <ボタン
        color={this.props.color}
        onClick={() => this.setState(state => ({count: state.count + 1}))}>
        カウント: {this.state.count}
      </ボタン>
    );
  }
}
  • React v15.3 では、props と state に対して浅い比較を実行してレンダリング関数の実行回数を減らし、不要なコンポーネントのレンダリングを回避し、パフォーマンスの最適化を実現できる新しい PureComponent クラスが追加されました。
  • PureComponentの原理は何ですか?

JS の変数型は、基本型 (数値、文字列、ブール値、未定義、null、シンボル) と参照型 (関数、オブジェクト、関数) に分かれていることはわかっています。基本型の値はスタック メモリに格納され、参照型の値はヒープ メモリに格納されます。スタック メモリには、ヒープ メモリへの参照のみが格納されます。浅い比較は、スタック メモリ内のデータのみを比較します。

クラスAppはPureComponentを拡張します{
  状態 = {
    アイテム: [1, 2, 3]
  }
  ハンドルクリック = () => {
    const { items } = this.state;
    アイテムをポップします。
    this.setState({ items });
  }
  与える() {
    戻る (
        <div>
            <ul>
                {this.state.items.map(i => <li キー={i}>{i}</li>)}
            </ul>
            <button onClick={this.handleClick}>削除</button>
        </div>
    )
  }
}

上記の例では PureComponent を使用しており、アイテムの参照アドレスを変更せずに items 配列の値のみを変更しています。そのため、アイテムは変更されていないとみなされ、レンダリング関数はトリガーされず、コンポーネントのレンダリングはトリガーされません。

コンポーネントの更新を実装する場合は、次のように新しい配列を作成し、新しい配列のアドレスを items に割り当てることができます。

ハンドルクリック = () => {
    const { items } = this.state;
    アイテムをポップします。
    var newItem = [...アイテム];
    this.setState({ 項目: newItem });
}
  • PureComponent は浅い比較を行うのに役立つので、状態にできるだけ注意を払う必要があります。データ構造内のネストされた参照を参照する必要がある場合は、Immutable.js を使用できます。
  • 不変とは何か

(1)不変とは、一度作成されると変更できないデータである。 (2)不変オブジェクトを変更、追加、削除すると、新しい不変オブジェクトが返されます。 (3)不変実装の原則は永続データ構造であり、つまり、永続データが新しいデータを作成する場合、古いデータが利用可能であり、同時に変更されていないことを保証する必要がある。 (4)同時に、deepCopyがすべてのノードをコピーすることによって生じるパフォーマンスの低下を回避するために、Immutableは構造共有を使用します。つまり、オブジェクトツリーノードが変更された場合、影響を受けるノードと親ノードのみが変更され、他のノードは共有されます。

最後に、コンポーネントレベルで浅い比較をしたい場合は、React.memo()関数を使うことができます。

要約する

実際、公式 Web サイトに記載されている不変性の 3 番目で最も重要な利点は、不変性によって React で PureComponent を使用できるようになることです。データが変更されたかどうか、コンポーネントをいつ再レンダリングする必要があるかを簡単に判断できます。

state の値を変更した場合、shouldComponentUpdate は現在の state と nextState を取得するか、props と nextProps で比較した値がまったく同じであれば、false が返されます。setState 操作を実行しても、UI は更新されません。

PureComponent は、パフォーマンスの最適化を実現するために Immutable.js と組み合わせて使用​​するのが最適です。

React.memo と組み合わせて、不要なコンポーネントの更新とレンダリングを回避します。

以上がReactにおける不変値についての詳しい説明です。Reactにおける不変値についてさらに詳しく知りたい方は、123WORDPRESS.COM内の他の関連記事もぜひご注目ください!

以下もご興味があるかもしれません:
  • 入力ボックスの値を取得する方法のReactの例
  • React ant Designはフォームの値を手動で設定します
  • Reactはantdフォーム割り当てを使用してポップアップボックスの操作を変更します
  • Reactプロジェクトでantdのフォームコンポーネントを使用して、入力ボックスの値を動的に設定する
  • React PropTypes 検証合格値操作の例
  • Reactコンポーネントの値の受け渡しの関係の詳細な説明
  • Reactコンポーネントで値を渡す3つの方法
  • Vue と React コンポーネント間の値の転送の詳細な説明
  • 親コンポーネントと子コンポーネント間で値を渡すReactメソッド
  • Reactのキー値の役割と使用法の詳細な説明
  • 親コンポーネントと子コンポーネント間で値を渡すReactメソッド
  • Reactの子コンポーネントは親コンポーネントに値を転送します
  • react-routerがジャンプ値転送を実装する方法の例

<<:  MySQL バッチ SQL 挿入パフォーマンス最適化の詳細な説明

>>:  Nginx プロキシ使用時にヘッダーに「_」が含まれることで情報が失われる問題の解決方法

推薦する

OR キーワードを使用した MySql 複数条件クエリ ステートメント

前の記事では、And キーワードを使用した MySql の複数条件クエリ ステートメントを紹介しまし...

モバイルウェブ画面適応(rem)

序文最近、フロントエンドの学習に関する以前のメモを整理したところ、モバイル Web 画面の適応 (r...

ノードイベントループとメッセージキューの分析

目次非同期とは何ですか?なぜ非同期性が必要なのでしょうか?非同期IOとは何ですか?イベントループとは...

MySQLデータベースインデックスの欠点と適切な使用

目次インデックスの適切な使用1. 通常のインデックスのデメリット2. 主キーインデックスの落とし穴3...

グループフィールドを 1 行に書き込むための mysql group_concat メソッドの例

この記事では、MySQL group_concat を使用してグループ化されたフィールドを 1 つの...

グリッド共通レイアウトの実装

両側に隙間なし、各列間に隙間あり 幅: 100%; 表示: グリッド; グリッドテンプレート列: r...

MySQL InnoDB ストレージエンジンのメモリ管理の詳細な説明

目次ストレージエンジンのメモリ管理データ ページを LRU キューの先頭に置かないのはなぜですか?ダ...

ログインインターフェースの使いやすさとセキュリティのバランスをとる方法

ウェブデザイナーでもUIデザイナーでも、ログインページや登録ページのデザインは必ず経験しなければなら...

Vueはボタン切り替え画像を実装します

この記事では、ボタン切り替え画像を実現するためのVueの具体的なコードを例として紹介します。具体的な...

CSSは高度に適応したフルスクリーンを実現します

独自のデモを作成するときに、display:flex を使用して垂直方向の中央揃えを実現したいと思い...

CSS3で実装されたテキストポップアップ効果

成果を達成する実装コードhtml <div>123WORDPRESS.COM</d...

get メソッドによる HTML フォームの値転送の例

google.htmlインターフェースは図の通りですコードは図のとおりです: (比較的シンプルで、入...

Linux インストール MySQL5.6.24 使用手順

Linux インストール MySQL ノート1. MySQL データベース サーバーをインストールす...

良い広告にはどのような特徴が必要ですか?

広告業は人間であることに似ていると言う人がいます。これは本当です。優れた広告には、優れた人間と同じよ...

Docker JVM メモリ使用量の表示

1. Docker コンテナのホスト マシンに入り、指定されたイメージを実行しているコンテナ ID ...