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 つの方法

推薦する

MySQL で絵文字表現を挿入できない理由と解決策

失敗のシナリオMySQL データベースに絵文字表現を挿入するために JDBC を呼び出すと、例外ja...

無視されたDOCTYPE記述の分析

doctype もその 1 つです。 <!DOCTYPE HTML PUBLIC "...

MySQLとRedisキャッシュ間の同期ソリューションについての簡単な説明

目次1. ソリューション 1 (UDF)デモケース2. ソリューション2(binlogの解析)キャナ...

nginx-ingress-controller ログ永続化ソリューションのソリューション

最近、nginx-ingress-controller のアプリケーションについて説明した公開アカウ...

Zabbix の psk 暗号化と zabbix_get 値の組み合わせ

Zabbix バージョン 3.0 以降、Zabbix サーバー、Zabbix プロキシ、Zabbix...

CentOS7 に Redis をインストールして設定する方法

導入Redis を詳しく説明する必要はありません。インストールと設定を始めましょう。インストールソー...

MySQLデータベースの基礎知識と操作のまとめ

この記事では、例を使用して、MySQL データベースの基本的な知識と操作について説明します。ご参考ま...

js における浅いコピーと深いコピーの詳細な説明

目次1. jsメモリ2. 譲渡3. 浅いコピー4. ディープコピー序文:以下の記事を読む前に、記憶に...

Mysql での結合操作

結合の種類1. 内部結合: 結合関係を持つ 2 つのテーブル内のフィールドは、結合関係を満たすレコー...

HTML の表のフレームとルール属性の詳細な説明

テーブル タグの frame 属性と rules 属性は境界線の表示を制御できます。フレーム プロパ...

MySQL インデックス障害の上位 10 の問題の概要

目次背景1. クエリ条件に「or」が含まれているため、インデックスが失敗する可能性があります。 2....

指定したディレクトリに nginx をインストールする方法の例

会社の要件により、異なる場所にある 2 つの nginx サーバーを同じマシンにインストールする必要...

HTMLページ内の検索機能を完了する

最近、たくさんの人に改変してもらったフレームワークに取り組んでいます。毎日コードを見ていると目が回り...

Nginxはリバースプロキシを使用して負荷分散プロセス分析を実装します

導入dockerコンテナとdocker-composeに基づいて、Linux環境でのdockerの基...

CSS で隠し要素を実現する 7 つの興味深い方法

序文非表示要素の 3 つの属性である表示、可視性、不透明度の類似点と相違点は、フロントエンドの就職面...