在 Vue.js 中,v-model 是一個語法糖,它實際上是 :value 和 @input 事件的組合。
當你使用 v-model 綁定一個組件時,默認情況下,組件會通過 props 接收 value 這個 prop,
并通過觸發 input 事件來更新父組件中的數據。
1、v-model 和 props 的關系
當你使用 <RichTextEditor v-model="msg"> 時,RichTextEditor 組件內部確實會通過 props 接收 value(默認的 prop 名稱是 value,除非你自定義了 model 選項)。
例如,RichTextEditor 組件內部可能有這樣的代碼:
export default {props: ['value'], // 接收父組件通過 v-model 傳遞的值methods: {updateValue(newValue) {this.$emit('input', newValue); // 觸發 input 事件,更新父組件的 msg}}
}
2、自定義 v-model 的 prop 和事件
如果你希望 v-model 使用不同的 prop 或事件名,可以在組件中通過 model 選項自定義:
export default {model: {prop: 'text', // 將 prop 名稱從默認的 value 改為 textevent: 'change' // 將事件名稱從默認的 input 改為 change},props: ['text'], // 現在通過 props.text 接收數據methods: {updateValue(newValue) {this.$emit('change', newValue); // 觸發 change 事件}}
}
父組件仍然可以使用?v-model
,但內部會使用自定義的 prop 和事件:
<RichTextEditor v-model="msg"></RichTextEditor>
3、直接通過 props 接收數據
如果你不使用 v-model,而是直接通過 props 傳遞數據,可以這樣寫:
<RichTextEditor :value="msg" @input="msg = $event"></RichTextEditor>
這和 v-model 的效果是完全一樣的,只是寫法更顯式。
4、總結
v-model 的數據在組件內部是通過 props 接收的(默認是 value,除非自定義)。
組件通過 $emit('input', newValue)(或自定義事件)通知父組件更新數據。
你可以直接通過 props 接收數據,但 v-model 只是語法糖,底層仍然是 props 和 events 的機制。
如果你的 RichTextEditor 組件需要同時支持 v-model 和手動 props 綁定,確保內部邏輯正確處理 value(或自定義 prop)和事件即可。