Vueのprovideとinjectの使い方と原則を分析する

Vueのprovideとinjectの使い方と原則を分析する

まず、provide/inject を使用する理由について説明しましょう。祖父コンポーネントと孫コンポーネント間の通信、または曽祖父コンポーネントと孫コンポーネント間の通信には、vuex を使用できます。

確かにその通りですが、聞いてください。プロジェクトが比較的小規模で、コンポーネント通信のシナリオも少ない場合もあります。その場合、いくつかの通信パラメータのためだけに vuex を導入するのは無駄ではないでしょうか。 $parentを使用して親コンポーネントのインスタンスを取得し、データやメソッドを取得することも考える人もいるかもしれません。これは 2 つのレイヤーでは問題ありませんが、複数のレイヤーの場合はどうでしょうか。コンポーネントが深くネストされている場合、どのようにすればよいでしょうか。 $parent再度カプセル化する関数を記述します。それはとても面倒ではないでしょうか?すでに問題が起きているのに、遠回りして解決する必要はありません。ハハハ〜話がそれましたね。

これ以上長々と説明せずに、provide/inject を使用することが問題の解決策であることをお伝えします。使い方を見てみましょう。 Backhand は、ほんの数行のシンプルなコードです。

1. 親コンポーネントは子コンポーネントに渡すパラメータを提供する provide() {
    戻る {
      リストタイプ: this.listType、
    }
  }
2. サブコンポーネントの使用法:
挿入: ['listType'],

もちろん、inject でデフォルト値とパラメータのソースを指定することもできます。

注入:{
  リストタイプ:{
  from:"par"//定義された名前を指定します default:1
  }
}

わかった!簡単じゃないですか?実際、コンポーネント階層の深さに関係なく、親コンポーネントと祖先コンポーネントの両方が子孫コンポーネントに依存関係を注入できます。

さらにいくつか:

provide はオブジェクトまたはオブジェクトを返す関数になります。

inejct: は文字列配列またはオブジェクトになります。

興味があれば、以下のソースコードをご覧ください。これも非常にわかりやすいです。

コアソースコードを提供します:

エクスポート関数 provide<T>(キー: InjectionKey<T> | 文字列 | 数値、値: T) {
  現在のインスタンスの場合
    __DEV__ の場合 {
      警告(`provide() は setup() 内でのみ使用できます。`)
    
    }
  } それ以外 {
    //現在のコンポーネントのprovidesを取得します。デフォルトインスタンスは親クラスのprovidesオブジェクトを継承します。let provided = currentInstance.provides
    //親の提供オブジェクトをプロトタイプとして使用して、独自の提供オブジェクトを作成します。const parentProvides =
      currentInstance.parent && currentInstance.parent.provides
    if (parentProvides === 提供) {
      提供 = currentInstance.provides = Object.create(parentProvides)
    }
    [キーを文字列として] = 値を提供する
  }
}
​

Inject のコアソースコード:

エクスポート関数inject(
  キー: InjectionKey<任意> | 文字列、
  デフォルト値?: 不明、
  デフォルトをファクトリとして扱う = false
){
  //現在のコンポーネントインスタンスを取得します const instance = currentInstance || currentRenderingInstance
  if (インスタンス) {
  //Getは提供します
    constは=を提供します
      インスタンス.親 == null
        ? instance.vnode.appContext && instance.vnode.appContext.provides
        : インスタンス.親.提供
​
    if (provides && (key as string | symbol) in provided) {
      //キーが存在する場合は、provides[key as string]を直接返します
    } そうでなければ (引数の長さ > 1) {
      //キーが存在しない場合はデフォルト値を設定し、デフォルト値を直接返します return treatDefaultAsFactory && isFunction(defaultValue)
        ? defaultValue.call(instance.proxy)
        : デフォルト値
    } そうでない場合 (__DEV__) {
      // いずれも見つからない場合は、warn(`injection "${String(key)}" not found.`) と警告します。
    }
  } そうでない場合 (__DEV__) {
    警告(`inject() は setup() または機能コンポーネント内でのみ使用できます。`)
  }
}
​

これで、Vue の provide と inject の使い方と原理の解析に関するこの記事は終了です。Vue の provide と inject の使い方の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vueはレスポンスの提供と注入の問題を解決します
  • Vue.js で provide/inject を使用してレスポンシブなデータ更新を実装する方法の例
  • Vue で [provide/inject] を使用してページのリロードを実装する方法
  • Vue 2.0 における provide/inject の組み合わせの実用化
  • Vue での provide/inject の学習と使用

<<:  HTML フレームセットのサンプルコード

>>:  CSS3 とテーブルタグを使用して円軌道アニメーションを実装するためのサンプルコード

推薦する

Linux で Scala 環境を構築し、簡単な Scala プログラムを書く

Linux に Scala 環境をインストールするのは非常に簡単です。Ubuntu 環境であれば、さ...

MySQL でテーブル データを削除した後もディスク領域がまだ占有されているのはなぜですか?

目次1.MySQLデータ構造2. テーブルファイルのサイズは変更されておらず、MySQLの設計に関連...

HTML でテーブルを分割および結合する (colspan、rowspan)

このコードは水平マージを示しています。 <!DOCTYPE html PUBLIC "...

VueはTodoListの例をカプセル化し、ブラウザのローカルキャッシュのアプリケーションを実装します。

この記事では主に、Vue で TodoList をカプセル化するケースと、ブラウザのローカル キャッ...

HTML+CSS+jQuery はスクリーンショットで検索ホットリストタブ効果を模倣します

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

Vue 仮想 Dom から実際の Dom への変換

別のツリー構造があるJavascriptオブジェクトでは、このツリーが本物であると伝えるだけでよいD...

シンプルなビデオ連射機能を実装する JavaScript CSS3

この記事では、最も単純なビデオ連射機能をシミュレートするデモを作成します。アイデア:再生する動画と同...

Dockerイメージのローカル移行の実装

最近 Docker を勉強しているのですが、よく問題に遭遇します。Docker イメージをダウンロー...

Node.js mysqlクライアントが認証プロトコルをサポートしていない問題を解決する

序文mysql モジュール (プロジェクト アドレスは https://github.com/mys...

MySQLのインデックスシステムがB+ツリーを使用する理由の分析

目次1. インデックスとは何ですか? 2. インデックスはなぜ必要なのでしょうか? 3. インデック...

HTMLフォーム送信方法のケーススタディ

フォームの送信方法をまとめると次のようになります。 1. 送信ボタンを使用して送信します。送信ボタン...

TypeScriptの基本型の詳細な説明

目次ブール型数値型文字列型文字列と数値を連結する未定義およびnull配列型タプル型列挙型あらゆるタイ...

OpenSSL は双方向認証のチュートリアルを実装します (サーバーとクライアントのコード付き)

1. 背景1.1 問題点最近の製品テスト レポートでは、PKI ベースの認証方法の使用が推奨されて...

負荷分散と動的および静的分離操作を実現するDocker NginxコンテナとTomcatコンテナ

Tomcat8 イメージをダウンロード [root@localhost ~]# docker sea...

MySQL のロックの仕組みと使用法の分析

この記事では、例を使用して MySQL のロック メカニズムと使用方法を説明します。ご参考までに、詳...