Vue でコミュニケーションを実装する 8 つの方法

Vue でコミュニケーションを実装する 8 つの方法

1. コンポーネント通信

1. Props 親コンポーネント ---> 子コンポーネント通信

  • 親コンポーネント---子コンポーネントへのプロパティの転送
  • サブコンポーネント---propsモードでデータを受信する
<息子:datas="fData"></息子>

<スクリプト>
'@/components/son' から Son をインポートします。
  エクスポートデフォルト{
    名前:「父」
    コンポーネント:{Son},
    データ(){
      戻る {
        fData:'親コンポーネントから子コンポーネントに渡される値 - props メソッド'
      }
    }
  }
</スクリプト>

子コンポーネントのpropsで受け入れられるパラメータ名は、親コンポーネントが渡されるときに定義されたプロパティ名と一致している必要があります。

<テンプレート>
  <div>私は親コンポーネントのデータです: {{fData}}</div>
  <div @click=changeData>私は変更されたデータを渡す親コンポーネントです: {{mydata}}</div>
</テンプレート>
<スクリプト>
  エクスポートデフォルト{
    名前:「息子」
    小道具:{
      データ:{
        タイプ:文字列、
        デフォルト:''
      }
    }
    データ(){
      mydata:this.fatherData
    },
    方法:{
     データの変更(){
        this.mydata += 'データの変更'
      }
    },
  }
</スクリプト>

知らせ:

  • 子コンポーネントは親コンポーネントから渡された値を直接変更できません。Vue Vue一方向データフロー メカニズムのため、親コンポーネントの値を直接変更すると「汚染」されます。 ( propsは一方向バインディング(読み取り専用プロパティ)です。親コンポーネントのプロパティが変更されると、子コンポーネントに伝達されますが、その逆は行われません)

エラーメッセージはおそらく次のようになります: Avoid mutating a prop directly since the value will be overwritten whenever the parent

  • 解決策:サブコンポーネントに変数mydataを定義してfDataデータを受け取ることができます。
  • パラメータ渡しの型が不明な場合は、次のように記述できます
小道具:{
    データ:{
        タイプ:[文字列,数値],
        デフォルト:''
    }
}

2. $emit 子コンポーネント ---> 親コンポーネント転送

  • サブコンポーネントバインディングカスタムイベント
  • $emit() の最初のパラメータはカスタムイベント名、2番目のパラメータは渡されるデータです。
  • $emit() を使用してデータサブコンポーネントの変更をトリガーします
<el-button @click="handleEmit">親コンポーネントを変更する</el-button>

<スクリプト>
 エクスポートデフォルト{
   名前:「息子」
   方法:{
     ハンドルエミット(){
       this.$emit('triggerEmit','サブコンポーネントデータ')
     }
   }
 }
</スクリプト>

親コンポーネント (子コンポーネントによって送信されるイベント名は、親コンポーネントによって受け入れられるイベント名と一致している必要があります)

<Son @triggerEmit="changeData"></Son>

