如何從元件傳遞資料到根實例?本篇筆記告訴你~
$emit 向外層傳遞事件
$emit
除了可以傳遞事件外,也可以傳遞參數。
$emit() 基本用法:
在元件標籤上設定 v-on:自訂事件名 = "Vue 根實例的 method"
,這表示元件內的事件發生後將會觸發 Vue 根實例的方法,內層元件就是透過這種方式傳送到外層。
1 2
| <button-counter v-on:increment="incrementTotal"></button-counter>
|
元件的 template
中,要在 HTML 元素上綁定一個事件,以下面這個範例為例:發生 click
事件後要觸發 incrementCounter
函式,而這個函式是元件中的一個 method
。在這個 method
裡面要用 $emit
觸發與 Vue 根實例綁定的事件,所以 $emit()
小括號內要寫入的是在元件標籤上設定的自訂事件名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Vue.component('buttonCounter', { template:` <div> <button @click="incrementCounter">增加 {{ counter }} 元</button> <input type="number" v-model="counter"> </div>`, data: function() { return { counter: 1 } }, methods: { incrementCounter: function(){ this.$emit('increment'); } } });
|
Vue 根實例中的 incrementTotal
方法,就是剛剛在元件上與自訂事件綁定的函式。
1 2 3 4 5 6 7 8 9 10 11 12 13
| var app = new Vue({ el: '#app', data: { cash: 300 }, methods: { incrementTotal: function() { this.cash++; } } });
|
使用 $emit() 與其參數:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| Vue.component('buttonCouter', { methods: { incrementCounter: function () { this.$emit('increment', Number(this.counter)); } } });
var app = new Vue({ methods: { incrementTotal: function(newCount) { this.cash = this.cash + newCount; } } });
|
結語
$emit()
第一個參數是自訂事件名稱,當元件發生一個事件時,把這個事件傳到根實例的 methods
去進行運算。
$emit()
第二個參數是元件的資料屬性,把專屬於這個元件的資料傳到根實例的 methods
去進行運算。
- 元件模板中所綁定的,都是該元件獨有的資料、
methods
。
- HTML 中的元件標籤則是元件資料與根實例資料互相綁定的場所。