Vue2.0組件通信(非Vuex)

最近學(xué)了Vue2.0,寫寫自己的一點(diǎn)總結(jié),關(guān)于父子組件通信的妓忍,這點(diǎn)對于我來說虏两,是看文檔的時(shí)候比較難理解的。通過網(wǎng)上找資料和實(shí)踐世剖,也有一點(diǎn)理解定罢。

例子使用以下代碼模板

<script src="https://cdn.bootcss.com/vue/2.1.10/vue.min.js"></script>
<div id="app">
    <!--父組件-->
    <p>{{total}}</p>
    <child @add="incrementTotal" ref="childTest" :num-a="total" num-s="total"></child>
    <button type="button" @click="clickref">調(diào)用子組件</button>
</div>

<!--子組件-->
<template id="myChild">
    <button @click="add">{{counter}}</button>
</template>

<script>
    new Vue({
        el:'#app',
        data :{
            total: 1          
        },
        methods:{
            incrementTotal : function(){
    
            },
            clickref:function(){
    
            }
        },
        components:{
            'child' :{
                template:'#myChild',
                data : function(){
                    return{
                        counter : 0
                    }
                },
                props:['numA','numS'],
                methods:{
                    add : function(){
    
                    }
                }
            }
        }
    });
</script>

父組件傳數(shù)據(jù)給子組件

當(dāng)子組件需要父組件傳遞的數(shù)據(jù)時(shí),子組件要設(shè)置props,來接收父組件傳遞過去的值旁瘫。
在這里父組件傳遞的是total祖凫,子組件設(shè)置props[numA,numS],接著在調(diào)用子組件的時(shí)候?qū)⒏附M件的數(shù)據(jù)傳遞過去酬凳,如下

    <child :num-a="total" num-s="total"></child>

這樣就可以子組件'child'就能接收到父組件(也就是掛載在 app上的)的數(shù)據(jù)惠况。

關(guān)于props的寫法有多種,具體請看官方文檔

父子通信-動(dòng)態(tài)數(shù)據(jù)

有時(shí)候我們想實(shí)現(xiàn)父組件的數(shù)據(jù)能動(dòng)態(tài)的傳遞給子組件宁仔,使用v-model來實(shí)現(xiàn)

<input v-model="total">
<child :num-a="total">

<!--props的另外一種寫法-->
<scirpt>
...
props: {
    numA: [String, Number]
}
</script>

子組件與父組件通信

有時(shí)候我們想要實(shí)現(xiàn)子組件調(diào)用父組件稠屠,那要怎么做呢?
我們可以通過觸發(fā)事件來通知父組件改變數(shù)據(jù)翎苫。

父組件:

<div>
    <child @add="incrementTotal" :num-a="total"></child> //監(jiān)聽子組件觸發(fā)的add事件,然后調(diào)用incrementTotal方法
</div>
methods: {
    incrementTotal() {
        this.total +=1
    }
}

子組件:

components:{
    'child' :{
        template:'#myChild',
        data : function(){
            return{
                counter : 0
            }
        },
        props:['numA','numS'],
        methods:{
            add : function(){
                this.counter +=1
                this.$emit('add') //子組件通過 $emit觸發(fā)父組件的方法add
            }
        }
    }
}

子組件執(zhí)行add方法 => 觸發(fā)$emit => 觸發(fā)父組件add方法 => 執(zhí)行 incrementTotal 方法 => 完成

父組件調(diào)用子組件

通過給子組件設(shè)置ref完箩,可以很方便的獲取到子組件,然后改變子組件拉队。

    <child @add="incrementTotal" ref="childTest" :num-a="total" num-s="total"></child>
new Vue({
    el:'#app',
    data :{
        total: 0          
    },
    methods:{
        incrementTotal : function(){
            this.total += 1
        },
        clickref:function(){
            let childRef = this.$refs.childTest //獲取子組件
                childRef.counter = 1221         //改變子組件的數(shù)據(jù)
                childRef.add(11)                //調(diào)用子組件的方法
        }
    },
    components:{
        'child' :{
            template:'#myChild',
            data : function(){
                return{
                    counter : 0
                }
            },
            props:['numA','numS'],
            methods:{
                add : function(num){
                    this.counter +=1
                    this.$emit('add')
                    console.log('接收父組件的值':+ num)
                }
            }
        }
    }
});

