vue2.0中的組件通信:v-model、作用域插槽工腋、事件總線等

前言

一篇小總結(jié)姨丈,組件間的通信問題,把v-model擅腰、作用域插槽也歸入了构挤。

通信場景

  1. 父傳子
  2. 子傳父
  3. 父子同步
  4. 非父子

父傳子

父傳子也可以分為兩種情況

  1. 傳數(shù)據(jù):props
  2. 傳html:slot

傳數(shù)據(jù)

這個(gè)是最基本的一般就是父組件用v-bind動(dòng)態(tài)賦值,props在子組件內(nèi)相當(dāng)于在子組件內(nèi)新建了一個(gè)data惕鼓,props可以為字符串?dāng)?shù)組,也可以是對象唐础,為對象時(shí)則可以設(shè)置類型檢查和默認(rèn)值箱歧,如果想在子組件更改傳進(jìn)來的數(shù)據(jù)可以通過data引用或計(jì)算屬性來轉(zhuǎn)換。

傳html

也就是插槽一膨,基礎(chǔ)的html標(biāo)簽中是可以寫html或字符的呀邢,而在如果自定義組件標(biāo)簽內(nèi)寫,就會(huì)--什么都不會(huì)發(fā)生豹绪。因?yàn)樵谧咏M件內(nèi)沒有定義插槽价淌,如果在子組件內(nèi)有slot,則傳入的內(nèi)容就會(huì)顯示在插槽處瞒津。傳的多的話就要有name來區(qū)分
例子

-----子組件---------
<template>
  <div class="child">
    <p>這是子組件</p>
    <slot name='first'>我是默認(rèn)內(nèi)容</slot>
    <slot name='second'>我是默認(rèn)內(nèi)容</slot>
    <slot name='third'>我是默認(rèn)內(nèi)容</slot>
  </div>
</template>

---------父組件-----------
<template>
  <div class="parent">
   <my-child>
     <p slot='first'>我在父組件寫但是在子組件顯示</p>
     <template slot="second">
       <h1>我是父組件寫的標(biāo)題</h1>
       <p>我是父組件寫的文章</p>
     </template>
     <h1 slot='third'>標(biāo)題是{{title}}</h1>
     </my-child>
   <p>這是父組件</p>
  </div>
</template>

渲染結(jié)果


父傳子html

總之就是花樣傳進(jìn)去html蝉衣,更復(fù)雜的作用域插槽在子傳父寫

子傳父

這個(gè)都是傳數(shù)據(jù)臂港,方法有以下幾種

  1. 通過事件向父組件發(fā)送消息
  2. 作用域插槽

事件傳信

在父組件的子組件標(biāo)簽上監(jiān)聽事件侥锦,就像監(jiān)聽一個(gè)click一樣,監(jiān)聽一個(gè)自定義事件中狂,而這個(gè)事件的觸發(fā)卻在子組件內(nèi)屁柏,例子啦膜,子組件的按鈕會(huì)發(fā)出事件信號(hào)add有送,在父組件中的子組件標(biāo)簽上注冊監(jiān)聽,監(jiān)聽到則觸發(fā)僧家。

----------------子組件--------
 <p>這是子組件</p>
    <button @click="$emit('add')">子組件</button>
----------------父組件-------------
<my-child v-on:add ='count += 1'></my-child >
     <p>{{count}}</p>
   <p>這是父組件</p>

事件

根據(jù)上面的例子進(jìn)一步雀摘,$emit的第二個(gè)參數(shù)可以通過事件傳值,在父組件中通過訪問$event接收 例子這樣就是點(diǎn)一下加3了八拱。如果事件是函數(shù)那值會(huì)稱為函數(shù)的第一個(gè)參數(shù)阵赠,無需$event

----------------子組件--------
 <p>這是子組件</p>
    <button @click="$emit('add',3)">子組件</button>
----------------父組件-------------
<my-child v-on:add ='count += $event'></my-child >
     <p>{{count}}</p>
   <p>這是父組件</p>

作用域插槽

