Vue 單文件中的數(shù)據(jù)傳遞

Vue 的單文件組件在使用 Vue 時(shí)非常常用仑撞,所以我們也會(huì)經(jīng)常遇到組件之間需要傳遞數(shù)據(jù)的時(shí)候,大致分為三種情況:

  • 父組件向子組件傳遞數(shù)據(jù)悴品,通過 props 傳遞數(shù)據(jù)贷币。
  • 子組件向父組件傳遞數(shù)據(jù),通過 events 傳遞數(shù)據(jù)握联。
  • 兩個(gè)同級(jí)組件之間傳遞數(shù)據(jù)桦沉,通過 event bus 傳遞數(shù)據(jù)。

文檔中也已經(jīng)詳細(xì)的說明了各種情況下的解決方法金闽,但是現(xiàn)在我在還沒有閱讀多少文檔的情況下纯露,沒有找到有單文件組件方面的具體書寫方式,智商和理解能力有限的情況下代芜,自己嘗試了一下埠褪,最后發(fā)現(xiàn)其實(shí)是一樣的。所以這篇文章其實(shí)是廢話挤庇,但是還是想記錄一下钞速,不枉自己花了一個(gè)多小時(shí)。

準(zhǔn)備工作嫡秕,我新建了 6 個(gè)文件渴语,分別是:

  • index.html
  • main.js 「Vue 實(shí)例」
  • app.vue 「根組件,包含 page 和 footer 組件」
  • page.vue 「msg 的父組件昆咽,footer 的 同級(jí)組件」
  • msg.vue
  • footer.vue

父組件向子組件傳遞數(shù)據(jù)驾凶,通過 props 傳遞數(shù)據(jù)屠升。

這里我以 page 向 msg 傳遞數(shù)據(jù)為例:
page.vue 中

<template>
    <div class="page">
        page
        <msg :love="message"></msg>
    </div>
</template>

<script>
import msg from './msg.vue'

export default {
  name: 'page',
  components: { msg },
  data () {
    return {
      message: 'page-msg'
    }
  }
}
</script>

<style>

</style>

msg.vue 中

<template>
    <div class="msg">
        {{ love }}
  </div>
</template>

<script>
export default {
  name: 'msg',
  props: ['love']
}
</script>

<style>

</style>

這樣以后就會(huì)發(fā)現(xiàn),實(shí)現(xiàn)了把父組件 page 中的數(shù)據(jù)傳遞到子組件 msg 中了狭郑。
另外腹暖,需要強(qiáng)調(diào)一下的是,不要在子組件中修改 props 的值翰萨,當(dāng)然修改是有效的脏答,非常不推薦,而且 Vue 也會(huì)有警告提示亩鬼。正確的做法是 傳遞給 data 中的屬性或者計(jì)算屬性殖告。props 中的值是可以通過 this.love 訪問到的。
特別注意 props 值是引用類型時(shí)的情況雳锋,不可以進(jìn)行簡(jiǎn)單的賦值黄绩,會(huì)影響到父組件,正確的做法是進(jìn)行深拷貝玷过。

子組件向父組件傳遞數(shù)據(jù)爽丹,通過 events 傳遞數(shù)據(jù)。

父組件 page.vue 中

<template>
    <div class="page">
        page
        <msg @passData="getData"></msg>
    </div>
</template>

<script>
import msg from './msg.vue'

export default {
  name: 'page',
  components: { msg },
  data () {
    return {
      message: 'hi'
    }
  },
  methods: {
    getData (data) {
      console.log(data)
    }
  }
}
</script>

<style>

</style>

子組件 msg.vue 中

<template>
    <div class="msg">
    {{ msg }}
    <button @click="pass">點(diǎn)擊</button>
  </div>
</template>

<script>
export default {
  name: 'msg',
  data () {
    return {
        msg: 'hello'
    }
  },
  methods: {
    pass () {
      this.$emit('passData', 'success')
    }
  }
}
</script>

<style>

</style>

點(diǎn)擊后就會(huì)發(fā)現(xiàn) console 出了 'success'辛蚊。

