目次
アプリケーション シナリオ
セット実装
$set
vuejs 入門チュートリアル
ホームページ ウェブフロントエンド Vue.js Vue で $set がどのように実装されるかについて話しましょう。

Vue で $set がどのように実装されるかについて話しましょう。

Dec 15, 2022 pm 09:26 PM
vue.js

Vue で $set がどのように実装されるかについて話しましょう。

Vue2 の応答性の中核は ES5 の Object.defineProperty を使用することであるため、日常の開発では $set も非常に実用的な API です。 、配列の添字を直接変更して配列を変更したり、オブジェクトに新しいプロパティを追加したりすると、Object.defineproperty はデータの変更を監視できません。このとき、誰もが $set を使用します。変更された操作も応答するようになりました。それはわかっていますが、その理由もわかります。次に、Vue の $set がどのように実装されているかを見てみましょう。 [関連する推奨事項: vuejs ビデオ チュートリアル Web フロントエンド開発 ]

アプリケーション シナリオ

 let dataArr = ["item1"];
 let dataObject = {
      name: "ccs"
    };

    dataArr[2] = "item2";
    dataObject.age = 22;
    响应失败,页面没有显示更新新增的数据

    this.$set(this.dataArr,2,'item2')
    this.$set(this.dataObject,'age',22)
    响应成功,页面显示更新新增的数据
ログイン後にコピー

セット実装

次に、Vue での $set の定義を見てみましょう

function set(target: Array<any> | Object, key: any, val: any): any {
  if (
    process.env.NODE_ENV !== "production" &&
    (isUndef(target) || isPrimitive(target))
  ) {
    warn(
      `Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`
    );
  }
  if (Array.isArray(target) && isValidArrayIndex(key)) {
    target.length = Math.max(target.length, key);
    target.splice(key, 1, val);
    return val;
  }
  if (key in target && !(key in Object.prototype)) {
    target[key] = val;
    return val;
  }
  const ob = (target: any).__ob__;
  if (target._isVue || (ob && ob.vmCount)) {
    process.env.NODE_ENV !== "production" &&
      warn(
        "Avoid adding reactive properties to a Vue instance or its root $data " +
          "at runtime - declare it upfront in the data option."
      );
    return val;
  }
  if (!ob) {
    target[key] = val;
    return val;
  }
  defineReactive(ob.value, key, val);
  ob.dep.notify();
  return val;
}
ログイン後にコピー

ソースコードでは、まず set の対象が 未定義 かつ 基本型#であるかどうかを判断します。 ##それが の場合、未定義 または 基本タイプ がエラーを報告する場合、
ユーザーは未定義および基本タイプに設定すべきではないため、then は、ターゲットが配列であるかどうかを判断します。キーは正当なインデックスですか? 正当なインデックスとは、0 以上の値を持つ整数を指します。
両方の条件が true の場合、splice メソッドを呼び出します。
配列を挿入または変更するターゲット配列 , ここでの
splice は通常の splice ではありません。 はスプライス#です## Wang Wei の詩の、vue プロキシによって書き換えられたスプライスです。配列実装応答

$set は、配列変更応答を一部として実装します。エージェントによって書き換えられた配列メソッド 次に、具体的な実装を見てみましょう

const arrayProto = Array.prototype
export const arrayMethods = Object.create(arrayProto)

const methodsToPatch = [
  &#39;push&#39;,
  &#39;pop&#39;,
  &#39;shift&#39;,
  &#39;unshift&#39;,
  &#39;splice&#39;,
  &#39;sort&#39;,
  &#39;reverse&#39;
]
function def(obj, key, val, enumerable) {
    Object.defineProperty(obj, key, {
        value: val,
        enumerable: !!enumerable,
        writable: true,
        configurable: true
    });
}
methodsToPatch.forEach(function (method) {
  const original = arrayProto[method]
  def(arrayMethods, method, function mutator (...args) {
    const result = original.apply(this, args)
    const ob = this.__ob__
    let inserted
    switch (method) {
      case &#39;push&#39;:
      case &#39;unshift&#39;:
        inserted = args
        break
      case &#39;splice&#39;:
        inserted = args.slice(2)
        break
    }
    if (inserted) ob.observeArray(inserted)
    ob.dep.notify()
    return result
  })
})
ログイン後にコピー
vue のエージェントは、

splice

だけでなく、7 つのメソッドも書き換えます。 ##プッシュ、ポップ、シフト、シフト解除、スプライス、ソート、リバース。 まず、const result =original.apply(this, args)元の配列のメソッドを実行してその値を取得し、配列に値を追加するかどうかを決定します 新しく追加された値も実装されます 応答性,最後のステップこの配列の
_ob_object を取得します Pair _ob_ の dep が配布および更新されます。 vue の応答性について詳しく知りたい場合は、以前の記事をご覧ください。
面接官から Vue2 の応答性の原則について質問されました。どう答えましたか? - Nuggets (juejin.cn)
オブジェクト実装応答

$set

下半分のロジックは、オブジェクト応答を処理するために使用されます。

  if (key in target && !(key in Object.prototype)) {
    target[key] = val;
    return val;
  }
  const ob = (target: any).__ob__;
  if (!ob) {
    target[key] = val;
    return val;
  }
  defineReactive(ob.value, key, val);
  ob.dep.notify();
  return val;
