Vue がコンポーネント間の通信を実現するいくつかの方法 (複数のシナリオ)

Vue がコンポーネント間の通信を実現するいくつかの方法 (複数のシナリオ)

以下は、私が開発で使用した Vue コンポーネント間の通信方法です。シナリオによって使用する方法は異なりますが、基本的にすべての開発シナリオの通信ニーズを満たしています。最も簡単な例から始めて、使用方法を説明します。さっそく始めましょう。退屈な内容が満載なので、一読することをお勧めします。

1. 小道具

親 >>> 子 (Props)

コンポーネントが別のコンポーネントに導入されると、「親子関係」が形成されます。現在のコンポーネントが「親」で、導入されたコンポーネントが「子」です。たとえば、現在のコンポーネント (親) は、親コンポーネントの「:message」を介して子コンポーネントと通信します。

<テンプレート>
    <div class="親ボックス">
        <div>
            <div>私は親ページです</div>
            <div>{{メッセージ}}</div>
        </div>
        <children :message="toChildrenMsg"></children>
    </div>
</テンプレート>
 
<スクリプト>
import Children from './Children.vue' //現在のページにサブコンポーネントを導入する export default {
    名前:"親",
    コンポーネント:{
        子供たち
    },
    データ(){
        戻る {
            メッセージ:「私は親ページのコンテンツです」
            toChildrenMsg: '親ページから子ページに渡されたコンテンツ'
        }
    }
}
</スクリプト>

子コンポーネントはpropsを通じてそれを受け取ります。子コンポーネントのpropsで受け取ったオブジェクトの名前は、親コンポーネントで子コンポーネントにバインドされた名前と一致している必要があることに注意してください。現在の例は「message」です。このようにして、 props の値はコンポーネントの戻り値で使用できます。

<テンプレート>
    <div class="children-box">
        <div>
            <div>私はサブページです</div>
            <div>{{メッセージ}}</div>
        </div>
    </div>
</テンプレート>
 
