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フィードが正しいかどうかを確認する無料ツール

推薦する

ユーザーのニーズがマーケティング指向のデザインにつながる

<br />それぞれのトピックについて、チーム内でメールで議論します。議論が白熱するにつ...

忘れられたMySQLパスワードとログインエラーの問題について簡単に説明します

MySQL ログイン パスワードを忘れた場合、解決方法は実はとても簡単です。MySQL メイン構成フ...

MySQL 8.0.17 解凍版のインストールと設定方法のグラフィックチュートリアル

インストール中に遭遇した問題を記録しておきますので、皆様のお役に立てれば幸いです。 1. ダウンロー...

AngularパイプラインPIPEの紹介と使い方

序文PIPE、パイプラインと翻訳されます。 Angular パイプは、HTML コンポーネントで宣言...

MySQL の指定文字によるマージと分割の例のチュートリアル

序文指定した文字による結合または分割は一般的なシナリオです。MySQL では結合の記述は比較的簡単で...

MySQLでよく使われる文字列関数トップ10の詳細な説明

こんにちは、みんな!技術の話ばかりで髪は切らないトニーです。データベース関数は、何らかの機能を持ち、...

MySQL/MariaDB でピボット テーブルを実装する方法のサンプル コード

前回の記事では、Oracle でピボット テーブルを実装するいくつかの方法を紹介しました。今日は、同...

シームレスなトークンリフレッシュを実現する方法

目次1. 需要方法1方法2方法3 2. 実装3. 問題解決質問1: トークンの複数回の更新を防ぐ方法...

Angularルーティングアニメーションと高度なアニメーション機能の詳細な説明

目次1. ルーティングアニメーション2. グループクエリとスタガー1. ルーティングアニメーションル...

MySQLデータのバックアップとリカバリの実装方法の分析

この記事では、例を使用して MySQL データのバックアップと復元の方法について説明します。ご参考ま...

MySQLは実際に分散ロックを実装できる

序文前回の記事では、eコマース シナリオでのフラッシュ セールの例を通じて、モノリシック アーキテク...

.Net Core を使用して数千万のデータを MySQL にインポートする手順

目次事前準備実施方法: 1. 単一のデータを挿入する2. マージデータ挿入3. MySqlBulkL...

Nginx ロケーションマッチングルールの例

1. 文法 場所 [=|~|~*|^~|@] /uri/ { ... } 2. 説明上記の構文から、...

ゲーム開発におけるサウンド処理にCocosCreatorを使用する方法

目次1. Cocos Creatorでのオーディオ再生の基本1. 基本2. 一般的な方法2. Coc...

Linux でディスク IO を表示し、読み取りと書き込みで高い IO を占有するプロセスを見つけます。

背景 - オンラインアラートオンライン サーバーがアラームを発し、ディスク使用率 disk.util...