基础
父组件:
1 2 3 4 5 6
| <CustomInput v-model="searchText" />
|
子组件:
在引用的子组件中使用 v-model 指令时,子组件的 modelValue prop 默认用于传递输入值,并且会触发名为 update:modelValue 的事件来更新该属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <script setup>
defineProps(['modelValue']);
defineEmits(['update:modelValue']); </script>
<template> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" /> </template>
|
如何更改默认名 modelValue
父组件:
1
| <MyComponent v-model:title="bookTitle" />
|
子组件:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <script setup> defineProps(['title']); defineEmits(['update:title']); </script>
<template> <input type="text" :value="title" @input="$emit('update:title', $event.target.value)" /> </template>
|
自定义 v-model 修饰符
创建一个自定义修饰符 capitalize,自动将 v-model 绑定输入字符串的第一个字母转为大写:
1
| <MyComponent v-model.capitalize="myText" />
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <script setup>
const props = defineProps({ modelValue: String, modelModifiers: { default: () => ({}) }, });
defineEmits(['update:modelValue']);
function emitValue(e) { let value = e.target.value; if(props.modelModifiers.captialize) { value = value.charAt(0).toUpperCase() + value.slice(1); } emit('update:modelValue', value); } </script>
<template> <input type="text" :value="modelValue" @input="emitValue" /> </template>
|
带多个不同参数的 v-model 修饰符
1 2 3 4
| <UserName v-model:first-name.capitalize="first" v-model:last-name.uppercase="last" />
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <script setup> const props = defineProps({ firstName: String, lastName: String, firstNameModifiers: { default: () => ({}) }, lastNameModifiers: { default: () => ({}) }, });
defineEmits(['update:firstName', 'update:lastName']);
console.log(props.firstNameModifiers); console.log(props.lastNameModifiers); </script>
|