有這樣的需求,父組件綁定v-model,子組件輸入更改父組件v-model綁定的數值。是怎么實現的呢?
實際上v-model 只是語法糖而已。
<input v-model="inputValue" /> <input v-bind:value="inputValue" v-on:input="inputValue= $event.target.value" />
實際上他們是一樣的。
舉個例子,父組件代碼:
<template>
<div id="demo">
<test-model v-model="inputValue"></test-model>
<span>{{inputValue}}</span>
</div>
</template>
<script>
import testModel from 'src/components/testModel'
export default {
data(){
return{
inputValue: "inputValue"
}
},
components: {
testModel,
}
}
</script>
<style lang="scss" scoped>
</style>
子組件代碼如下:
<template>
<span>
<input
ref="input"
:value="value"
@input="$emit('ababab', $event.target.value)"
>
</span>
</template>
<script>
export default {
data(){
return{
}
},
props: ["value"],
model: {
prop: 'value',
//這個事件名可以隨意寫,它實際上是規定了子組件要更新父組件值需要注冊的方法
event: 'ababab'
}
}
</script>
<style lang="scss" scoped>
</style>
以上,就實現了子組件修改父組件v-model綁定的值。
它的原理是
1.展示:父組件v-model,子組件接收一個props值value,將它展示到子組件自己的input上。
2.改變:當子組件自身發生改變時,觸發自身的input方法,然后觸發父組件的事件方法,改變父組件的value,進而改變接收的props,實現自身展示的改變
例子中使用了model,官網是這樣說的,實際上是為了單選框,復選框按鈕等情況的時候,他們的值並不是value,而是checked,這種情況下,就需要寫這個。例如:
model: { prop: 'checked', event: 'change' },

另外還有個
同步修飾符sync
<comp :foo.sync="bar"></comp>
它實際上就是
<comp :foo="bar" @update:foo="val => bar = val"></comp>
所以當子組件需要更新 foo 的值時,它需要顯式地觸發一個更新事件:
this.$emit('update:foo', newValue)
好了,就這么多,記錄一下。
