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 のアンインストールを含む) の概要

推薦する

Ubuntu20.04 VNCのインストールと設定の実装

VNC はリモート デスクトップ プロトコルです。 VNC を使用して Ubuntu 20.04 を...

ViteでReactプロジェクトを構築する方法

目次序文Viteプロジェクトを作成する改修プロジェクトディレクトリの規則その他の構成序文毎日鳩、火ば...

MySQL で最大接続数を正しく変更する 3 つの方法

MySQL データベースをインストールすると、デフォルトの MySQL データベースの最大接続数が ...

Navicat がデータベース データ構造をインポートする際に発生するエラー datetime(0) の SQL レポートの問題を解決します。

エラー発生: MySQL 5.7 から SQL にデータベースをエクスポートし、それを MySQL ...

Reactの親コンポーネントと子コンポーネント間のデータ転送の詳細な説明

目次1. 親コンポーネントが子コンポーネントにデータを渡す1.1. 親コンポーネントコード1.2. ...

MySQL に配列を保存するサンプルコードと方法

多くの場合、ストアド プロシージャを作成するときに配列がよく使用されますが、MySQL ではストアド...

Docker 環境で JMeter+Grafana+influxdb ビジュアル パフォーマンス監視プラットフォームを構築するチュートリアル

目次1. Dockerをインストールする2. influxDBをインストールして設定する3. Gra...

MySQL パフォーマンス ストレス ベンチマーク ツール sysbench の使い方の紹介

目次1. sysbenchの紹介#プロジェクトダウンロードアドレス: 2. Sysbenchのインス...

IE6 の歪み問題

質問: <form...> の下の <input type="hidde...

MySQL 最適化ソリューション リファレンス

最適化によって発生する可能性のある問題最適化は必ずしも単純な環境で実行されるわけではなく、実稼働環境...

MySQLはbinlogを通じてデータを復元する

目次MySQL ログファイルバイナリログBinlogログがオンになっていますログ記録を有効にする方法...

uniappを使用してWeChatミニプログラムでEChartsを使用する方法

今日は、uniapp を使用して Echarts を統合し、マップ チャートを表示します。 mpvu...

Linux でのルーティングと仮想マシン ネットワークの設定に関する詳細なグラフィック説明

ルーティングとは何ですか?ルーティングとは、相互接続されたネットワークを介して送信元ステーションから...

Mysql5.6.36 スクリプトのコンパイル、インストール、初期化のチュートリアル

概要この記事は、centos7.3 上で mysql5.3.6 を自動的にコンパイルしてインストール...

子コンポーネントで vue activated を使用する詳細

ページ: ベース: <テンプレート> <div class="タブコンテ...