在 Vue 3 中,v-model
是用于实现双向数据绑定的指令,但在语法和功能上相比 Vue 2 有显著改进。以下是详细用法及示例:
一、基础用法:表单元素
在原生表单元素上,v-model
直接绑定数据:
vue
<template><input v-model="message" /><p>输入的内容是:{{ message }}</p> </template><script setup> import { ref } from 'vue'; const message = ref(''); </script>
二、自定义组件中的 v-model
在自定义组件中,v-model
默认绑定 modelValue
属性和 update:modelValue
事件:
父组件
vue
<template><ChildComponent v-model="parentValue" /> </template><script setup> import { ref } from 'vue'; import ChildComponent from './ChildComponent.vue'; const parentValue = ref('默认值'); </script>
子组件(ChildComponent.vue)
vue
<template><input:value="modelValue"@input="$emit('update:modelValue', $event.target.value)"/> </template><script setup> defineProps(['modelValue']); defineEmits(['update:modelValue']); </script>
三、多个 v-model 绑定
Vue 3 允许在同一组件上绑定多个 v-model
:
父组件
vue
<template><UserForm v-model:firstName="first" v-model:lastName="last" /> </template><script setup> import { ref } from 'vue'; import UserForm from './UserForm.vue'; const first = ref(''); const last = ref(''); </script>
子组件(UserForm.vue)
vue
<template><input :value="firstName" @input="$emit('update:firstName', $event.target.value)" /><input :value="lastName" @input="$emit('update:lastName', $event.target.value)" /> </template><script setup> defineProps(['firstName', 'lastName']); defineEmits(['update:firstName', 'update:lastName']); </script>
四、自定义修饰符
通过 modelModifiers
实现自定义修饰符:
父组件
vue
<template><CustomInput v-model.capitalize="text" /> </template><script setup> import { ref } from 'vue'; import CustomInput from './CustomInput.vue'; const text = ref(''); </script>
子组件(CustomInput.vue)
vue
<template><input:value="modelValue"@input="emitValue($event.target.value)"/> </template><script setup> const props = defineProps({modelValue: String,modelModifiers: { default: () => ({}) } }); const emit = defineEmits(['update:modelValue']);const emitValue = (value) => {if (props.modelModifiers.capitalize) {value = value.charAt(0).toUpperCase() + value.slice(1);}emit('update:modelValue', value); }; </script>
五、关键点总结
-
默认绑定:
v-model
默认绑定modelValue
属性和update:modelValue
事件。 -
多模型绑定:通过
v-model:xxx
语法支持多个双向绑定。 -
修饰符处理:通过
props.modelModifiers
可以访问自定义修饰符。 -
兼容性:Vue 3 的
v-model
移除了.sync
修饰符,统一用v-model:xxx
替代。
通过这些改进,Vue 3 的 v-model
更灵活且语义更清晰,尤其适合复杂组件的数据交互场景。