Skip to content

组件中的v-model

Vue2

在表单中,v-model是基于表单控件的value属性和input事件实现的

在组件中,v-model父传子是prop实现,子传父是通过$emit('input')实现的

当组件中使用v-model时,会自动绑定一个@input事件

html
<Child v-model="num"/>

相当于传递了一个名为valueprop,添加了一个input事件

vue
<Child :value="num" @input="(v)=> num = v"/>

那么我们在子组件中就可以使用$emit('input',value)把数据传递给父组件

如下所示

vue
<template>
	<Stars v-model="value"></Stars>
</template>
<script>
    export default {
        components: {
            Stars: () => import('./views/Stars.vue'),
        },
        data() {
            return {
                value: 0,
            }
        },
    }
</script>
vue
<template>
	<div>
		{{ value }}
		<button @click="$emit('input', value + 1)">add</button>
	</div>
</template>

<script>
export default {
	props: {
		value: Number,
	},
}
</script>

Vue3

vue3中在一个组件中使用V-model

vue
<Child v-model="text" />

相当于传递了一个名为modelValueprop,和一个update:modelValue自定义事件

vue
<Child
  :modelValue="text"
  @update:modelValue="$event => (text = $event)"
/>

子组件可以调用update:modelValue方法传值

vue
<input :value="modelValue" @input="emit('update:modelValue', $event.target.value)" />

MIT Licensed