Vue の vue.$set() メソッドのソースコード例の詳細な説明

Vue の vue.$set() メソッドのソースコード例の詳細な説明

Vue を使用してプロジェクトを開発する過程で、次のような問題によく遭遇します。Vue のデータでオブジェクトまたは配列 (配列内の値はオブジェクト) が宣言または割り当てられ、オブジェクトに新しい属性が追加された場合、この属性の値が更新されても、ビューは更新されません。

これは、新しく追加された属性がレスポンシブではないため、ビューの更新がトリガーされないためです。通常、静的メソッド Vue.set() またはインスタンスメソッド this.$set() を使用してこれを解決します。使用方法:

オブジェクト: this.$set(ターゲット、キー、値)

配列: this.$set(ターゲット、インデックス、値)

ただし、静的メソッド Vue.set() であってもインスタンスメソッド this.$set() であっても、基礎となる実装ロジックは同じであり、実装ロジックは次のようになります。

/**
 * オブジェクトにプロパティを設定します。新しいプロパティを追加し、
 * プロパティが
 * すでに存在します。
 */
エクスポート関数セット (ターゲット: 配列<any> | オブジェクト、キー: any、値: any): any {
  // まず、渡されたターゲットオブジェクトが未定義、null、プリミティブ(元の値)であるかどうかを判断します。そうでない場合は、警告をスローします。if (process.env.NODE_ENV !== 'production' &&
    (isUndef(ターゲット) || isPrimitive(ターゲット))
  ){
    警告(`未定義、null、またはプリミティブ値にリアクティブ プロパティを設定できません: ${(target: any)}`)
  }
  // ターゲットオブジェクトが配列であり、キーが有効なインデックスであるかどうかを確認します。if (Array.isArray(target) && isValidArrayIndex(key)) {
    // ターゲット配列の長さとキーの大きい方の値をターゲットの長さ属性として取得します。target.length = Math.max(target.length, key)
    // キー位置の要素をスプライスで置き換えます target.splice(key, 1, val)
    戻り値
  }
  // ターゲットオブジェクトにキーがすでに存在する場合は、それを直接割り当てます。if (key in target && !(key in Object.prototype)) {
    ターゲット[キー] = 値
    戻り値
  }
  // ターゲット内のオブザーバーオブジェクトを取得します。const ob = (target: any).__ob__
  // ターゲットがvueインスタンスまたは$dataの場合、直接戻りますif (target._isVue || (ob && ob.vmCount)) {
    process.env.NODE_ENV !== 'production' && 警告(
      'Vue インスタンスまたはそのルート $data にリアクティブ プロパティを追加しないでください ' +
      「実行時 - データ オプションで事前に宣言します。」
    )
    戻り値
  }
  // obが存在しない場合は、ターゲットがレスポンシブなオブジェクトではないことを意味し、ビューの更新をトリガーせずに値が直接割り当てられます。if (!ob) {
    ターゲット[キー] = 値
    戻り値
  }
  // obが存在する場合は、キーをレスポンシブプロパティとして設定します。defineReactive(ob.value, key, val)
  // ビューの更新をトリガーする通知を送信します ob.dep.notify()
  戻り値
}

上記はvueのsetメソッドのソースコードです。ここで注目すべきは、配列を処理する際に使用されるspliceメソッドは配列自体のメソッドではなく、vueにカプセル化されたレスポンシブな配列メソッドであるということです。

Vue の vue.$set() メソッドの詳細なソースコード事例に関するこの記事はこれで終わりです。Vue の vue.$set() メソッドのソースコードに関するより関連性の高い内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。皆様の今後の 123WORDPRESS.COM へのご支援をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue.$set の失敗の落とし穴の発見と解決
  • Vue での this.$set の動的データバインディングのケーススタディ
  • Vue - 計算プロパティ「****」が割り当てられましたが、セッターがありませんというエラーの解決。
  • vue3.0 でのセットアップの使用 (2 つの使用方法)
  • Vue で resetFields() を使用する際の注意事項について簡単に説明します。

<<:  IDEA で Spring Boot プロジェクトをデプロイするためにリモート サーバー Docker に接続する方法の詳細なチュートリアル

>>:  MySQL マスタースレーブ構成の学習ノート

推薦する

この記事はJavaScriptの変数とデータ型を理解するのに役立ちます

目次序文:親切なヒント:変数1. 免責事項2. 譲渡3. 2つの小さな文法上の詳細変数の命名規則なぜ...

Linux ネットワークプログラミングにおけるソケットオプションの実装

ソケットオプション機能機能: ソケットファイル記述子の属性の読み取りと設定に使用されるメソッド #i...

MySQLクエリステートメントの簡単な操作例

この記事では、例を使用して、MySQL クエリ ステートメントの簡単な操作を説明します。ご参考までに...

CSSボックスモデルの紹介を読めば、混乱することはなくなるでしょう

Web デザインでよく耳にするプロパティ名: content、padding、border、marg...

Redis イメージの Docker インストールと設定手順

目次序文環境インストールMySQLコンテナを作成して起動する落とし穴を避けるための注意MySQLコン...

両側にCSS固定レイアウト、中央に適応レイアウトを実装

フローティング、フローティング埋め込み div、配置、フレックスという 4 つの一般的な方法と原則を...

C++ を使用して MySQL に接続する方法

C++でMySQLに接続する際の参考情報です。具体的な内容は以下のとおりです。 MySQLCon ク...

jsネイティブ構文プロトタイプ、__proto__、コンストラクタの徹底的な理解

目次1 はじめに2 前提条件2.1 データ型2.2 それが自身のプロパティであるかどうかを判断する ...

UbuntuにMySQLデータベースをインストールする方法

Ubuntu は、Linux をベースにした無料のオープンソース デスクトップ PC オペレーティン...

MySQL 8.0.13 zipパッケージのインストール方法について

MySQL 8.0.13 にはデフォルトでデータ フォルダがあります。このフォルダを削除する必要があ...

Linux で AutoFs マウント サービスをインストールするチュートリアル

Samba サービスでも NFS サービスでも、サーバーの起動時にリモート共有リソースが自動的にマ...

Tomcat の文字化けしたコードとポート占有の解決方法について簡単に説明します

Tomcat サーバーは、無料でオープン ソースの Web アプリケーション サーバーです。軽量のア...

Centos 7にmysql5.7.24バイナリバージョンをインストールする方法と解決方法

MySQLバイナリのインストール方法mysqlをダウンロード参考: 1. パッケージを解凍する ta...

Vueコンポーネントは、写真やビデオをアップロードするためのサンプルコードをカプセル化します

まず依存関係をダウンロードします: cnpm i -S vue-uuid ali-oss画像フィール...

Tomcatサーバーのセキュリティ設定方法

Tomcat は、Java Community Process を通じて Sun が開発した、広く使...