1. 程式人生 > >Vue.js的元件(三)父元件與子元件的資料聯絡 之 子傳父 之 自定義事件

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

但是,這樣就如何傳參我還在學習當中。