Vue組件之間的通信方式(個人理解)

?Vue組件之間的通信方式(個人理解)

1. props(父傳子)

```

? //父組件 parent.vue

? <template>

? ? ? //子組件

? ? ? <child-com :num="num" :str="str" :obj="obj" :func="func" />

? </tempalte>

? //引入子組件

? import ChildCom from './components/child';

? export default{

? ? components:{ChildCom},

? ? data(){

? ? ? return {

? ? ? ? ? num:25,

? ? ? ? ? str:'這是一個字符串類型的父組件傳遞的值',

? ? ? ? ? obj:{

? ? ? ? ? ? ? attr:'一個對象中的屬性值'

? ? ? ? ? }

? ? ? }

? ? },

? ? methods:{

? ? ? func(){

? ? ? ? ? console.log('這是一個父組件的方法膛壹,可以由子組件通過props方式調(diào)用');

? ? ? }

? ? }

? }


? //子組件 child.vue

? export default{

? ? ? props:{

? ? ? ? ? num:{

? ? ? ? ? ? ? type:Number//num的類型為---數(shù)字類型

? ? ? ? ? },

? ? ? ? ? str:{

? ? ? ? ? ? ? type:String,//str的類型為---字符串類型

? ? ? ? ? ? ? default:'hello default value'//str的默認(rèn)值

? ? ? ? ? },

? ? ? ? ? obj:{

? ? ? ? ? ? ? type:Object,//obj的類型為---對象類型

? ? ? ? ? ? ? reqired:true//是否必傳的參數(shù),布爾值true:必須傳這個參數(shù) ,默認(rèn)為false:不是必傳

? ? ? ? ? },

? ? ? ? ? func:{

? ? ? ? ? ? ? type:Function, //func的類型為---函數(shù)

? ? ? ? ? ? ? default(){? //不傳遞時默認(rèn)值

? ? ? ? ? ? ? ? ? return ()=>{}

? ? ? ? ? ? ? }

? ? ? ? ? }

? ? ? },

? ? ? data(){

? ? ? ? return{}

? ? ? },

? ? ? mounted(){

? ? ? ? console.log(this.num);

? ? ? ? //控制臺輸出:25

? ? ? ? console.log(this.str);

? ? ? ? //控制臺輸出:這是一個字符串類型的父組件傳遞的值

? ? ? ? console.log(this.obj);

? ? ? ? //控制臺輸出:{attr:'一個對象中的屬性值'}

? ? ? ? this.func();

? ? ? ? //調(diào)用parent的func方法

? ? ? ? //控制臺輸出:這是一個父組件的方法,可以由子組件通過props方式調(diào)用

? ? ? }

? }


```

2. v-on/this.$emit('方法名','參數(shù)');(父傳子,子通過調(diào)用父傳來的方法回傳參數(shù))