這個(gè)作用域插槽是勉強(qiáng)可以放到子向父傳數(shù)據(jù),雖然還是要還給子組件乘粒,上面插槽可知豌注,子組件內(nèi)部的slot在父組件未向其傳內(nèi)容時(shí)是不顯示或顯示默認(rèn)內(nèi)容的,但是如果父組件指向向子組件傳遞html和css但是內(nèi)容卻由子組件自己提供呢灯萍?在父組件內(nèi)不管{{}}寫到哪轧铁,它能訪問的都是父組件的作用域,現(xiàn)在我們需要在父組件的子標(biāo)簽內(nèi)訪問子標(biāo)簽的作用域

---------------------子組件-------------------------
<template>
  <div class="child">
    <p>這是子組件</p>
    <slot :data='data'> </slot>
  </div>
</template>

<script>
  export default {
    data() {
      return {
        data: ['子數(shù)據(jù)1','子數(shù)據(jù)2']
      }
    },
  }
</script>
----------------------父組件----------------------
<template>
  <div class="parent">
   <my-child >
     <template slot-scope='scope'> // scope就是個(gè)名字代表著子組件作用域
       {{scope.data}}
     </template>
     </my-child >
   <p>這是父組件</p>
  </div>
</template>

子組件內(nèi)slot通過bind綁定data旦棉,在父組件內(nèi)給它取個(gè)名叫scope齿风,slot-scope='scope'就可以訪問了。懶得起名就用解構(gòu)賦值slot-scope={data}

父子同步

也就是prop的雙向綁定绑洛,單向數(shù)據(jù)流不可能雙向綁定的救斑,但是通過父通過props傳子,子通過$emit傳父真屯,父在傳回來可以實(shí)現(xiàn)同步

-----------------子組件-------------------------
<div class="child">
    <p>這是子組件</p>
    <button @click="$emit('update:title',childTitle)">更新標(biāo)題</button>
    <p>{{title}}</p>
  </div>
-----------------父組件---------------------
<div class="parent">
   <my-child :title="title" v-on:update:title='title = $event'></my-child >
   <p>這是父組件</p>
  </div>

簡寫
 <my-child :title.sync="title"></my-child >

v-model

v-model也是一個(gè)意思脸候,一個(gè)組件上的 v-model 默認(rèn)會(huì)利用名為 value 的 prop 和名為 input 的事件。默認(rèn)傳遞value進(jìn)去又默認(rèn)監(jiān)聽input事件绑蔫,且監(jiān)聽后將傳過來的值賦給value运沦。

<input
                type="text"
                v-model="something">
        <!--等價(jià)于-->
        <input
                type="text"
                v-bind:value="something"
                v-on:input="something = $event.target.value">

非父子

也就是同級(jí)組件或?qū)O子組件之類的,一種方法是用一個(gè)空的vue實(shí)例當(dāng)作中央事件總線配深,當(dāng)作中介携添。組件通過emit傳遞,總線通過on監(jiān)聽事件來接受篓叶,很好理解烈掠。
一種就是使用vuex。雖然官方推薦項(xiàng)目比較大時(shí)才使用缸托,但是vuex語法簡單左敌,可以塞異步方法進(jìn)去,配合調(diào)試工具數(shù)據(jù)流清晰俐镐。不管大小直接就用母谎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市京革,隨后出現(xiàn)的幾起案子奇唤,更是在濱河造成了極大的恐慌幸斥,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咬扇,死亡現(xiàn)場離奇詭異甲葬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懈贺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門经窖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梭灿,你說我怎么就攤上這事画侣。” “怎么了堡妒?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵配乱,是天一觀的道長。 經(jīng)常有香客問我皮迟,道長搬泥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任伏尼,我火速辦了婚禮忿檩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爆阶。我一直安慰自己燥透,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布辨图。 她就那樣靜靜地躺著兽掰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪徒役。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天窖壕,我揣著相機(jī)與錄音忧勿,去河邊找鬼。 笑死瞻讽,一個(gè)胖子當(dāng)著我的面吹牛鸳吸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播速勇,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼晌砾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烦磁?” 一聲冷哼從身側(cè)響起养匈,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤哼勇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后呕乎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體积担,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年猬仁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帝璧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡湿刽,死狀恐怖的烁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情诈闺,我是刑警寧澤渴庆,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站买雾,受9級(jí)特大地震影響把曼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漓穿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一嗤军、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晃危,春花似錦叙赚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鳍鸵,卻和暖如春苇瓣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偿乖。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工击罪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贪薪。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓媳禁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親画切。 傳聞我的和親對象是個(gè)殘疾皇子竣稽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

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