今天介紹一些 v-model 在 v3 一些改動以及新特性
這個範例只有在 Vue 3 的文件中出現
不過看起來 Vue 2 也可以用一樣的概念來處理相同邏輯。
app.component('custom-input', {
props: ['modelValue'],
template: `
<input v-model="value">
`,
computed: {
value: {
get() {
return this.modelValue
},
set(value) {
this.$emit('update:modelValue', value)
}
}
}
})
Vue 3 前 v-model 是以下的簡寫
<MyInput :value="name" @input="newValue => this.name = name" />
Vue 3 後 v-model 是以下的簡寫
<MyInput :modelValue="name" @update:modelValue="newValue => this.name = name" />
Vue 2
<MyComponent :title.sync="pageTitle" />
Vue 3
<MyComponent v-model:title="pageTitle" />
雖說帶 sync
的 Prop 感覺跟 v-model 是同一個東西,所以我平常沒在用,
但也因為現在這個改動,使得原件可以同時綁定多個 v-model,如下:
<ChildComponent v-model:title="pageTitle" v-model:content="pageContent" />
<!-- would be shorthand for: -->
<ChildComponent
:title="pageTitle"
@update:title="pageTitle = $event"
:content="pageContent"
@update:content="pageContent = $event"
/>
請問一下,在Vue3之下
<MyInput :modelValue="name" @update:modelValue="newValue => this.name = name" />
modelValue 是否不能使用,要改成model-value?我自行測試時,會出現
[Vue warn]: Event "update:modelvalue" is emitted in component Child but the handler is registered for "update:modelValue". Note that HTML attributes are case-insensitive and you cannot use v-on to listen to camelCase events when using in-DOM templates.
如Vue2官網所說,改成model-value後確實就能正常運行,不過Vue3官網好像沒說不行!!