```

//(父傳子龄恋,子通過調(diào)用父傳來的方法回傳參數(shù))

//父組件: @childMethod="parentMethod"?

//子組件: this.$emit('方法名',參數(shù))

//childMethod:child子組件中this.$emit('childMethod',參數(shù))

//parentMethod:parent父組件中的要被子組件調(diào)用的方法名

? //父組件 parent.vue

? <template>

? ? ? //子組件

? ? ? <child-com :num="num" :str="str" :obj="obj" @func="func" />

? </tempalte>

? //引入子組件

? import ChildCom from './components/child';

? export default{

? ? components:{ChildCom},

? ? data(){

? ? ? return {

? ? ? ? ? num:25,

? ? ? ? ? str:'這是一個字符串類型的父組件傳遞的值',

? ? ? ? ? obj:{

? ? ? ? ? ? ? attr:'一個對象中的屬性值'

? ? ? ? ? }

? ? ? }

? ? },

? ? methods:{

? ? ? func(arguments){

? ? ? ? ? console.log('這是一個父組件的方法,可以由子組件通過props方式調(diào)用',arguments);

? ? ? }

? ? }

? }


? //子組件 child.vue

? export default{

? ? ? props:{

? ? ? ? ? num:{

? ? ? ? ? ? ? type:Number//num的類型為---數(shù)字類型

? ? ? ? ? },

? ? ? ? ? str:{

? ? ? ? ? ? ? type:String,//str的類型為---字符串類型

? ? ? ? ? ? ? default:'hello default value'//str的默認(rèn)值

? ? ? ? ? },

? ? ? ? ? obj:{

? ? ? ? ? ? ? type:Object,//obj的類型為---對象類型

? ? ? ? ? ? ? reqired:true//是否必傳的參數(shù),布爾值true:必須傳這個參數(shù) 患雏,默認(rèn)為false:不是必傳

? ? ? ? ? }

? ? ? },

? ? ? data(){

? ? ? ? return{}

? ? ? },

? ? ? mounted(){

? ? ? ? console.log(this.num);

? ? ? ? //控制臺輸出:25

? ? ? ? console.log(this.str);

? ? ? ? //控制臺輸出:這是一個字符串類型的父組件傳遞的值

? ? ? ? console.log(this.obj);

? ? ? ? //控制臺輸出:{attr:'一個對象中的屬性值'}

? ? ? ? this.$emit('func',參數(shù));

? ? ? ? //調(diào)用parent的func方法

? ? ? ? //控制臺輸出:這是一個父組件的方法,可以由子組件通過props方式調(diào)用,參數(shù)

? ? ? }

? }


```

3. this.$refs.child.method(arguments);(父傳子)

```

//child:為子組件ref注冊的名字罢维,可自行命名

//method:為子組件中的方法名

? //父組件 parent.vue

? <template>

? ? ? //子組件

? ? ? <child-com ref="child" />

? </tempalte>

? //引入子組件

? import ChildCom from './components/child';

? export default{

? ? components:{ChildCom},

? ? data(){

? ? ? ? return{}

? ? }

? ? methods:{

? ? ? func(){

? ? ? ? this.$refs.child.childMethod();

? ? ? ? //控制臺輸出:我是子組件的方法淹仑,父組件通過this.$refs.child.childMethod()調(diào)用

? ? ? }

? ? }

? }


? //子組件 child.vue

? export default{

? ? props:{},

? ? data(){

? ? ? return{}

? ? },

? ? mounted(){},

? ? methods:{

? ? ? childMethod(){

? ? ? ? console.log('我是子組件的方法,父組件通過this.$refs.child.childMethod()調(diào)用');

? ? ? }

? ? }

? }

```

4. this.$parent.$parent.func(arguments);(子傳父)

```

//父組件的fun方法

? //父組件 parent.vue

? <template>

? ? ? //子組件

? ? ? <child-com? />

? </tempalte>

? //引入子組件

? import ChildCom from './components/child';

? export default{

? ? components:{ChildCom},

? ? data(){

? ? ? return {}

? ? },

? ? methods:{

? ? ? func(arguments){

? ? ? ? ? console.log('這是一個父組件的方法肺孵,可以由子組件通過this.$parent.$parent(參數(shù))方式調(diào)用',arguments);

? ? ? }

? ? }

? }


? //子組件 child.vue

? export default{

? ? ? props:{ },

? ? ? data(){

? ? ? ? return{}

? ? ? },

? ? ? mounted(){

? ? ? this.$parent.$parent.func('參數(shù)');

? ? ? ? //調(diào)用parent的func方法

? ? ? ? //控制臺輸出:這是一個父組件的方法匀借,可以由子組件通過this.$parent.$parent(參數(shù))方式調(diào)用,參數(shù)

? ? ? }

? }


```

5. this.$attrs:里面包含所有父組件中不作為 prop傳遞的屬性∑骄剑可以進(jìn)行跨級的參數(shù)傳遞

