前面講到 props,它是由外而內傳遞資料的一種屬性
不同於 props,emit 是一種事件,而且特性是由內至外
有一種情境是,當我們在 Vue 的 methods 寫好了一個 function 而元件也想使用時,這時候我們難道還要在元件底下重新寫一次,而不能直接取用外面的 methods 的 function 嗎 ?
所以 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 +1 的 function
<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 了
Jerry你好,請問html 元件,跟Vue.component內的template是不是有誤啊? 不是應該要一樣嗎?
你好,抱歉這麼久回覆
你是指 HTML 的 button-counter 跟 Vue component 的 buttonCounter 要一樣嗎 ?