1. 程式人生 > >Vue.js的元件(四)父元件與子元件的資料聯絡 之 雙向繫結

Vue.js的元件(四)父元件與子元件的資料聯絡 之 雙向繫結

之前有說到,父元件傳資料到子元件是通過元件的屬性props來實現的,這是一種單向繫結。父可以影響子,子不能影響父。
但是子可以通過自定義事件來讓自己的資料影響到父。
只要把這兩種方法結合起來,就可以實現父與子資料的雙向繫結。

//js
/*為了方便理解過程,把v-model拆分成v-bind,和v-on:input="$event.target.value"*/

Vue.component('my-input',{
    props['myprops'],
    template:'<input v-bind:value="myprops" 
    v-on:input="updateValue($event.target.value)"
>', methods:{ updateValue":function(value){ var myValue = value; //將輸入的文字框內容傳來 this.$emit('shijian',myValue); //自定義事件,並傳參 } } }) var app5 = new Vue({ el:'#app5', data:{ message:'' }, method:{ fatherValue:function(myValue){ this.message = myValue; } } })
//html
<div id="app5">
    //實時顯示message的值
    <p>{{message}}</p> 
    //傳統的雙向繫結
    <input v-model="message"> 
     //父元件與子元件的雙向繫結
    <my-input v-bind:value="message" v-on:shijian="fatherValue"></my-input> 
</div>

梳理一下程式執行的流程。
1、子元件通過v-on:input="updateValue($event.target.value)"

觸發input事件,獲取輸入的值,作為引數傳給子模板的方法updateValue.
2、在updateValue方法裡,定義一個自定義事件,並將獲取的引數暴露給父模板。
3、父模板在前端(html)中使用v-on:shijian="fatherValue" 捕獲子元件提供的引數和自定義事件。並指向一個方法fatherValue .
4、fatherValue 方法使用了來自子元件的引數,並賦給了父元件的變數。從而改變了父元件變數的值。

5、父元件的值的改變導致子元件的屬性props的變化。
6、從而改變了子元件的值。因為子元件通過props綁定了該值。