```

//(父傳子---屬性)

//可修改this.$atrrs里的屬性值

? //父組件 parent.vue

? <template>

? ? <child-com str="這是一個不通過prop傳遞的字符串" :strProp="strProp" />

? </template>

? export default {

? ? data(){

? ? ? return {

? ? ? ? ? strProp:"這是一個通過prop傳遞的字符串"

? ? ? }

? ? },

? }


? //子組件 child.vue

? <tempalte>

? ? <grand-child v-bind="$attrs" /> //針對向下級組件傳遞

? </temaplate>


? import GrandChildCom from './grandchild';


? export default {

? ? components:{GrandChildCom},

? ? props:{

? ? ? ? strProp:{

? ? ? ? ? ? type:String,

? ? ? ? ? ? default:''

? ? ? ? }

? ? },

? ? data(){

? ? ? ? return {}

? ? },

? ? mounted(){

? ? ? ? console.log(this.$atrrs);//{str:'這是一個不通過prop傳遞的字符串'}

? ? ? ? console.log(this.strProp);//這是一個通過prop傳遞的字符串

? ? }

? }


? //孫子組件GrandChild.vue

? export default {

? ? props:{

? ? ? ? strProp:{

? ? ? ? ? ? type:String,

? ? ? ? ? ? default:''

? ? ? ? }

? ? },

? ? data(){

? ? ? ? return {}

? ? },

? ? mounted(){

? ? ? ? console.log(this.$atrrs);//{str:'這是一個不通過prop傳遞的字符串'}

? ? ? ? console.log(this.strProp);//這是一個通過prop傳遞的字符串

? ? }

? }

```

6. this.$listeners:包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監(jiān)聽器

```

//(父傳子---方法吓肋,子通過調(diào)用父傳來的方法回傳參數(shù))

//this.$listeners

? //父組件 parent.vue

? <template>

? ? <child-com @handleUpdate="handleUpdate" @handleAdd.native="handleAdd" />

? </template>

? export default {

? ? data(){

? ? ? return {}

? ? },

? ? methods:{

? ? ? ? handleUpdate(val){

? ? ? ? ? ? console.log('這是handleUpdate的日志',val);

? ? ? ? },

? ? ? ? handleAdd(){

? ? ? ? ? ? console.log('這是handleAdd的日志');

? ? ? ? },

? ? }

? }


? //子組件 child.vue

? <tempalte>

? ? <grand-child-com v-on="$listeners" /> //針對向下級組件傳遞

? </temaplate>


? import GrandChildCom from './grandchild';


? export default {

? ? components:{GrandChildCom},

? ? props:{},

? ? data(){

? ? ? ? return {}

? ? },

? ? mounted(){

? ? ? ? console.log(this.$listeners);//{handleUpdate:f}

? ? ? ? console.log(this.$listeners.handleUpdate('child調(diào)用的'));//這是handleUpdate的日志,child調(diào)用的

? ? }

? }


? //孫子組件GrandChild.vue

? export default {

? ? props:{

? ? ? ? strProp:{

? ? ? ? ? ? type:String,

? ? ? ? ? ? default:''

? ? ? ? }

? ? },

? ? data(){

? ? ? ? return {}

? ? },

? ? mounted(){

? ? ? ? console.log(this.$listeners);//{handleUpdate:f}

? ? ? ? console.log(this.$listeners.handleUpdate('grandChild調(diào)用的'));//這是handleUpdate的日志,grandChild調(diào)用的

? ? }

? }

```

7. provide/inject(選項 / 組合):允許一個祖先組件向其所有子孫后代注入一個依賴,可以注入屬性和方法瑰艘,從而實現(xiàn)跨級父子組件通信


