自定义组件 v-model
在自定义组件使用,
v-model
会默认被分解成:modelValue="xxx" @update:modelValue="newVal => xxx = newVal"
AND
在原生组件中,
v-model
会被分解成:value="xxx" @input="xxx = $event.target.value"
⛵️ For Example
自定义组件
// 父组件
<Father v-model="textValue" />
相当于
<Father :modelValue="textValue" @update:modelValue="textValue = $event.target.value" />
// 子组件
<div>
<input :value="textValue" @input="handleInput">{{ textValue }}</input>
</div>
<script setup>
defineProps({ textValue: String })
const emits = defineEmit(['update:modelValue'])
const handleInput = (e) => {
emits('update:modelValue', e.target.value)
}
</script>
自定义组件 – 在本身具有v-model的组件中
// 父组件 -- 方案一
<Father v-model="textValue" />
// 子组件
<div>
<van-slider :modelValue="modelValue" @change="handleChange">{{ textValue }}</van-slider>
</div>
<script setup>
const props = defineProps({ modelValue: String })
const emits = defineEmit(['update:modelValue'])
const handleChange = (e) => {
emits('update:modelValue', e)
}
</script>
// 父组件 -- 方案二
<Father v-model="textValue" />
// 子组件
<div>
<van-slider v-model="value">{{ textValue }}</van-slider>
</div>
<script setup>
const props = defineProps({ modelValue: String })
const emits = defineEmit(['update:modelValue'])
const value = computed({
get() {
return props.modelValue
},
set(value) {
emits('update:modelValue', value)
}
})
</script>
// 父组件 -- 方案三
// 其实就是用.sync省略v-model的第二步(不好用)
<Father :modelValue.sync="textValue" />
// 子组件
<div>
<van-slider :modelValue="modelValue" @change="handleChange">{{ textValue }}</van-slider>
</div>
<script setup>
const props = defineProps({ modelValue: String })
const emits = defineEmit(['update:modelValue'])
const handleChange = (e) => {
emits('update:modelValue', e)
}
</script>
vant
组件中的v-model
,会被分解成:modelValue="modelValue" @update:modelValue="val => modelValue = val"
,这里面的变量modelValue
是固定的,不能随便定义,否则失效,且:modelValue
也是固定值,如果要封装vant
组件并使用v-model
,emit
中传递的函数名为update:modelValue
,因为父组件的v-model
拆分开的函数名为update:modelValue
,并且也是固定值。
官方文档有更详细的说明
🌮 还有其他方法可以在评论区补充哦~