<スクリプト>
 '@/components/son' から Son をインポートします。
 エクスポートデフォルト{
   名前:「父」
   コンポーネント:{Son},
   方法:{
     changeData(名前){
       console.log(name) // => 子コンポーネントからのデータです}
   }
 }
</スクリプト>

$emitとpropsを兄弟コンポーネントと組み合わせて値を渡す

  • 親コンポーネントは2つの子コンポーネントを導入します
  • 親コンポーネントはブリッジ親コンポーネントとして機能する
<childA :myName="名前"></ChildA>
<ChildB :myName="名前" @changeName="名前を編集"></ChildB>  
    
エクスポートデフォルト{
  データ() {
    戻る {
      名前: 'Hello Data'
    }
  },
  メソッド: {
    編集名前(名前){
      this.name = 名前
    }
  }
}


サブコンポーネントBはデータを変更して受信する

<p>名前: {{ myName }}</p>
<button @click="changeName">名前を変更</button>
    
<スクリプト>
エクスポートデフォルト{
  小道具: {
    myName:文字列
  },
  メソッド: {
    名前を変更する() {
      this.$emit('changeName', '新しいデータ名')
    }
}
}
</スクリプト>


サブコンポーネントAはデータを受信

<p>名前: {{ newName }}</p>
    
<スクリプト>
エクスポートデフォルト{
  小道具: {
    myName:文字列
  }
}
</スクリプト>

3. バス(イベントバス)ブラザーコンポーネント通信

親子コンポーネント以外のコンポーネント間、またはそれ以上のレベルのコンポーネント間で値を転送します。Vue では、コンポーネント間の値の転送を管理するために、別のイベント センターが使用されます。

  • パブリックbus.jsファイルを作成する
  • Vueインスタンスの公開
  • データ送信側はイベントを通じてbus.$emit(メソッド名、送信データ)をトリガーする
  • データ レシーバーは、ライフ サイクル関数内の bus.$on(メソッド名、[params]) を通じてデータをリッスンします。
  • 破棄イベント。受信側では、bus.$off(メソッド名)によってデータが破棄された後、データを監視できなくなります。
「vue」からVueをインポートします
定数バス = 新しい Vue()
デフォルトバスをエクスポート


データを変更する必要があるコンポーネント内の呼び出しを定義する

<テンプレート>
  <div>
    <div>私はコミュニケーションコンポーネントAです</div>
    <button @click="changeName">名前を変更</button>
  </div>
</テンプレート>

<スクリプト>
「@/utils/Bus.js」からバスをインポートします。
エクスポートデフォルト{
  コンポーネント: {},
  データ() {
    戻る {};
  },
  マウント() {
    コンソールログ(バス);
  },
  メソッド: {
    名前を変更する() {
      bus.$emit("editName", "dataset!");
    },
  },
};
</スクリプト>

<style lang='scss' スコープ>
</スタイル>

bus.jsファイルも別のコンポーネントに導入されており、イベントコールバックは$onを通じて監視されます。

<テンプレート>
  <div>
  <span>名前: {{name}}</span>
    <div>私はコミュニケーションコンポーネントBです</div>
  </div>
</テンプレート>

<スクリプト>
「@/utils/Bus.js」からバスをインポートします。
エクスポートデフォルト{
  コンポーネント: {},
  データ() {
    {名前} を返します。
  },
  マウント() {
    bus.$on("editName", (name) => {
        this.name=名前
      console.log(名前); // 
    });
  },
  メソッド: {},
};
</スクリプト>

<style lang='scss' スコープ>
</スタイル>

4. $parent、$childrenはコンポーネントインスタンスに直接アクセスします

  • 子コンポーネントは---> $parentを通じて親コンポーネントのインスタンスを取得します。
  • 親コンポーネントは、---> $childrenを通じて子コンポーネントのインスタンス配列を取得します。

子コンポーネント --- this.$parent は親コンポーネントのメソッドやデータなどを取得でき、直接使用して実行することができます。

<テンプレート>
  <div>私は子コンポーネントです</div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前:"息子",
  データ(){
    戻る {
      sonTitle: '私は子コンポーネントのデータです'
    }
  },
  方法:{
    息子ハンドル(){
      console.log('私はサブコンポーネントのメソッドです')
    }
  },
  作成された(){
    console.log(this.$parent)
    console.log(this.$parent.fatherTitle) // => 親コンポーネントのデータです this.$parent.fantherHandle() // => 親コンポーネントのメソッドです }
}
</スクリプト>

親コンポーネント --- 子コンポーネントのインスタンスを取得します。取得したインスタンスは配列の形式です。This.$children[0] はコンポーネントインスタンスを取得し、コンポーネントメソッドとデータを呼び出すことができます。

<テンプレート>
  <div>
    <Son>私は親コンポーネントです</Son>
  </div>
</テンプレート>

<スクリプト>
'./son.vue' から Son をインポートします。

エクスポートデフォルト{
  名前: 「父」
  コンポーネント:{
    息子
  },
  データ(){
    戻る {
      fatherTitle: 「私は親コンポーネントのデータです」
    }
  },
  方法:{
    ファンサーハンドル(){
      console.log('私は親コンポーネントのメソッドです')
    }
  },
  マウントされた(){
    console.log(this.$children)
    console.log(this.$children[0].sonTitle) // => 子コンポーネントのデータです this.$children[0].sonHandle() // => 子コンポーネントのメソッドです }
}
</スクリプト>

5. $参照

ref は、要素またはサブコンポーネントの参照情報を登録するために使用されます。参照情報は親コンポーネントの $refs オブジェクトに登録されます。

親コンポーネントは$refsを使用してコンポーネントインスタンスを取得します。

<テンプレート>
  <div>
    <息子ref="息子"></息子>
  </div>
</テンプレート>

<スクリプト>
'./son.vue' から Son をインポートします。

エクスポートデフォルト{
  名前: 「父」
  コンポーネント:{
    息子
  },
  マウントされた(){
    console.log(this.$refs.son) /*コンポーネントインスタンス*/
  }
}
</スクリプト>

6. マルチコンポーネントまたはディープコンポーネント通信を提供する/注入する

provide/inject詳細な説明

  • 親コンポーネントはprovideを使用してデータを挿入します
  • サブコンポーネントはデータを使用するために注入を使用する
/* 親コンポーネント */
エクスポートデフォルト{
 提供する:
   戻る {
     provideName: 'フロントエンドの販売'
   }
 }
}


この時点で、変数provideName 、曾孫、孫などを含むすべての子コンポーネントに提供され、injectを使用するだけでデータを取得できます。

/*サブコンポーネント*/
エクスポートデフォルト{
  挿入: ['provideName'],
  作成された(){
    console.log(this.provideName) // => "フロントエンドの販売"
  }
}


  • 親コンポーネントは、提供したデータをどのコンポーネントが使用するかを知る必要はありません。
  • サブ添付ファイルはデータの出所を知る必要がない

7. スロット(スロットスコープスコープスロット)子要素 --> 親要素(通信と同様)

  • レンダリングされた要素を置き換えるための再利用可能なテンプレート(データを渡すことができる)として使用されます。
  • 子コンポーネントでは、コンポーネントにpropを渡すのと同じように、スロットにデータを渡すだけです。
  • 注:親スロットはコンテンツを最も外側の要素として受け取り、 slot-scope子要素を持つ必要があります。
<テンプレート>
  <div>
    <div class="isSon">
        <スロット:info='arrList'></スロット>
    </div>
  </div>
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  コンポーネント: {},
  データ() {
    return {arrList:[1,'aa','张三']};
  },
  マウント() {
  },
  メソッド: {
    
  },
};
</スクリプト>

