在父子組件的通信中,為了防止子組件不小心改變父組件的狀態,而導致數據流的冗余復雜、不易理解,所以vue規定了單向數據流,父組件的prop更新在子組件中會同時響應,而反過來則不能。但是我們依然可以通過v-model來實現數據的雙向綁定。
v-model一般用在表單綁定數據,如:
<input v-model="value">
等同於:
<input
:value="inputValue"
@input="value => {inputValue=value}">
因此,在自定義組件中使用 v-model 指令,那么就意味着:
- 接收一個
valueprop - 觸發
input事件,並傳入新值
利用 $emit 觸發 input 事件:
this.$emit('input', value);
第一種:
子組件
1 <template> 2 <div> 3 // 使用時有v-model屬性,value默認值‘child’ 不會被渲染,而是v-model綁定的parent值被渲染,這兒value會被賦值為v-model綁定的parent的值。 4 <p>{{value}}</p> 5 <button @click="changeValue">在子組件內修改v-model值,並且動態響應給父組件</button> 6 </div> 7 </template> 8 <script> 9 export default { 10 props: { 11 value: { // 必須要使用value 12 default: 'child', 13 }, 14 }, 15 methods: { 16 changeValue () { 17 let newValue = '2' 18 this.$emit('input',newValue) // 這兒必須用input 發送數據,發送的數據會被父級v-model=“parent”接收到,再被value=parent傳回來。 19 } 20 } 21 }
該方法,一定要注意,props的值一定要定義為‘value’,不然不起作用,提交給父組件的事件名為‘input’
第二種(官網推薦的方法)
子組件
1 <template> 2 <div> 3 <p>{{parentProp}}</p> 4 <button @click="changeValue">在子組件內修改prop值</button> 5 </ul> 6 </div> 7 </template> 8 9 <script> 10 export default { 11 model: { // 使用model, 這兒2個屬性,prop屬性說,我要將msg作為該組件被使用時(此處為aa組件被父組件調用)v-model能取到的值,event說,我emit ‘cc’ 的時候,參數的值就是父組件v-model收到的值。 12 prop: 'parentProp', 13 event: 'change' 14 }, 15 props: { 16 msg: '' 17 }, 18 methods: { 19 changeValue () { 20 this.$emit('change', this.parentProp++) 21 } 22 } 23 } 24 </script>
在父組件引用:
<child v-model="parent"></child>
總結:當然實現父子組件的雙向綁定,還有其他方案;
例如:通過vuex狀態管理、使用.sync修飾符等。
如有錯誤,請友情指出,好人一生平安~~