<スクリプト>
エクスポートデフォルト{
    名前:"子供",
    小道具:{
        メッセージ:{
            type:String, //型判定 default:'' //デフォルト値}
    }
}
</スクリプト>

子コンポーネントは親コンポーネントから渡されたコンテンツを受け取り、その効果は次の図のようになります。

子 >>> 親 ($emit)

子コンポーネントでは、this.$emit() メソッドを介して親コンポーネントと通信します。以下に示すように、トリガー イベントをクリックして this.$emit('fromChildMethod') を実行し、親コンポーネントの fromChildMethod メソッドをトリガーします。

<テンプレート>
    <div class="children-box">
        <div>
            <div>私はサブページです</div>
            <div>{{メッセージ}}</div>
            <div><span @click="toParentMethod">クリックすると親ページ イベントがトリガーされます</span></div>
        </div>
    </div>
</テンプレート>
 
<スクリプト>
エクスポートデフォルト{
    名前:"子供",
    小道具:{
        メッセージ:{
            タイプ:文字列、
            デフォルト:''
        }
    },
    方法:{
        親メソッド(){
            this.$emit('fromChildMethod')
        }
    }
}
</スクリプト>

fromChildMethod メソッドを親コンポーネントの子コンポーネントにバインドし、メソッドをリッスンし、メソッドがトリガーされたら、親コンポーネント内の対応する fromChild メソッドを実行します。

<テンプレート>
    <div class="親ボックス">
        <div>
            <div>私は親ページです</div>
            <div style="font-size:12px;">{{メッセージ}}</div>
            <div style="font-size:12px;color:red">{{fromChildMsg}}</div>
        </div>
        <children :message="toChildrenMsg" @fromChildMethod="fromChild"></children>
    </div>
</テンプレート>
 
<スクリプト>
'./Children.vue' から Children をインポートします。
エクスポートデフォルト{
    名前:"親",
    コンポーネント:{
        子供たち
    },
    データ(){
        戻る {
            メッセージ:「私は親ページのコンテンツです」
            toChildrenMsg: '親ページから子ページに渡されたコンテンツ'、
            子メッセージ:''
        }
    },
    方法:{
        子から(){
            this.fromChildMsg = '子ページによってトリガーされたメソッド' //子コンポーネントによってトリガーされたメソッドをリッスンし、コンテンツを表示します}
    }
}
</スクリプト>

子コンポーネントの対応するスパンをクリックすると、メソッドがトリガーされ、親コンポーネントに通知されます。

要約: 親から子へは props、子から親へは this.$emit()、トリガー名とリスナー名は一貫している必要があります。

2. バスイベントバス

実際のシナリオでは、コンポーネントには「親子」関係だけでなく、「兄弟」関係やレベル間コンポーネントなども存在します。このとき、props と $emit は適用できない可能性があります。 このとき、親子コンポーネントにも適用できるのは、 Bus (イベント バス) であることがわかります。

バスは主に $emit と $on を使用して、$emit をトリガーし、$on を監視し、$off を閉じます。

まず、プロジェクト内に index.js ファイルを含む新しいフォルダー bus を作成し、新しい Vue インスタンスを作成して、モジュールをエクスポートします。

次に、この新しい Vue インスタンス、つまりバスをインポートします。一般的なインポート方法は 2 つあり、1 つはグローバル インポート、もう 1 つはローカル インポートです (各コンポーネントを 1 回インポートする必要があります)。以下はグローバル インポートです。main.js では、bus は現在の Vue インスタンスのプロトタイプ メソッドとして使用され、this.bus を通じて各コンポーネントで直接呼び出すことができます。

'vue' から Vue をインポートします
'./App' から App をインポートします
'./bus/index' からバスをインポートします
Vue.prototype.bus = バス
 
新しいVue({
  el: '#app',
  コンポーネント: { アプリ },
  テンプレート: '<App/>'
})

以下はバス通信を実装するプロセスを示しています。シナリオは父と息子です。同様に、兄弟とクロスレベルの使用法も同様です。

親コンポーネントは、this.bus.$emit() によってトリガーされ、子コンポーネントと通信します。

<テンプレート>
    <div class="親ボックス">
        <div>
            <div>私は親ページです</div>
            <div @click="toChildBus"><span>子コンポーネントと通信する</span></div>
        </div>
        <子供></子供>
    </div>
</テンプレート>
 
<スクリプト>
'./Children.vue' から Children をインポートします。
エクスポートデフォルト{
    名前:"親",
    コンポーネント:{
        子供たち
    },
    方法:{
        トチャイルドバス(){
            let val = '親コンポーネントは子コンポーネントと通信します'
            this.bus.$emit('toChild',val) //val は渡される値であり、必須ではありません}
    }
}
</スクリプト>

子コンポーネントは、親コンポーネントによってトリガーされたイベントをリッスンします (マウント フェーズでのバインドとリッスン)。イベント名は一貫している必要があることに注意してください。this.bus.$on() を介してリッスンします。バスがトリガー メソッドをリッスンすると、渡された値を取得します (その中でカスタム メソッドを実行することもできます)。

<テンプレート>
    <div class="children-box">
        <div>
            <div>私はサブページです</div>
            <div style="font-size:12px;color:blue;">{{fromParentMsg}}</div>
        </div>
    </div>
</テンプレート>
 
<スクリプト>
エクスポートデフォルト{
    名前:"子供",
    データ(){
        戻る {
            親メッセージから:''
        }
    },
    マウントされた(){
        this.bus.$off('toChild')
        this.bus.$on('toChild',val=>{   
            this.fromParentMsg = val //これはコピー操作であり、対応するメソッドもその中で実行できます})
    }
}
</スクリプト>

効果画像:

要約:父と息子、兄弟、およびレベルを越えた (祖父母、孫など) 間の通信は同じ方法で記述されるため、1 つずつ例を挙げることはしません。これらはすべて this.bus.$emit() によってトリガーされ、this.bus.$on() によってリッスンされ、対応する操作を実行します。トリガー名とリッスン名は同じである必要があることに注意してください。

3. Vuex 状態管理ライブラリ

Vuex は倉庫に相当します。倉庫にいくつかのものを入れて、保管時の状態を保持することができます。必要に応じて変更したり取り出すことができます。これはグローバルな状態です。今回は、その原理には触れずに、vuex を通信に使用する方法についてのみ説明します。

vuexをインストールする

npm インストール vuex --save

ここでは、store という名前の新しいフォルダーを作成し、その中に index.js ファイルを含め、Vuex.Store インスタンスを作成してから、このインスタンスをエクスポートします。図から、ストアの一般的な構造と要素が明確にわかります。詳細については説明しません。vuex については無数の記事があり、自分で学ぶことができます。ここでは、主に一般的な使用方法について説明します。

mian.js でグローバルにインポートし、直接使用します。

'vue' から Vue をインポートします
'./App' から App をインポートします
'./router' からルーターをインポートします
'./bus/index' からバスをインポートします
'./store/index' からストアをインポートします
 
Vue.config.productionTip = false
Vue.prototype.bus = バス
新しいVue({
  el: '#app',
  ルーター、
  店、
  コンポーネント: { アプリ },
  テンプレート: '<App/>'
})

メソッド 1 の this.$store.state.xxx は、状態を直接操作し、コンポーネントのマウント フェーズ中にストアに値を保存します。もちろん、任意のメソッドで操作することもできます。

<テンプレート>
    <div class="親ボックス">
        <div>
            <div>私は親ページです</div>
        </div>
        <子供></子供>
    </div>
</テンプレート>
 
<スクリプト>
'./Children.vue' から Children をインポートします。
エクスポートデフォルト{
    名前:"親",
    コンポーネント:{
        子供たち
    },
    データ(){
        戻る {
            子メッセージ:''
        }
    }
    マウントされた(){
        this.$store.state.msg = '親コンポーネントが保存されました' // メソッド 1 でここに保存します}
}
</スクリプト>

その他のコンポーネントはストアから取得され、もちろん変更することもできます。

<テンプレート>
    <div class="children-box">
        <div>
            <div>私はサブページです</div>
            <div @click="fromStore"><span>ストアから入手</span></div>
            <div>{{fromStoreMsg} </div>
        </div>
    </div>
</テンプレート>
 
<スクリプト>
エクスポートデフォルト{
    名前:"子供",
    データ(){
        戻る {
            fromStoreMsg:''
        }
    },
    方法:{
        fromStore(){
            this.fromStoreMsg = this.$store.state.msg
        }
    }
}
</スクリプト>

効果画像:

方法 2: this.$store.getters.xxx と mapGetters を通じて取得します。

// ストア/index.js
ゲッター:{
    getMsg:状態=>{
    状態.msgを返す
  }
},
 
 
//コンポーネントで this.$store.getters.getMsg を取得します
 
// mapGetters も使用できます import { mapGetters } from 'vuex'
計算: {
 ...mapGetters(['getMsg'])
},

ストアに保存されるデータは、ミューテーションとアクション(非同期でも可)を使用して保存できます。ここでは詳細には触れません。興味があれば、自分で勉強してください。

4. ルーター

this.$router.push({path:'xxx',query:{value:'xxx'}}) のように動的ルーティングやルーティングジャンプで値を渡したり、ジャンプ時に値を渡したり、this.$route.params.value や this.$route.query.value で渡されたパラメータを取得したりすることができます。この方法には制限があります。コンポーネント同士がジャンプした時にしか値を取得できません。ジャンプ直後にページを更新しても値を取得できません。状況に応じて使い分けてください。

5. キャッシュ

sessionStorage、localStorage、クッキー

バスとストアに加えて、複数のコンポーネントが通信するためのもう1つの一般的な方法はキャッシュです。同じウィンドウが閉じられていない場合、ウィンドウの下の他のコンポーネントはキャッシュに保存されている値を取得できます。値を保存するには、sessionStorage.setItem(key, value)とlocalStorage.setItem(key, value)を使用します。他のコンポーネントは、sessionStorage.getItem(key)とlocalStorage.getItem(key)を介して値を取得できます。複数のページがキャッシュされたデータを共有し、ページを更新してもデータが破壊されません。キャッシュは、sessionStorage.removeItem(key)とlocalStorage.removeItem(key)で削除できます。適用可能なシナリオは多数あります。

概要: この記事では、さまざまなシナリオを考慮してさまざまな方法を使用することで開発効率を向上させ、バグの発生を減らしながら、Vue コンポーネントでよく使用される通信および値転送方法をいくつか簡単に紹介します。

これで、Vue でコンポーネント間通信を実装するいくつかの方法 (さまざまなシナリオ) に関するこの記事は終了です。Vue コンポーネント通信に関するより関連性の高いコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • VUE で祖父コンポーネントと孫コンポーネント間のデータ通信をエレガントに実装する方法
  • Vueが他のコンポーネントとどのように通信するかを学びましょう
  • Vue における親子コンポーネントの通信とイベントトリガーの詳細な説明
  • Vueのコンポーネント間で通信して値を渡すいくつかの方法の詳細な説明
  • Vueの親子コンポーネントの通信方法は次のとおりです
  • Vue フロントエンド再構築計算とコンポーネント通信およびその他の実践的なスキルの概要

<<:  Docker コンテナを他のサーバーに移行する 5 つの方法

>>:  HTML、CSS、RSSフィードが正しいかどうかを確認する無料ツール

推薦する

Raspberry Pi msmtp と mutt のインストールと設定のチュートリアル

1. muttをインストールするsudo apt-get install mutt 2. msmtp...

Linuxでスワップパーティションファイルを作成する方法

スワップの紹介Linux のスワップ (スワップ パーティション) は、Windows の仮想メモリ...

MySQLのデッドロックとログに関する詳細な説明

最近、MySQL オンラインでいくつかのデータ異常が発生しましたが、すべて早朝に発生しました。ビジネ...

CSS最適化スキルの自己実践体験

1. CSS スプライトを使用します。利点は、CSS で使用される小さな画像を 1 つの大きな画像に...

JavaScript 配列の重複排除とフラット化関数の紹介

目次1. 配列の平坦化(配列の次元削減とも呼ばれる)方法1: 削減メソッドを使用する方法2: スタッ...

MySQL テーブル全体の暗号化ソリューション keyring_file の詳細な説明

例示するMySql Community Edition は、5.7.11 以降、テーブルベースのデー...

MySQL 起動エラー 1067 および文字セットを変更して再起動した後の無効な回復

公式サイトからmysql-5.6.37-winx64.zipの解凍バージョンをダウンロードし、構成フ...

Web ベースの電子メール コンテンツの HTML フォーマット標準の概要

1. ページ要件1) 標準のヘッダーとフッターを使用するXML/HTML コードコンテンツをクリップ...

JavaScript の高度なプログラミングの基本参照型

目次1. 日付2. 正規表現3. オリジナルパッケージタイプ序文:参照値(オブジェクト)は、 Dat...

メンテナンス可能なJSコードの書き方を教えます

目次保守可能なコードとは何ですか?コード規約1. 読みやすさ2. 変数と関数の命名3. 透過的な変数...

ウェブデザイン:大量の素材の正確な配置と使用

3回の暗記により、大量の資材の正確な場所と目的を記憶でき、その使いやすさが向上します。 これは単なる...

JSは単純なフィルタリングから複数条件のフィルタリングまで配列フィルタリングを実装します

目次単一条件単一データフィルタリング単一条件複数データフィルタリング複数の条件付きデータフィルタリン...

Tomcatソースコードをideaにインポートする方法

目次1. Tomcatコードをダウンロードする2. ダウンロード後のディレクトリ構造3. ソースコー...

見落としがちなMySQLのCOLLATIONの例の詳細な説明

序文MySQL データベースの文字列型は、CHAR、VARCHAR、BINARY、BLOB、TEXT...

SELinux 入門

カーネル 2.6 の時代には、アクセス制御セキュリティ ポリシーのメカニズムを提供するために新しいセ...