22-vueコンポーネント通信の5つの方法(概要):小道具、カスタムイベント、ref \ refs、メッセージのサブスクリプションとパブリケーション(pubsub-jsライブラリ)、スロットメソッド

小道具の最初のタイプ

  親コンポーネントは:(v-bindの略)を使用して渡し、子コンポーネントは小道具を使用して受信し、タイプが示されます

コード例

親コンポーネントコード:

<template>
	<TodoHeader :addTodo="addTodo"/>
</template>

サブコンポーネントコード:

export default{
	props:{
		addTodo:Function
	}
}

 

2番目のカスタムイベント

  親コンポーネントは@(v-onの略)を使用してイベントをバインドし、子コンポーネント(メソッド内)はvueインスタンスメソッド$ emit( "イベント名"、パラメーター)を使用して受信します

コード例

親コンポーネントコード:

<TodoHeader @addTodo="addTodo"/>  //绑定事件监听

サブコンポーネントコード:

methods:{
	// 触发事件
	 this.$emit("addTodo",todo);  //将方法addTodo(todo) 的拆分  addTodo为方法名  todo为方法的参数
}

this。$ emit( "メソッド名"、メソッドのパラメーター)

 

3番目のref \ refs

  親コンポーネントはrefを使用して子コンポーネントの情報を登録し、vueインスタンスメソッドrefs.refを書き込みます。$ on( "イベント名"、コールバック関数)をマウント済みに書き込みます

コード例

親コンポーネントコード:

<template>
	 <TodoHeader ref="Header"/>
</template>

new Vue({
	mounted () {//执行异步代码
      //给Header组件绑定事件监听(第三种方式)
      this.$refs.Header.$on("addTodo",this.addTodo)  //(函数名,回调函数)
    }
})

サブコンポーネントコード:

methods:{
	 this.$emit("addTodo",todo);  //将方法addTodo(todo) 的拆分  addTodo为方法名  todo为方法的参数
}

 

4番目のメッセージのサブスクリプションと公開

  pubsubライブラリ:はいクロスコンポーネントを実装する情報通信、レイヤーごとの面倒な情報転送を取り除きます。
  詳細については、次の記事「24-vueのコンポーネントの通信方法の1つ:メッセージのサブスクリプションと公開の使用、およびpubsub-jsライブラリのインストール」を参照してください。リンクは次のとおりです。
  リンク:通信の1つ24-vueのコンポーネントのメソッド:ニュースの購読と公開の使用、pubsub-jsライブラリのインストール

 

5番目のスロット

理解

  スロットスロット、運ばれたコンテンツを特定の位置に挿入し、この位置を再利用可能にします。したがって、この位置は別のタグに置き換えることができます。

スロットと他の通信方法の違い

  通信方式スロット通信はラベル、および他の通信方法(関数、配列、パラメーター、変数などを含む)によって通信されるデータ。

指示

  後者が使用するラベルを親コンポーネントの子コンポーネントに転送するには、slotメソッドを使用します。また、ラベルの対応するメソッドも親コンポーネントに書き込む必要があります。つまり、スロットを使用する場合、子コンポーネントで使用されるタグとメソッドは、親コンポーネントで宣言および定義してから、スロットを通過させる必要があります。

コード例

親コンポーネントコード:子コンポーネントに渡されるラベルにslot = "slotName"属性を追加します

<todo-footer>
	<input type="checkbox" v-model="isAllCheck" slot="check"/>
	<span slot="count">已完成{
   
   {completeSize}} / 全部{
   
   {todos.length}}</span>
	<button slot="delete" class="btn btn-danger" v-show="completeSize" @click="deleteCompleteTodos">清除已完成任务</button>//相应的方法应该在父组件vm中定义声明
</todo-footer>

サブコンポーネントコード:スロットを設定します<slotname = "xxx">

<template>
  	<div class="todo-footer">
		<!-- 使用slot之前的写法-->
	 	<!--    <button class="btn btn-danger" v-show="completeSize" @click="deleteCompleteTodos">清除已完成任务</button>-->
    
    <!--使用slot插槽方法-->
		<slot name="delete"></slot>
  	</div>
</template>

 

注:
  カスタムイベントメソッドを使用する場合は、より便利です。だが親コンポーネントと子コンポーネント間の通信に適しています情報がレイヤーごとに渡される状況には適していません。
  3番目の方法はより複雑で、一般的には使用されません。


   親コンポーネントと子コンポーネント間のコミュニケーションのスキル->
  レイヤーごとにコミュニケーションする必要がある場合は、小道具メソッドまたはカスタムイベント(より便利)を使用します->メッセージを使用してサブスクライブおよびパブリッシュする直接通信
  部品を多用する場合は→スロットを使用

おすすめ

転載: blog.csdn.net/A_Bow/article/details/113799285