同級(jí)元素之間傳遞數(shù)據(jù)粤蝎,通過 event bus 來傳遞。

需要引入一個(gè) Vue 實(shí)例 作為中央總線袋马。
page 組件中

<template>
    <div class="page">
        page
        <button @click="changeMsg">click</button>
    </div>
</template>

<script>
import msg from './msg.vue'
import { bus } from '../bus.js'

export default {
  name: 'page',
  components: { msg },
  data () {
    return {
      message: 'hi'
    }
  },
  methods: {
    changeMsg () {
      bus.$emit('change', '666')
    }
  }
}
</script>

<style>

</style>

footer 組件中

<template>
    <div class="footer">
        footer
    </div>
</template>

<script>
import { bus } from '../bus.js'

export default {
  name: 'footer',
  data () {
    return {
      msg: 'hi'
    }
  },
  created () {
    bus.$on('change',(data)=>{
      console.log(data)
    })
  }
}
</script>

<style>

</style>

嗯初澎,最后發(fā)現(xiàn)打印出來了 '666',這樣就實(shí)現(xiàn)了虑凛。

最后總結(jié)一下:

  • 父組件向子組件傳遞數(shù)據(jù)碑宴,通過 props 傳遞數(shù)據(jù)。具體做法只需要在父組件中綁定桑谍,在子組件中聲明延柠。
//父組件
<father>
    <child :love="msg"></child>
</father>

//子組件
export default {
    ...
    props: ['love']
}
  • 子組件向父組件傳遞數(shù)據(jù),通過 events 傳遞數(shù)據(jù)霉囚。具體做法時(shí)在父組件中監(jiān)聽捕仔,在子組件中觸發(fā)匕积。
<father>
    <child @passData="getData"></child>
</father>

//子組件
export default {
    ...
   methods: {
       pass () {
            this.$emit('passData', 'hi')
       } 
   }
}
  • 兩個(gè)同級(jí)組件之間傳遞數(shù)據(jù)盈罐,通過 event bus 傳遞數(shù)據(jù)。
import { bus } from './bus.js'//兩個(gè)組件都要引入

//觸發(fā)事件
export default {
    ...
   methods: {
       passData () {
            this.$emit('communicate', 'hello')
       } 
   }
}

//監(jiān)聽事件
export default {
    ...
   mounted: {
        this.$on('communicate', (data) => {
            //...
        })
   }
}

嗯闪唆,廢話較多盅粪,毫無干貨。作為剛進(jìn)入前端行業(yè)悄蕾,剛開始寫博客的新人票顾,缺點(diǎn)和不足麻煩大家指出础浮。轉(zhuǎn)載需注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奠骄,一起剝皮案震驚了整個(gè)濱河市豆同,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌含鳞,老刑警劉巖影锈,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝉绷,居然都是意外死亡鸭廷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門熔吗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辆床,“玉大人,你說我怎么就攤上這事桅狠∷显兀” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵中跌,是天一觀的道長(zhǎng)维雇。 經(jīng)常有香客問我,道長(zhǎng)晒他,這世上最難降的妖魔是什么吱型? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮陨仅,結(jié)果婚禮上津滞,老公的妹妹穿的比我還像新娘。我一直安慰自己灼伤,他們只是感情好触徐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狐赡,像睡著了一般撞鹉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颖侄,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天鸟雏,我揣著相機(jī)與錄音,去河邊找鬼览祖。 笑死孝鹊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的展蒂。 我是一名探鬼主播又活,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼苔咪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了柳骄?” 一聲冷哼從身側(cè)響起团赏,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耐薯,沒想到半個(gè)月后馆里,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡可柿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鸠踪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片复斥。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡营密,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出目锭,到底是詐尸還是另有隱情评汰,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布痢虹,位于F島的核電站被去,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奖唯。R本人自食惡果不足惜惨缆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望丰捷。 院中可真熱鬧坯墨,春花似錦、人聲如沸病往。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽停巷。三九已至耍攘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畔勤,已是汗流浹背蕾各。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留硼被,地道東北人示损。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嚷硫,于是被迫代替她去往敵國(guó)和親检访。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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