Vue3 における非親子コンポーネントの値転送の詳細な説明

Vue3 における非親子コンポーネントの値転送の詳細な説明
vue2 における非親子コンポーネントの値の伝達は、主にイベント バスを介して行われ、vue インスタンスを作成し、そのインスタンスを異なるコンポーネントにインポートすることで、非親子コンポーネント間の通信動作を実装します。
Vue3 は **provide** プロパティと **inject** プロパティを提供しており、親子関係のないコンポーネント間の通信を実現できます。
App.vue (親)、sub1 (子)、sub2 (子の子) の 3 つのコンポーネントがあるとします。

アプリ.vue

<テンプレート>
  <div style="border: 1px solid pink">
    <h1>私はあなたの父親です</h1>
    👇
    <sub1/>
  </div>
</テンプレート>
<スクリプト>
  './sub1' から sub1 をインポートします
	エクスポートデフォルト{
		名前:「アプリ」、
    コンポーネント:{
			サブ1、
    },
    provide:{ // 親コンポーネントで provide を定義して、渡される値を宣言します names:['peanut','javascriptKing']
    }
	}
</スクリプト>
<スタイルスコープ>
</スタイル>

サブ1.vue

<テンプレート>
  <h2>私は第 1 レベルの子コンポーネントです</h2>
  👇
  <sub2/>
</テンプレート>
<スクリプト>
  「./sub2」からsub2をインポートします。
	エクスポートデフォルト{
		名前: "sub1",
    コンポーネント:{
			サブ2、
    }
	}
</スクリプト>
<スタイルスコープ>
</スタイル>

サブ2.vue

<テンプレート>
  <h3>私は末っ子、孫です</h3>
  <div>トップレベルコンポーネントの名前配列を参照しました ===> {{names}}</div>
</テンプレート>
<スクリプト>
	エクスポートデフォルト{
		名前: "sub2",
    // inject:['names'] を通じて子コンポーネントでクロスレベル値を受け入れます。
	}
</スクリプト>
<スタイルスコープ>
</スタイル>

実装効果は次のようになり、トップレベルコンポーネントで渡された値が正常に取得できることがわかります。

ここに画像の説明を挿入

しかし、問題もあります。

つまり、トップレベルのコンポーネントが渡したい値が変更された場合、どうすればそれを応答性のあるものにできるでしょうか?

provide プロパティでこれを使用して現在のインスタンスを取得するにはどうすればよいでしょうか?

ここでは、provide 属性をメソッドとして記述し、配列またはオブジェクトを返す必要があります。

<テンプレート>
  <div style="border: 1px solid pink">
    <h1>私はあなたの父親です</h1>
    👇
    <sub1/>
  </div>
</テンプレート>
<スクリプト>
  './sub1' から sub1 をインポートします
	エクスポートデフォルト{
		名前:「アプリ」、
    データ(){
			戻る {
				名前:['ピーナッツ','javascriptキング']
      }
    },
    コンポーネント:{
			サブ1、
    },
    /*このように書いても、this は取得されません。現時点では、スクリプト内の this のスコープが未定義であることを意味します*/
    /*提供する:{
			this.names、
    }*/
  // 次のように記述する必要があります provide(){
    	戻る {
    		名前:this.names
      }
    }
	}
</スクリプト>
<スタイルスコープ>
</スタイル>

上で書いたように、これで指し示すインスタンス配下のデータを取得することはできるのですが、これらを依存関係を形成させて応答性を実現するにはどうすればよいのでしょうか。これを行うには、App.vue に次の変更を加える必要があります。

<テンプレート>
  <div style="border: 1px solid pink">
    <h1>私はあなたの父親です</h1>
    👇
    <sub1/>
  </div>
