iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
自我挑戰組

新手初探 Vue系列 第 18

鐵人賽Day19 - 向外傳遞事件 emit

  • 分享至 

  • xImage
  •  

前面講到 props,它是由外而內傳遞資料的一種屬性
不同於 propsemit 是一種事件,而且特性是由內至外
有一種情境是,當我們在 Vuemethods 寫好了一個 function 而元件也想使用時,這時候我們難道還要在元件底下重新寫一次,而不能直接取用外面的 methodsfunction 嗎 ?
所以 emit 就是這樣的功用

首先我們先把基本的情境架構寫出來:

<div id="app">
  <h2>透過 emit 向外傳遞資訊</h2>
  我透過元件儲值了 {{ cash }} 元
  <button>按我</button>
  <button-counter"></button-counter>
  <hr>
  <button-counter></button-counter>
</div>
<script>
Vue.component('buttonCounter', {
  template: `<div>
    <button @click="incrementCounter" class="btn btn-outline-primary">增加 {{ counter }} 元</button>
    <input type="number" class="form-control mt-2" v-model="counter">
  </div>`,
  data: function() {
    return {
      counter: 1
    }
  }
});

var app = new Vue({
  el: '#app',
  data: {
    cash: 300
  }
});
</script>

第一件事情是點擊﹝按我﹞的按鈕會觸發一個事件,然後讓 data 內的 cash +1
這時候我們在 Vue 的應用程式底下新增一個 methods 屬性,並新增一個讓 cash +1function

<script>
Vue.component()

var app = new Vue({
    el: '#app',
    data:{
        cash: 300
    },
    methods: {
        incrementTotal: function(){
            this.cash ++;
        }
    }
});
</script>

然後在﹝按我﹞的按鈕新增一個 click 事件,觸發 function

<div id="app">
  <h2>透過 emit 向外傳遞資訊</h2>
  我透過元件儲值了 {{ cash }} 元
  <button @click="incrementTotal">按我</button>
  <button-counter"></button-counter>
  <hr>
  <button-counter></button-counter>
</div>

這時候 button-counter 元件也想使用 incrementTotal 這個 function 的話,該如何使用 emit 來寫呢?
首先先在 button-counter 元件新增 v-on:自訂義的名字="incrementTotal"

<div id="app">
  <h2>透過 emit 向外傳遞資訊</h2>
  我透過元件儲值了 {{ cash }} 元
  <button @click="incrementTotal">按我</button>
  <button-counter" v-on:increment="incrementTotal"></button-counter>
  <hr>
  <button-counter></button-counter>
</div>

再來,在 button-counter 元件的程式碼內新增一個 methods 屬性,並再自訂義一個 function 使用 emit:

<script>
Vue.component('buttonCounter', {
  template: `<div>
    <button @click="incrementCounter" class="btn btn-outline-primary">增加 {{ counter }} 元</button>
    <input type="number" class="form-control mt-2" v-model="counter">
  </div>`,
  data: function() {
    return {
      counter: 1
    }
  },
  methods: {
      incrementCounter: function(){
          this.$emit('increment');
      }
  }
});

var app = new Vue({
  el: '#app',
  data: {
    cash: 300
  },
  methods: {
      incrementTotal: function(){
          this.cash ++;
      }
  }
});
</script>

到這裡就會發現,我們點擊 button-counter 元件產生的 button 時,也能讓 cash +1

  • emit 事件的命名需為小寫

上一篇
鐵人賽Day18 - props 的型別
下一篇
鐵人賽Day20 - slot 插槽
系列文
新手初探 Vue30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
david828107073
iT邦新手 2 級 ‧ 2020-04-11 20:09:29

Jerry你好,請問html 元件,跟Vue.component內的template是不是有誤啊? 不是應該要一樣嗎?

你好,抱歉這麼久回覆
你是指 HTML 的 button-counter 跟 Vue component 的 buttonCounter 要一樣嗎 ?

我要留言

立即登入留言