Heim > Web-Frontend > js-Tutorial > Hauptteil

So bedienen Sie $emit und $on in Vue, um mit Eltern-Kind- und Geschwisterkomponenten zu kommunizieren

php中世界最好的语言
Freigeben: 2018-05-30 10:52:16
Original
2061 Leute haben es durchsucht

Dieses Mal zeige ich Ihnen, wie Sie $emit und $on Eltern-Kind- und Geschwisterkomponenten in Vue bedienen, um zu kommunizieren. Was sind die Vorsichtsmaßnahmen für den Betrieb von $emit und $on Eltern-Kind- und Geschwisterkomponenten? Komponenten in Vue kommunizieren wie folgt. Dies ist ein praktischer Fall, schauen wir uns ihn an.

Es gibt drei Hauptübertragungsmethoden:

1. Kommunikation von übergeordneter Komponente zu untergeordneter Komponente

3 zwischen Geschwisterkomponenten

1. Übergeordnete Komponente übergibt Werte an untergeordnete Komponenten Übergeordnete Komponente übergibt Werte mithilfe von Requisiten an untergeordnete Komponenten

//父组件:parent.vue
<template>
  <p>
    <child :vals = "msg"></child>
  </p>
</template>
<script>
import child from "./child";
export default {
  data(){
    return {
      msg:"我是父组件的数据,将传给子组件"
    }
  },
  components:{
    child
  }
}
</script>
//子组件:child.vue
<template>
  <p>
    {{vals}}
  </p>
</template>
<script>
export default {
   props:{ //父组件传值 可以是一个数组,对象
    vals:{
      type:String,//类型为字符窜
     default:"123" //可以设置默认值
    }
  },
}
</script>
Nach dem Login kopieren

2. Kommunikation von der untergeordneten Komponente zur übergeordneten Komponente

Verwenden Sie

, um das

Ereignis $emit(eventname,option) auszulösen, Parameter 1: Benutzerdefinierter Ereignisname, Schreibmethode , Kleinbuchstaben oder verbunden mit -, wie z. B. Ereignis, Ereignisname kann nicht in Kamel-Schreibweise geschrieben werden (Ereignisname)

Die untergeordnete Komponente übergibt den Wert an die übergeordnete Komponente. Sie können $emit verwenden, um den Ereigniswert auszulösen in der untergeordneten Komponente und geben Sie sie weiter, die übergeordnete Komponente erhält Daten durch Ereignisüberwachung

Hier gibt es jedoch ein Problem:

1 Es ist die untergeordnete Komponente, an die aktiv Daten übertragen werden die übergeordnete Komponente, und die übergeordnete Komponente hört zu und empfängt sie (wird von der untergeordneten Komponente gesteuert) Bestimmen Sie, wann der Wert übergeben werden soll)

2. Oder verwenden Sie die übergeordnete Komponente, um zu entscheiden, wann die untergeordnete Komponente den Wert an übergeben soll übergeordnete Komponente und überwachen Sie dann den Empfang (die Operation in der übergeordneten Komponente bestimmt, wann der Wert übergeben werden soll)

Beide Fälle existieren2.1 : Das $meit-Ereignis wird ausgelöst und das benutzerdefinierte Ereignis $emit wird durch das Ereignis innerhalb der Unterkomponente ausgelöst

2.2: Das $meit-Ereignis wird ausgelöst und das benutzerdefinierte Ereignis $emit

kann durch das Ereignis ausgelöst werden, dass die übergeordnete Komponente die untergeordnete Komponente bedient (ref). Der erste Fall:

//父组件:parent.vue
<template>
  <p>
    <child v-on:childevent=&#39;wathChildEvent&#39;></child>
    <p>子组件的数据为:{{msg}}</p>
  </p>
</template>
<script>
import child from "./child";
export default {
  data(){
    return{
      msg:""
    }
  },
  components:{
    child
  },
  methods:{
    wathChildEvent:function(vals){//直接监听 又子组件触发的事件,参数为子组件的传来的数据
      console.log(vals);//结果:这是子组件的数据,将有子组件操作触发传给父组件
      this.msg = vlas;
    } 
  }
}
</script>
//子组件:child.vue
<template>
  <p>
    <input type="button" value="子组件触发" @click="target">
  </p>
</template>
<script>
export default {
  data(){
      return {
      texts:'这是子组件的数据,将有子组件操作触发传给父组件'
      }
  },
  methods:{
    target:function(){ //有子组件的事件触发 自定义事件childevent
      this.$emit('childevent',this.texts);//触发一个在子组件中声明的事件 childEvnet
    }
  },
}
</script>
Nach dem Login kopieren

Zweiter Fall:

//父组件:parent.vue
<template>
  <p>
    <child v-on:childevent=&#39;wathChildEvent&#39; ref="childcomp"></child>
    <input type="button" @click="parentEnvet" value="父组件触发" />
    <p>子组件的数据为:{{msg}}</p>
  </p>
</template>
<script>
import child from "./child";
export default {
  data(){
    return{
      msg:""
    }
  },
  components:{
    child
  },
  methods:{
    wathChildEvent:function(vals){//直接监听 又子组件触发的事件,参数为子组件的传来的数据
      console.log(vals);//这是子组件的数据,将有子组件操作触发传给父组件
      this.msg = vlas;
    },
    parentEnvet:function(){
      this.$refs['childcomp'].target(); //通过refs属性获取子组件实例,又父组件操作子组件的方法触发事件$meit
    }
  }
}
</script>
//子组件:child.vue
<template>
  <p>
   <!-- dothing..... -->
  </p>
</template>
<script>
export default {
  data(){
      return {
      texts:'这是子组件的数据,将有子组件操作触发传给父组件'
      }
  },
  methods:{
    target:function(){ //又子组件的事件触发 自定义事件childevent
      this.$emit('childevent',this.texts);//触发一个在子组件中声明的事件 childEvnet
    }
  },
}
</script>
Nach dem Login kopieren
Beim Vergleich der beiden Situationen liegt der Unterschied darin, ob das benutzerdefinierte $emit-Ereignis von einer übergeordneten Komponente oder einer untergeordneten Komponente ausgelöst wird

Erstens: Die erste besteht darin, ein Klickereignis in der untergeordneten Komponente zu definieren, um das benutzerdefinierte Ereignis auszulösen $ emittieren und dann in der übergeordneten Komponente abhören

Die zweite besteht darin, das erste Klickereignis in der übergeordneten Komponente in der Komponente zu erstellen. Holen Sie sich die Instanzmethode über Refs, um das Ereignis direkt auszulösen, und hören Sie dann zu in der übergeordneten Komponente

3. Kommunikation zwischen Geschwisterkomponenten

(1), Daten zwischen Brüdern durch Ereignisse übertragen

(2) Erstellen Sie eine neue Vue-Instanz, damit alle Brüder können denselben Ereignismechanismus verwenden. (Wichtige Punkte)

(3) Bei der Übergabe von Daten wird $emit (Methodenname, übergebene Daten) durch Ereignisse ausgelöst.

(4) Die datenempfangende Partei löst das Ereignis $on (Methodenname, Rückruf (empfangene Daten)) in der Hook-Funktion „mounten“ (montierte Instanz) aus. Dies ändert sich zu diesem Zeitpunkt in der Rückruffunktion wurden für die Verwendung von Pfeilfunktionen entwickelt.

//建立一个空的Vue实例,将通信事件挂载在该实例上
//emptyVue.js
import Vue from 'vue'
export default new Vue()
//兄弟组件a:childa.vue
<template>
  <p>
    <span>A组件->{{msg}}</span>
    <input type="button" value="把a组件数据传给b" @click ="send">
  </p>
</template>
<script>
import vmson from "./emptyVue"
export default {
  data(){
    return {
      msg:"我是a组件的数据"
    }
  },
  methods:{
    send:function(){
      vmson.$emit("aevent",this.msg)
    }
  }
}
</script>
//兄弟组件b:childb.vue
<template>
   <p>
    <span>b组件,a传的的数据为->{{msg}}</span>
  </p>
</template>
<script>
import vmson from "./emptyVue"
export default {
 data(){
    return {
      msg:""
    }
  },
  mounted(){
    vmson.$on("aevent",(val)=>{//监听事件aevent,回调函数要使用箭头函数;
      console.log(val);//打印结果:我是a组件的数据
      this.msg = val;
    })
  }
}
</script>
//父组件:parent.vue
<template>
  <p>
    <childa><childa>
    <childb></childb>
  </p>
</template>
<script>
import childa from "./childa";
import childb from "./childb";
export default {
  data(){
    return{
      msg:""
    }
  },
  components:{
    childa,
    childb
  },
}
</script>
Nach dem Login kopieren

An diesem Punkt können die Komponentenkommunikation und Wertübertragung in Vue grundsätzlich gelöst werden, für große und komplexe Projekte wird jedoch empfohlen, die Vuex-Statusverwaltung zu verwenden, um besser geeignet zu sein....

Ich glaube, Sie haben diesen Artikel gelesen. Sie beherrschen die Fallmethode. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website!

Empfohlene Lektüre:

So optimieren Sie die js-asynchrone Funktion


So verwenden Sie weniger in Angular6

Das obige ist der detaillierte Inhalt vonSo bedienen Sie $emit und $on in Vue, um mit Eltern-Kind- und Geschwisterkomponenten zu kommunizieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage