iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
2
自我挑戰組

【I Love Vue】 30天愛上 Vue系列 第 15

【I Love Vue 】 Day 15Vue Component(三) - 組件的溝通(子傳父)

  • 分享至 

  • xImage
  •  

上一篇介紹完如何往內層傳送資料,
看完往內層傳資料,我們再來看看由內層往外層傳送資料。


子傳父

在Vue中一般來說只有提供向內層傳送資料的功能。
不過因應各種開發情況,我們可能會用到向外傳送資料的情形。
為此我們可能會透過使用 emit,或是自製 event bus,甚至使用到vuex套件....等方式,
讓我們可以從內層向外傳遞資料。
(這邊僅介紹 emit)

emit

emit,原本是用來提供讓我們自訂觸發事件(Custom Events)的函式。
我們可透過這個函式來幫我們實現子傳父的功能

  1. components內新增一個檔案 childComponent2.vue
  2. childComponent2.vue輸入下方程式碼
<template>
    <div>
        <button @click='ClickEvent'> {{title}} </button>
    </div>
</template>
    
<script>
export default {
    name:'childComponent2',
    data: function () {
        return {
        title: "Emit",
        count: 0,
        }
    },
    methods: {
        ClickEvent:function(){
            this.count ++;//count 計數 累加一
            this.$emit('childemit',this.count)//觸發 childEmit這個事件,帶參數count
        }
    },
    

}
</script>

<style>
</style>
  1. 修改`App.vue

template:

<template>
  <img alt="Vue logo" src="./assets/logo.png">
  <child2 @childemit='EmitListener'></child2>
</template> 

script:

<script>
import childComponent2 from './components/childComponent2'
export default {
  name: 'App',
  components: {
    child2:childComponent2,
  },
  methods:{
    EmitListener:function(data){
      alert(data)
    }
  }
  
}
</script>
  1. 執行 npm run serve

https://ithelp.ithome.com.tw/upload/images/20200929/20115941Zpct4HUUN9.jpg
當按下Emit的時候會觸發click事件,然後執行ClckEvent這個function,
並且透過 this.$emit() 連帶觸發childemit這個事件。

https://ithelp.ithome.com.tw/upload/images/20200929/20115941qLndoOIXP6.jpg
當監聽到 childemit這個事件被觸發之後,然後執行EmitListener這個function,
在畫面上跳出警示(alert),顯示data的資料(與childComponent2裡面的count資料相同)

這樣就能達到 子組件 -> 父組件 的資料傳遞。


結語

因為這次運作的流程比較複雜一點,所以做了個程式的流程圖,
希望大家能更容易了解他運作的原理。

我們會在下一篇介紹到這篇所提到 event bus 和 如何達到資料的雙向綁定。


上一篇
【I Love Vue 】 Day 14 Vue Component(二) - 組件的溝通(父傳子)
下一篇
【I Love Vue 】 Day 16Vue Component(四) - 組件的溝通(雙向溝通)
系列文
【I Love Vue】 30天愛上 Vue30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言