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 プロキシ使用時にヘッダーに「_」が含まれることで情報が失われる問題の解決方法

推薦する

シンプルなカレンダー効果を実現する js

この記事では、シンプルなカレンダー効果を実現するためのjsの具体的なコードを参考までに共有します。具...

Vue で Excel ストリーム ファイルをダウンロードし、ダウンロード ファイル名を設定する方法

目次概要1. URL経由でダウンロード2. aタグのダウンロード属性とblobコンストラクタを組み合...

英語のシングルクォーテーション「''」を含むSQLの記述の失敗について徹底解説

問題が発生しました。情報の編集をテストする際、編集した内容に一重引用符 (') が含まれてい...

MySQL ビューの原則と使用例の概要

この記事では、MySQL ビューの原理と使用法についてまとめます。ご参考までに、詳細は以下の通りです...

jQueryブリージングカルーセルの制作原理を詳しく解説

この記事では、jQueryブリージングカルーセル制作原理の具体的なプロセスを参考までに紹介します。具...

Ubuntuのpython3でvenvを使用して仮想環境を作成する

1. 仮想環境はプロジェクトに従い、単一のプロジェクト用の仮想環境を作成します(Python 3.4...

Docker-compose を使用して ELK をデプロイするためのサンプル コード

環境ホストIP 192.168.0.9 Docker バージョン 19.03.2 docker-co...

Linux システム ディレクトリ sys、tmp、usr、var の詳細な説明。

Linux 初心者から Linux マスターへの成長の道: Linux システム ディレクトリ s...

Linux と Windows でスケジュールされたタスクを設定する方法

目次リナックス1. crontabの基本的な使い方2. ログを有効にする3. スケジュールされたタス...

Vue+canvas は、ウォーターフォール チャートを上から下までリアルタイムに更新する効果を実現します (QT と同様)

早速ですが、デモ画像をご紹介します。実装されている機能は、左側に凡例、右側にウォーターフォール チャ...

Linux のような環境で jdk1.8 をインストールし、環境変数を設定する方法の詳細な説明

設定は非常にシンプルですが、毎回確認しないといけないので、記録だけ残しておきます。 1. インストー...

MySQL で左結合を使用して where 条件を追加する問題の詳細な分析

現在の需要:グループとファクターの 2 つのテーブルがあります。1 つのグループは複数のファクターに...

Nginxはctxを使用してデータ共有とコンテキスト変更機能を実現します。

環境: init_worker_by_lua、set_by_lua、rewrite_by_lua、a...

親要素に対する CSS 子要素の配置の実装

解決親要素に position:relative を追加します。子要素に position:abso...

MySQL スケジュールされたデータベース バックアップ操作の例

この記事では、MySQL のスケジュールされたデータベース バックアップ操作の例について説明します。...