ログイン後にコピー
まず、プロパティを判断します。ターゲット オブジェクトを直接返してロジックを終了すると、 vue は元々存在しないプロパティのみを追加するため、応答の喪失

,
たとえば、obj={} obj.name='ccs',
vue とすると、初期化中にデータ内のすべての属性が応答可能になります。値がオブジェクトまたは配列の場合、新しい Observer インスタンスは __ob__ に保存されます。
vue の応答性について詳しく知りたい場合は、以前の記事をチェックしてくださいインタビュアー Vue2 の応答性の原則について質問しましたが、どう答えますか? - Nuggets (juejin.cn)
このオブジェクトの _ob_ を取得して判断します。存在しない場合は、vue によって初期化されていない 通常のオブジェクトであることを意味します。
レスポンス Formula オブジェクトの それ以外の場合は、defineReactive を介して属性に get メソッドと set メソッド を手動で追加してレスポンスを実装します、その後手動で呼び出します # # in dep #notify()更新を公開します。
概要vue の $set メソッドは、配列とオブジェクトを基本的に同じ方法で処理し、新しい値への応答を追加し、手動でディスパッチ更新をトリガーします。

(学習ビデオ共有:

vuejs 入門チュートリアル

基本プログラミング ビデオ

)

以上がVue で $set がどのように実装されるかについて話しましょう。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

vite が .env ファイルを解析する方法についての詳細な説明 vite が .env ファイルを解析する方法についての詳細な説明 Jan 24, 2023 am 05:30 AM

Vue フレームワークを使用してフロントエンド プロジェクトを開発する場合、デプロイ時に複数の環境をデプロイすることになりますが、開発環境、テスト環境、オンライン環境で呼び出されるインターフェイス ドメイン名が異なることがよくあります。どうすれば区別できるでしょうか?それは環境変数とパターンを使用することです。

Ace コード エディターを Vue プロジェクトに統合する方法の詳細な図による説明 Ace コード エディターを Vue プロジェクトに統合する方法の詳細な図による説明 Apr 24, 2023 am 10:52 AM

Ace は、JavaScript で書かれた埋め込み可能なコード エディターです。 Sublime、Vim、TextMate などのネイティブ エディターの機能とパフォーマンスに匹敵します。あらゆる Web ページや JavaScript アプリケーションに簡単に埋め込むことができます。 Ace は Cloud9 IDE のメイン エディタとして維持されており、Mozilla Skywriter (Bespin) プロジェクトの後継です。

vue のコンポーネント化とモジュール化の違いは何ですか vue のコンポーネント化とモジュール化の違いは何ですか Dec 15, 2022 pm 12:54 PM

コンポーネント化とモジュール化の違い: モジュール化はコード ロジックの観点から分割され、コードの階層化された開発が容易になり、各機能モジュールの機能の一貫性が保証されます。コンポーネント化は UI インターフェイスの観点から計画され、フロントエンドのコンポーネント化により UI コンポーネントの再利用が容易になります。

Vue3 で単体テストを作成する方法を調べる Vue3 で単体テストを作成する方法を調べる Apr 25, 2023 pm 07:41 PM

Vue.js は、今日のフロントエンド開発において非常に人気のあるフレームワークとなっています。 Vue.js が進化し続けるにつれて、単体テストの重要性がますます高まっています。今日は、Vue.js 3 で単体テストを作成する方法を検討し、いくつかのベスト プラクティスと一般的な問題と解決策を提供します。

vue3 の reactive() について詳しく話しましょう vue3 の reactive() について詳しく話しましょう Jan 06, 2023 pm 09:21 PM

前書き: vue3 の開発では、reactive は応答性の高いデータを実装するメソッドを提供します。これは日常の開発で頻繁に使用される API です。この記事では、著者はその内部動作メカニズムを探ります。

JSX 構文と Vue のテンプレート構文の簡単な比較 (利点と欠点の分析) JSX 構文と Vue のテンプレート構文の簡単な比較 (利点と欠点の分析) Mar 23, 2023 pm 07:53 PM

Vue.js では、開発者は、JSX 構文とテンプレート構文という 2 つの異なる構文を使用してユーザー インターフェイスを作成できます。どちらの構文にもそれぞれ長所と短所があるので、それらの違い、長所と短所について説明します。

Vue3 動的コンポーネントで例外を処理する方法の簡単な分析 Vue3 動的コンポーネントで例外を処理する方法の簡単な分析 Dec 02, 2022 pm 09:11 PM

Vue3 動的コンポーネントで例外を処理するにはどうすればよいですか?次の記事では、Vue3 の動的コンポーネントの例外処理方法について説明します。

Vue2実装APIの原理を解析する Vue2実装APIの原理を解析する Jan 13, 2023 am 08:30 AM

Vue3 のリリース以来、単語合成 API は Vue を書く学生の視野に入ってきました。合成 API が以前のオプション API よりもどれほど優れているかは誰もが聞いたことがあると思います。そして、@ のリリースにより、 vue/composition-api プラグイン、Vue2 学生もバスに乗れます. 次に、主に Response ref と Reactive を使用して、このプラグインがどのようにこれを実現しているかを詳細に分析します。

See all articles