Vue父子組件之間的通信方式

在Vue2.X中孝凌,父子組件之間有兩點(diǎn)非常重要的通信原則:

  • 父子組件是單向數(shù)據(jù)流,父組件的狀態(tài)更新蛔琅,子組件中prop的狀態(tài)也會(huì)更新胎许,但是子組件的狀態(tài)變化不會(huì)影響父組件峻呛。在子組件中修改prop的狀態(tài)罗售,會(huì)在console中報(bào)錯(cuò)。關(guān)于單向數(shù)據(jù)流钩述,Vue文檔中是這樣來描述原因的:

    這是為了防止子組件無意間修改了父組件的狀態(tài)寨躁,來避免應(yīng)用的數(shù)據(jù)流變得難以理解。

    有一點(diǎn)應(yīng)該注意牙勘,如果父組件傳遞給子組件的狀態(tài)是對(duì)象或者數(shù)組职恳,因?yàn)閮烧呤前匆脗髦担栽谧咏M件中是可以改變對(duì)象和數(shù)組中的值的方面,同時(shí)也會(huì)影響到父組件的狀態(tài)放钦。

  • 每次父組件狀態(tài)更新時(shí),父組件的所有雙向綁定的model都會(huì)進(jìn)行更新恭金;同時(shí)操禀,子組件的所有 prop 也會(huì)進(jìn)行更新。這里要注意横腿,父組件中更新的狀態(tài)颓屑,必須在父組件中進(jìn)行了雙向綁定,或者傳遞到了子組件耿焊,才會(huì)觸發(fā)父組件的其他狀態(tài)的更新揪惦。

如果希望在子組件中改變父組件的狀態(tài),有兩種方式:

  • 其一是通過事件派發(fā)罗侯,父組件響應(yīng)子組件派發(fā)的事件器腋,由父組件自己改變自己的狀態(tài)
  • 其二是父組件向子組件傳遞數(shù)組或者對(duì)象,在子組件中改變數(shù)組或者對(duì)象的狀態(tài)

因?yàn)閂ue的雙向數(shù)據(jù)綁定是基于Object.defineProperty()來劫持屬性的settergetter方法,由于js的限制纫塌,如果某一個(gè)組件的狀態(tài)是一個(gè)數(shù)組再愈,對(duì)數(shù)組的修改無法通過Object.defineProperty()劫持到,所以無法把狀態(tài)的更新反饋到視圖上护戳。舉一個(gè)例子翎冲,下面是一個(gè)Vue單文件組件,當(dāng)我點(diǎn)擊按鈕的時(shí)候媳荒,視圖無法更新抗悍。

<template>
    <div id="header-ctn">
        hello {{msg[0]}}
        <button @click="change">點(diǎn)我改變組件狀態(tài)</button>
    </div>

</template>
<script>
    export default {
        data () {
            return {
                msg: ['yanbin', 'bluestrings']
            }
        },
        mounted () {
        },
        methods: {
            change () {
               this.msg[0] = '閆斌';//應(yīng)該寫成 this.$set(this.msg, 0, "閆斌");
            }
        }
    }
</script>

所以Vue提供了操作數(shù)組的方法來解決這個(gè)問題:

Vue.set(array, pos, newVal);

但是在很多實(shí)際的case中,即使沒有用Vue.set這個(gè)方法來操作數(shù)組钳枕,我們發(fā)現(xiàn)數(shù)組的變化依然反饋到了視圖上缴渊,這是什么原因呢?這里就要提到剛才說到的一點(diǎn)鱼炒,如果當(dāng)前組件的某一個(gè)狀態(tài)發(fā)生更新衔沼,Vue會(huì)強(qiáng)制自動(dòng)刷新其他綁定的狀態(tài),也就是說組件狀態(tài)反饋到視圖上的這個(gè)操作是Vue自動(dòng)執(zhí)行的昔瞧,而不再是通過Object.defineProperty()來劫持的指蚁。拿剛才的例子修改一下:

<template>
    <div id="header-ctn">
        hello {{msg[0]}}<br/>
        今天{{day}}
        <button @click="change">點(diǎn)我改變組件狀態(tài)</button>
    </div>

</template>
<script>
    export default {
        data () {
            return {
                msg: ['yanbin', 'bluestrings'],
                day: '星期天'
            }
        },
        mounted () {
        },
        methods: {
            change () {
               this.msg[0] = '閆斌';
               this.day = '星期一';
            }
        }
    }
</script>
<style lang="less">

</style>

因?yàn)樾薷牧私M件的狀態(tài)day,所以Vue將msg這個(gè)數(shù)組的更新也反饋到了視圖上自晰。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凝化,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子酬荞,更是在濱河造成了極大的恐慌搓劫,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件混巧,死亡現(xiàn)場(chǎng)離奇詭異枪向,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咧党,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門秘蛔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凿傅,你說我怎么就攤上這事缠犀。” “怎么了聪舒?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵辨液,是天一觀的道長。 經(jīng)常有香客問我箱残,道長滔迈,這世上最難降的妖魔是什么止吁? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮燎悍,結(jié)果婚禮上敬惦,老公的妹妹穿的比我還像新娘。我一直安慰自己谈山,他們只是感情好俄删,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奏路,像睡著了一般畴椰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸽粉,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天斜脂,我揣著相機(jī)與錄音,去河邊找鬼触机。 笑死帚戳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的儡首。 我是一名探鬼主播片任,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼椒舵!你這毒婦竟也來了蚂踊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤笔宿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后棱诱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泼橘,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年迈勋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炬灭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靡菇,死狀恐怖重归,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厦凤,我是刑警寧澤鼻吮,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站较鼓,受9級(jí)特大地震影響椎木,放射性物質(zhì)發(fā)生泄漏违柏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一香椎、第九天 我趴在偏房一處隱蔽的房頂上張望漱竖。 院中可真熱鬧,春花似錦畜伐、人聲如沸晒他。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撞鹉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纵寝,已是汗流浹背掩浙。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鲤脏,地道東北人们颜。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像猎醇,于是被迫代替她去往敵國和親窥突。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容硫嘶,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容阻问。關(guān)于...
    云之外閱讀 5,052評(píng)論 0 29
  • 1.安裝 可以簡單地在頁面引入Vue.js作為獨(dú)立版本,Vue即被注冊(cè)為全局變量沦疾,可以在頁面使用了称近。 如果希望搭建...
    Awey閱讀 11,034評(píng)論 4 129
  • Vue 實(shí)例 屬性和方法 每個(gè) Vue 實(shí)例都會(huì)代理其 data 對(duì)象里所有的屬性:var data = { a:...
    云之外閱讀 2,221評(píng)論 0 6
  • 聽到《野薔薇》這首曲的時(shí)候,是最艱難的一短時(shí)間哮塞。 離開熟悉的環(huán)境刨秆,到陌生的地方,一片空白忆畅,從頭學(xué)起衡未。深夜頂著皎潔的...
    元寶小宇宙閱讀 656評(píng)論 0 0
  • 題目將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90家凯,打印出90=233*5. 程序分析 對(duì)n進(jìn)行分解質(zhì)因數(shù)缓醋,應(yīng)先找到一個(gè)最...
    NoFacePeace閱讀 767評(píng)論 0 0