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

推薦する

MySQL 入門 - SQL 実行プロセス

目次1. プロセス2. コアアーキテクチャ2.1 サーバー層の基本コンポーネントの紹介3. ステート...

Centos8環境でSSHポート番号を変更する方法

目次序文始める序文サーバーのデフォルトの SSH ポート番号は通常 22 であるため、ほとんどのユー...

MySQL の Like の概念と使用法の説明

Like は中国語で「好き」を意味しますが、MySQL データベースに適用される場合、Like は、...

Kali に docker と portainer をインストールする方法

dockerの登場により、多くのサービスが徐々にハードウェアアーキテクチャへの依存から脱却しました。...

一目でわかる$nextTickの説明

目次1. 機能説明2. 親コンポーネント3. サブコンポーネント NextTick.vue 4なぜ未...

Docker での Redis のマスタースレーブ構成チュートリアルの詳細説明

1. Redisイメージを取得するdocker pull redis 2. それぞれポート6379、...

Dockerコンテナが起動直後に終了する問題を解決する

最近、Docker がコンテナの起動時に特定のプロセスを直接実行できるようにする方法を調べていたとこ...

CocosCreator でカメラトラッキングに cc.follow を使用する方法

Cocos Creator バージョン: 2.3.4デモのダウンロード: https://files...

Vue2.x における双方向バインディングの原理と実装

目次1. 実施プロセス2. オブザーバーを表示する3. ウォッチャーを実装する4. コンパイルを実装...

MySQL インストール図の概要

MySQL 5.5 のインストールと設定方法のグラフィックチュートリアルMySQL 5.5 のインス...

JavaScriptはランダムコードの生成と検証を実現する

JavaScriptでのランダムコードの生成と検証は参考までに。具体的な内容は以下のとおりです。イベ...

HTML コード作成ガイド

共通コンベンションタグ自己終了タグ。閉じる必要はありません (例: img input br hr ...

SpringBoot と Vue の相互作用におけるクロスドメイン問題の解決策

目次ブラウザ同一生成元ポリシー1. VUEフロントエンド構成プロキシはクロスドメインの問題を解決しま...

JavaScriptはブラウザがIEかどうかを判定します

フロントエンド開発者としては、IEの落とし穴は避けて通れません。他のブラウザはいいのにIEは壊れてい...