Vue.js的元件(三)父元件與子元件的資料聯絡 之 子傳父 之 自定義事件
父傳子是單向的,子會因父的改變而改變,但父並不會因子的改變而改變。這是由於Vue.js怕父的資料會被使用者在不知情的情況下改變。
但是,子還是可以繞一個圈,把自己的資料傳給父。
途徑:自定義事件。
在解釋子資料傳給父之前,必須先要對事件有一個瞭解。
所謂事件,就是觸發JS程式碼的“動作”,比如,點選(click),
輸入(input)等等。
Vue.js 使用v-on來
監聽事件,事件名被加在v-on
的後面,以這樣的形式表示:v-on:click = "doFn"
,後面的doFn是事件觸發的方法。
準備好了,開始傳遞資料吧。
首先,先定義一個元件:
//js
Vue.component('my-button' ,{
template:'<button v-on:click="childCount">{{counter}},</button>'
data:function(){ //元件的data只能是以函式的形式存在
return{
counter:0
}
},
methods:{
childCount:function(){
this.counter = this.counter+1;
var value = this.counter;
this .$emit('shijian',value); //value就是子要傳的資料
}
}
})
var app4 = new Vue({
el:'#app4',
data:{
total:0
},
methods:{
faterCount:function(value){ //value就是父元件從子元件拿到的資料
this.total = this.total+value
}
}
})
//html
<div id="app4">
<p>{{total }}</p>
<my-button v-on:shijian="faterCount"></my-button>
</div>
這樣,就完成了一次子資料傳給父。
過程是這樣的:
子元件<button>
被點選了,於是觸發了click事件所指向的childCount
方法。
該方法有兩個行為,一個是自增,另一個使用了$emit
建立一個自定義事件shijian
並且傳了一個引數value
,這個事件和引數可以被父元件拿到。
於是我們看到了v-on:shijian="faterCount"
這行程式碼,其中,faterCount
是Vue的例項app4的方法,他的作用是讓一個變數自增。同時,自定義事件shijian
帶有一個來自子元件的引數,這個引數可以傳給app4的任意方法。
我們可以看到,點選了一次<my-button>
(實際上是點選了他裡面的子元件button
), 自定義事件就會被父捕獲,從而觸發指向的父的方法。
根本思路是:子丟擲了一個自定義事件,並傳參,讓父捕獲,從而執行自己的帶有來自子引數的方法。
好處是:子元件和父元件解耦了。子元件只需要丟擲一個事件,然後完成自己的邏輯就好,無須關心父元件的行為。
當然,你也可以不使用自定義事件,轉而使用原生的事件,比如這裡是click
這也是沒問題的,但是要新增相應的字尾native:
v-on:click.native="faterCount
但是,這樣就如何傳參我還在學習當中。