子組件與子組件通信

如果2個(gè)組件不是父子組件那么如何通信呢弊知?
這時(shí)可以通過eventHub來實(shí)現(xiàn)通信,
所謂eventHub就是創(chuàng)建一個(gè)事件中心粱快,相當(dāng)于中轉(zhuǎn)站秩彤,可以用它來傳遞事件和接收事件。(或者使用vuex)
簡單代碼如下

new Vue({
  el: '#app',
  data: {
    eventHub: new Vue()
  }
})

然后通過this.$root.eventHub獲取事哭,下面代碼簡寫為eventHub

組件1觸發(fā):

<div @click="eve"></div>
methods: {
    eve() {
        eventHub.$emit('change', params); //eventHub觸發(fā)事件
    }
}

組件2接收:

<div></div>
created() {
    eventHub.$on('change', (params) => { //eventHub接收事件
    });
}

這樣就實(shí)現(xiàn)了非父子組件之間的通信了漫雷,原理就是把Hub當(dāng)作一個(gè)中轉(zhuǎn)站!

總結(jié)

例子代碼:JSFiddle
參考:vue2.0父子組件以及非父子組件如何通信

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鳍咱,一起剝皮案震驚了整個(gè)濱河市降盹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谤辜,老刑警劉巖蓄坏,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丑念,居然都是意外死亡涡戳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門脯倚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渔彰,“玉大人嵌屎,你說我怎么就攤上這事』型浚” “怎么了宝惰?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長再沧。 經(jīng)常有香客問我尼夺,道長,這世上最難降的妖魔是什么产园? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任汞斧,我火速辦了婚禮夜郁,結(jié)果婚禮上什燕,老公的妹妹穿的比我還像新娘。我一直安慰自己竞端,他們只是感情好屎即,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著事富,像睡著了一般技俐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上统台,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天雕擂,我揣著相機(jī)與錄音,去河邊找鬼贱勃。 笑死井赌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贵扰。 我是一名探鬼主播仇穗,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戚绕!你這毒婦竟也來了纹坐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤舞丛,失蹤者是張志新(化名)和其女友劉穎耘子,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體球切,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拴还,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欧聘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片片林。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出费封,到底是詐尸還是另有隱情焕妙,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布弓摘,位于F島的核電站焚鹊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏韧献。R本人自食惡果不足惜末患,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锤窑。 院中可真熱鬧璧针,春花似錦、人聲如沸渊啰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绘证。三九已至隧膏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嚷那,已是汗流浹背胞枕。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魏宽,地道東北人腐泻。 一個(gè)月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像湖员,于是被迫代替她去往敵國和親贫悄。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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

  • 9.1 什么是組件娘摔? 組件(Component)是 Vue.js 最強(qiáng)大的功能之一窄坦。組件可以擴(kuò)展 HTML 元素,...
    白水螺絲閱讀 781評論 0 2
  • title: vue2.0組件間通信date: 2017年8月16日 17:57:06tags: csscateg...
    是ADI呀閱讀 321評論 0 1
  • 本人 女凳寺,26歲鸭津。身高 1.58,興趣:讀書肠缨,健身∧媲鳎現(xiàn)在這一階段:待嫁。 我很想念你晒奕,非常想闻书,在這一瞬間名斟。我們一直...
    青春路閱讀 191評論 0 0
  • 總有那么幾首歌的歌詞,在夜深的時(shí)候魄眉,聽的戳你心窩 算了——崔阿扎 你的一句算了砰盐,不代表我會忘了,你不曾在意的坑律,我...
    a葵花的大太陽a閱讀 658評論 0 0
  • 寶劍十 最近一段時(shí)間非常累岩梳,事情一多就會把原來的計(jì)劃打亂,并且身體疲憊很容易導(dǎo)致內(nèi)心煩躁不想再看書了晃择。 抽到寶劍十...
    小小笨鳥可愛多閱讀 159評論 0 0