</テンプレート>
<スクリプト>
  './sub1' から sub1 をインポートします
  'vue' から { computed } をインポートします
	エクスポートデフォルト{
		名前:「アプリ」、
    データ(){
			戻る {
				名前:['ピーナッツ','javascriptキング']
      }
    },
    コンポーネント:{
			サブ1、
    },
    /*このように書いても、this は取得されません。現時点では、スクリプト内の this のスコープが未定義であることを意味します*/
    /*提供する:{
			this.names、
    }*/
  // 次のように記述する必要があります provide(){
    	戻る {
    		names:computed(() =>{ this.names.length }) // 計算プロパティを使用して変数を返すことで、names がデータ内の名前と依存関係を形成するようにします}
    },
    マウント() {
    	設定間隔(()=>{
    		this.names.push('vue king!')
      },1000)
    }
	}
</スクリプト>
<スタイルスコープ>
</スタイル>

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • Vueのコンポーネント間で通信して値を渡すいくつかの方法の詳細な説明
  • Vue コンポーネント間で値を渡す方法をどうやって知っていますか?
  • Vue3 における親コンポーネントと子コンポーネント間の値の転送の詳細な説明
  • Vue の親子コンポーネントの値転送と一方向データフローの問題の詳細な説明
  • Vue コンポーネント (Vuex を含む) 間の値の転送に関する簡単な説明
  • 非常にシンプルでわかりやすいvueコンポーネントの値転送

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

>>:  Linux での JDK のインストール (OpenJDK のアンインストールを含む) の概要

推薦する

Linux Cron によるパラメータ付き PHP コードのスケジュール実行

1. 引き続き PHP スクリプトを使用して実行します。コマンドラインに入力: php /home/...

MySQL でデータベースを作成した後、ユーザー 'root'@'%' によるデータベース 'xxx' へのアクセスが拒否される問題を解決する

序文最近、仕事で問題が発生しました。データベースを作成した後、データベースに接続するときにエラーが発...

Vueバックグラウンド管理に多言語機能を追加する例

目次1.まず、main.jsページを設定します2. 対応するパスの下で言語パックを構成します。ここに...

Discuz! フォーラムに設定オプションを追加する方法

Discuz! フォーラムにはバックグラウンドで多くの設定オプションがあり、これらの設定オプションを...

ウェブページのメモリとCPU使用量を削減する方法

<br />Web ページによっては、サイズは大きくないように見えても開くのに非常に時間...

Ubuntu 20.04 aptの国内ソースを変更する方法

UPD 2020.2.26 現在、Ubuntu 20.04 LTSはまだリリースされていないため、チ...

現在のブラウザが JavaScript でヘッドレス ブラウザであるかどうかを検出する方法

目次ヘッドレスブラウザとは何ですか?なぜ「ヘッドレス」ブラウザと呼ばれるのでしょうか?ヘッドレスブラ...

HTML_PowerNode 入門 Java アカデミー

HTMLとは何ですか? HTML は Web ページを記述するために使用される言語です。 HTML ...

mysql ERROR 1045 (28000) 問題の解決方法

私はmysql ERROR 1045に遭遇し、この問題に長い時間を費やしました。私はそれを自分で書き...

Windows に MySQL 8.0.16 をインストールする手順とエラーの解決方法

1. はじめに: mysql8以降は、これまでよく使われていたバージョンと比べてかなり変更点が大きい...

MySQL5.7 マスタースレーブ構成例の分析

MySQL5.7マスタースレーブ構成の実装方法、具体的な内容は次のとおりですインストール環境:マスタ...

この記事はPReact10.5.13のソースコードを理解するのに役立ちます

目次render.js 部分create-context.js 部分差分部分Reactのソースコード...

JavaScript における clientWidth、offsetWidth、scrollWidth の違い

1. コンセプトこれらはすべて Element の属性であり、要素の幅を示します。 Element....

画像ブラインド表示の効果を実現するための純粋な CSS の例

まず、完成した効果をお見せしましょう 主なアイデア: 実際、このブラインドは一種の手品を使用していま...

MySQL をデプロイするときに発生する「テーブル mysql.plugin が存在しません」という問題の解決方法

今日、MySQL の無料インストール版をデプロイしたところ、テーブル 'mysql.plug...