親要素

<テンプレート>
<div>
    <ソンG>
        <span スロットスコープ="props">
            <ul>
                ああ
                <li v-for="props.info 内の項目" :key="項目">
                    {{アイテム}}
                </li>
            </ul>
        </span>
    </SonG>
</div>
</テンプレート>

<スクリプト>

'../components/SonG.vue' から SonG をインポートします。
エクスポートデフォルト{
   コンポーネント:{
       歌
   },
   データ () {
       戻る {
       }
   }
}
</スクリプト>

8. Vuex 状態管理

  • パブリックデータウェアハウスと同等
  • 倉庫データを管理するためのいくつかの方法を提供する
'vue' から Vue をインポートします
'vuex' から Vuex をインポートします

Vue.use(Vuex)

デフォルトの新しいVuex.Storeをエクスポートします({
  州: {
  },
  突然変異:
  },
  アクション: {
  },
  モジュール:
  }
})

これで、 vueを使用してコミュニケーションを構築する 8 つの方法についての記事は終了です。Vue vue使用してコミュニケーションを構築する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • VueプロジェクトでReactを書く方法の詳細
  • Vue+element はローカル検索機能付きのドロップダウン メニューを実装します
  • vue で wangEditor を使用する方法と、データをエコーし​​てフォーカスを取得する方法
  • vue3とvue2の利点の比較
  • Vue は動的なプログレスバー効果を実現します
  • Vue は動的な円形のパーセンテージ進捗バーを実装します
  • Vueはパーセンテージバー効果を実現します
  • Vueでドラッグ可能なコンポーネントを実装する方法

<<:  完全バックアップとポイントインタイムバックアップにmysqldumpを使用する方法

>>:  MySql でデータの重複挿入を回避する 3 つの方法

推薦する

プレーヤー機能を実現するためのvue + element uiのサンプルコード

効果画像のない表示は単なる空虚な言葉です。 1. オーディオをベースにし、elementUI と組み...

Win7 x64 に解凍版の mysql 5.7.18 winx64 をインストールするとサービスが起動できない問題を解決します

今日、mysql の公式サイトから mysql-5.7.18-winx64.zip をダウンロードし...

フォント宝庫 50 種類の素晴らしい無料英語フォントリソース パート 1

デザイナーは独自のフォント ライブラリを持っているため、プロジェクトの設計時にすぐに使用できます。今...

element-uiのアップロードコンポーネントでファイルやその他のパラメータを転送する際の問題を分析する

最近、element-ui を統合したプロジェクトで vuethink を使用しました。以前は bo...

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

MySQL 5.7.27の詳細なダウンロード、インストール、および構成チュートリアルは参考までに、具...

MySQL 最適化 Zabbix パーティション最適化

zabbix を利用する上での最大のボトルネックはデータベースです。zabbix のデータストレージ...

MySQLで関連テーブルを削除する実用的な方法

MySQL データベースでは、テーブルが互いに関連付けられた後は、それらを任意に削除することはできま...

mysql 8.0.19 win10 クイックインストールチュートリアル

このチュートリアルでは、参考までにMySQL 8.0.19のインストールチュートリアルを共有します。...

MySQLにおけるビューの作成(CREATE VIEW)と使用制限の詳しい説明

この記事では、例を使用して、MySQL ビューの作成 (CREATE VIEW) と使用上の制限につ...

uni-app WeChatアプレット認証ログイン実装手順

目次1. appIDの申請と設定1. appidの取得方法2. AppIDの設定2. 基本的なユーザ...

MySQL-8.0.26 構成グラフィックチュートリアル

はじめに: 最近、会社のプロジェクトでデータベースのバージョンが変更されました。ここでは、MySQL...

JavaScript データ プロキシとイベントの詳細な分析

目次データブローカーとイベントObject.defineProperty メソッドのレビューデータブ...

Vueはdivホイールのズームインとズームアウトを実装します

Vue プロジェクトで div ホイールのズームインとズームアウト、ドラッグ効果、キャンバス効果に似...

MySQL でグループ化した後、各グループの最大値を取得する詳細な例

MySQL でグループ化した後、各グループの最大値を取得する詳細な例1. テストデータベーステーブル...

Vue.jsはシンプルなタイマー機能を実装します

この記事では、参考までに、簡単なタイマー機能を実装するためのvue.jsの具体的なコードを紹介します...