```

//(父傳子---依賴是鬼,子通過調(diào)用父傳來的方法回傳參數(shù))

// provide/inject

? //父組件 parent.vue

? <template>

? ? <child-com? />

? </template>

? export default {

? ? data(){

? ? ? return {

? ? ? ? ? name:'Hello Xiaoer'

? ? ? }

? ? },

? ? provide() {

? ? ? return {

? ? ? ? provideName: {

? ? ? ? ? name: this.name,

? ? ? ? ? change: (val) => {

? ? ? ? ? ? console.log( val )

? ? ? ? ? }

? ? ? ? }

? ? ? }

? ? }

? }


? //子組件 child.vue

? <tempalte>

? ? <grand-child-com? /> //針對向下級組件傳遞

? </temaplate>


? import GrandChildCom from './grandchild';


? export default {

? ? components:{GrandChildCom},

? ? props:{},

? ? data(){

? ? ? ? return {}

? ? },

? ? inject: ['provideName'],

? ? mounted(){

? ? ? ? console.log(this.provideName.name);//控制臺輸出:Hello Xiaoer

? ? ? ? this.provideName.change('變化函數(shù)');//控制臺輸出:變化函數(shù)

? ? },

? }


? //孫子組件GrandChild.vue

? export default {

? ? props:{},

? ? data(){

? ? ? ? return {}

? ? },

? ? inject: ['provideName'],

? ? mounted(){

? ? ? ? console.log(this.provideName.name);//控制臺輸出:Hello Xiaoer

? ? ? ? this.provideName.change('變化函數(shù)');//控制臺輸出:變化函數(shù)

? ? },

? }

```

8. EventBus:(第三方庫)甚至任意2個組件間通信(任意組件)

```

[github地址](https://github.com/krasimir/EventBus)

//通過導(dǎo)出一個 Vue 實例肤舞,然后再需要的地方引入:

? ? // eventBus.js

? ? import Vue from 'vue'export

? ? const EventBus = new Vue()

? ? //使用 EventBus 訂閱和發(fā)布消息:

? ? import {EventBus} from '../utils/eventBus.js'

? ? // 訂閱消息(接受更新后需要做點什么的組件)

? ? EventBus.$on('update', val => {})

? ? // 發(fā)布消息(負(fù)責(zé)更新的組件)

? ? EventBus.$emit('update', '更新信息')

```

```

//在main.js中初始化一個全局的事件:

? ? // main.js

? ? Vue.prototype.$eventBus = new Vue()

? ? //index.vue

? ? // 訂閱消息(接受更新后需要做點什么的組件)

? ? this.$eventBus.$on('update', val => {})

? ? // 發(fā)布消息(負(fù)責(zé)更新的組件)

? ? this.$eventBus.$emit('update', '更新信息')

```

```

//移除事件監(jiān)聽

? ? this.$eventBus.$off('update', {})

```

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市均蜜,隨后出現(xiàn)的幾起案子李剖,更是在濱河造成了極大的恐慌,老刑警劉巖囤耳,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篙顺,死亡現(xiàn)場離奇詭異,居然都是意外死亡充择,警方通過查閱死者的電腦和手機德玫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椎麦,“玉大人宰僧,你說我怎么就攤上這事×逄蓿” “怎么了撒桨?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長键兜。 經(jīng)常有香客問我凤类,道長,這世上最難降的妖魔是什么普气? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任谜疤,我火速辦了婚禮,結(jié)果婚禮上现诀,老公的妹妹穿的比我還像新娘夷磕。我一直安慰自己,他們只是感情好仔沿,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布坐桩。 她就那樣靜靜地躺著,像睡著了一般封锉。 火紅的嫁衣襯著肌膚如雪绵跷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天成福,我揣著相機與錄音碾局,去河邊找鬼。 笑死奴艾,一個胖子當(dāng)著我的面吹牛净当,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼像啼,長吁一口氣:“原來是場噩夢啊……” “哼俘闯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起埋合,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤备徐,失蹤者是張志新(化名)和其女友劉穎萄传,沒想到半個月后甚颂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡秀菱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年振诬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衍菱。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡赶么,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脊串,到底是詐尸還是另有隱情辫呻,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布琼锋,位于F島的核電站放闺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏缕坎。R本人自食惡果不足惜怖侦,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谜叹。 院中可真熱鬧匾寝,春花似錦、人聲如沸荷腊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽女仰。三九已至猜年,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間董栽,已是汗流浹背码倦。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锭碳,地道東北人袁稽。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像擒抛,于是被迫代替她去往敵國和親推汽。 傳聞我的和親對象是個殘疾皇子补疑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容