vue中的組件通信

一.Props傳遞數(shù)據(jù)

components
   ├── Grandson1.vue // 孫子1
   ├── Grandson2.vue // 孫子2
   ├── Parent.vue   // 父親
   ├── Son1.vue     // 兒子1
   └── Son2.vue     // 兒子2

在父組件中使用兒子組件

<template>
 <div>
  父組件:{{mny}}
  <Son1 :mny="mny"></Son1>
 </div>
</template>
<script>
import Son1 from "./Son1";
export default {
 components: {
  Son1
 },
 data() {
  return { mny: 100 };
 }
};
</script>

子組件接受父組件的屬性
子組件1:

二.$emit使用

子組件觸發(fā)父組件方法,通過回調(diào)的方式將修改的內(nèi)容傳遞給父組件

<template>
 <div>
  父組件:{{mny}}
  <Son1 :mny="mny" @input="change"></Son1>
 </div>
</template>
<script>
import Son1 from "./Son1";
export default {
 methods: {
  change(mny) {
   this.mny = mny;
  }
 },
 components: {
  Son1
 },
 data() {
  return { mny: 100 };
 }
};
</script>

子組件觸發(fā)綁定自己身上的方法

<template>
 <div>
  子組件1: {{mny}}
  <button @click="$emit('input',200)">更改</button>
 </div>
</template>
<script>
export default {
 props: {
  mny: {
   type: Number
  }
 }
};
</script>

這里的主要目的就是同步父子組件的數(shù)據(jù) -> 語法糖的寫法

.sync

<Son1 :mny.sync="mny"></Son1>
<!-- 觸發(fā)的事件名 update:(綁定.sync屬性的名字) -->
<button @click="$emit('update:mny',200)">更改</button>

v-model

<Son1 v-model="mny"></Son1>
<template>
 <div>
  子組件1: {{value}} // 觸發(fā)的事件只能是input
  <button @click="$emit('input',200)">更改</button>
 </div>
</template>
<script>
export default {
 props: {
  value: { // 接收到的屬性名只能叫value
   type: Number
  }
 }
};
</script>

三. parent、children

繼續(xù)將屬性傳遞

<Grandson1 :value="value"></Grandson1>
<template>
 <div>
  孫子:{{value}}
  <!-- 調(diào)用父組件的input事件 -->
  <button @click="$parent.$emit('input',200)">更改</button>
 </div>
</template>
<script>
export default {
 props: {
  value: {
   type: Number
  }
 }
};
</script>

如果層級很深那么就會出現(xiàn)多層.....我們可以封裝一個(gè)$dispatch方法向上進(jìn)行派發(fā)

$dispatch

Vue.prototype.$dispatch = function $dispatch(eventName, data) {
  let parent = this.$parent;
  while (parent) {
    parent.$emit(eventName, data);
    parent = parent.$parent;
  }
};

既然能向上派發(fā)那同樣可以向下進(jìn)行派發(fā)

$broadcast

Vue.prototype.$broadcast = function $broadcast(eventName, data) {
  const broadcast = function () {
    this.$children.forEach((child) => {
      child.$emit(eventName, data);
      if (child.$children) {
        $broadcast.call(child, eventName, data);
      }
    });
  };
  broadcast.call(this, eventName, data);
};

四.attrs、listeners

$attrs

批量向下傳入屬性

<Son2 name="小珠峰" age="10"></Son2>

<!-- 可以在son2組件中使用$attrs屬性,可以將屬性繼續(xù)向下傳遞 -->
<div>
  兒子2: {{$attrs.name}}
  <Grandson2 v-bind="$attrs"></Grandson2>
</div>


<template>
 <div>孫子:{{$attrs}}</div>
</template>

$listeners

批量向下傳入方法

<Son2 name="小珠峰" age="10" @click="()=>{this.mny = 500}"></Son2>
<!-- 可以在son2組件中使用listeners屬性,可以將方法繼續(xù)向下傳遞 -->
<Grandson2 v-bind="$attrs" v-on="$listeners"></Grandson2>

<button @click="$listeners.click()">更改</button>

五.Provide & Inject

Provide

在父級中注入數(shù)據(jù)

provide() {
  return { parentMsg: "父親" };
},

Inject

在任意子組件中可以注入父級數(shù)據(jù)

inject: ["parentMsg"] // 會將數(shù)據(jù)掛載在當(dāng)前實(shí)例上

六.Ref使用

獲取組件實(shí)例

<Grandson2 v-bind="$attrs" v-on="$listeners" ref="grand2"></Grandson2>
mounted() { // 獲取組件定義的屬性
  console.log(this.$refs.grand2.name);
}

七.EventBus

用于跨組件通知(不復(fù)雜的項(xiàng)目可以使用這種方式)

Vue.prototype.$bus = new Vue();

Son2組件和Grandson1相互通信

mounted() {
  this.$bus.$on("my", data => {
   console.log(data);
  });
 },
mounted() {
  this.$nextTick(() => {
   this.$bus.$emit("my", "我是Grandson1");
  });
 },

八.Vuex通信

狀態(tài)管理


image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近一輪的面試結(jié)束了,沒有特別滿意的公司,就想著靜下心來好好地把vue相關(guān)的基礎(chǔ)知識整理一下。這周的技術(shù)周報(bào)就把v...
    易推倒DE小狼閱讀 682評論 0 2
  • 前言 組件是 vue.js最強(qiáng)大的功能之一,而組件實(shí)例的作用域是相互獨(dú)立的,這就意味著不同組件之間的數(shù)據(jù)無法相互引...
    用技術(shù)改變世界閱讀 2,301評論 1 3
  • 前言 組件是 vue.js最強(qiáng)大的功能之一,而組件實(shí)例的作用域是相互獨(dú)立的,這就意味著不同組件之間的數(shù)據(jù)無法相互引...
    Vicky丶Amor閱讀 6,115評論 10 162
  • 前言 組件是 vue.js最強(qiáng)大的功能之一,而組件實(shí)例的作用域是相互獨(dú)立的,這就意味著不同組件之間的數(shù)據(jù)無法相互引...
    7abbcd54a89d閱讀 763評論 0 1
  • 摘要: 總有一款合適的通信方式。 作者:浪里行舟 Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 前言 組件是 v...
    Fundebug閱讀 15,645評論 3 57

友情鏈接更多精彩內(nèi)容