Vue学习第四周 v-model

本文深入讲解了Vue.js中v-model指令的应用,包括如何在不同表单元素如输入框、单选框、多选框中使用v-model进行双向数据绑定,以及如何通过修饰符提升其功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

v-model

v-model指令用于绑定表单标签的数据。

绑定form表单

表单元素有

  • input输入框
  • radio单选框
  • CheckBox多选框
    ……
<input type="text" v-model="message" placeholder="输入数据">
<div>{{message}}</div>
data:{
	message:''
}

在输入框上输入时,输入的内容渲染到底下的div中。
textarea类型的文本输入框也是相同的效果。

使用v-model后,表羊控件显示的值只依赖所绑定的数据,不再关心初始化时value属性。

单选按钮(radio)

只有一个单选框的时候,可以使用v-bind绑定一个boolean类型的值。

<input type="radio" :checked="picked">

data:{
	picked:false
}

当多个单选框联用的时候,使用v-model搭配value可以实现绑定value的值且单选框之间选择是互斥的。


<input type="radio"  v-model="picked" value='a'>
<input type="radio"  v-model="picked" value='b'>
<input type="radio"  v-model="picked" value='c'>


<div>{{picked}}</div>

data:{
	picked:" "
}

多选框(checkbox)

当多选框单个使用的时候,v-model绑定一个boolean值。
当多个多选框绑定同一个值的时候,data中对应的是一个数组,内容为多选框对应的value值。数据按照勾选的顺序push进入数组。

下拉选择

这个也有单选和多选,但是这种元素基本上没有用过。一般项目里都是用div或者ul、li标签实现下拉选择。

绑定值

单选按钮、复选框和选择列表在单独使用或单选的模式下, v-model绑定的值是一个静态字符串或布尔值, 但在业务中,有时需要绑定一个动态的数据, 这时可以与v-bind搭配来实现。

<input type="radio"  v-model="picked" value='value'>
<p>{{picked}}</p>
<p>{{value}}</p>

data:{
	picked:false,
	value:"abc"
	}

选中时,picked的值会变成value对应的字符串abc

其他的组件也类似。

修饰符

.lazy

用于控制数据同步的时效。v-model默认是同步更新数据的,但是加上修饰符后,只有当输入框失去焦点或者按回车数据才会被更新。

<input type="text" v-model.lazy="message" placeholder="输入数据">

.number

输入框输入的值默认是字符串类型的,加上这个修饰符会将数据转换成数字类型绑定到data中。在数字输入框时会比较有用。(这里可以测试一下输入字符串会怎样)

<input type="number" v-model.number="message" placeholder="输入数据">

.trim

加上修饰符.trim可以自动过滤输入的首尾空格。

<think>嗯,用户想了解Vue3中v-model的双向绑定使用方法,并且需要示例。我之前看过一些关于Vue的组件实现v-model的资料,比如引用[1]和引用[2]。首先,Vue3的v-modelVue2有什么不同呢?对了,Vue2中每个组件只能有一个v-model,而Vue3支持多个,这点需要提到。 用户可能需要基础用法的例子,比如在表单元素上的使用,比如input和checkbox。然后,如何在自定义组件中使用v-model呢?应该要解释modelValue这个默认属性,以及如何通过emit来更新值。比如在子组件里,用defineProps接收modelValue,然后用defineEmits来触发update:modelValue事件,这样父组件的值就能更新了。 接下来是多个v-model的情况,用户可能想知道如何同时绑定多个值,比如在一个表单组件里同时有姓名和年龄。这时候可以用v-model:name和v-model:age的形式,子组件对应不同的prop和emit事件,比如update:name和update:age。 然后是多层封装组件的情况,比如引用[2]中的Dialog组件,里面用了Element UI的el-dialog,这时候如何通过计算属性visible来桥接modelValue。需要说明computed的get和set方法,以及emit的触发时机。 可能还需要提到修饰符的使用,比如.lazy或者自定义修饰符,但用户的问题里没提到,可以暂时不考虑,或者简单带过。 要确保示例代码正确,比如在Vue3中使用<script setup>语法,以及如何定义props和emits。同时,注意在子组件中,v-model绑定到el-dialog的visible变量,而visible通过计算属性来同步父组件的modelValue。 用户可能遇到的问题包括:prop名称不对,emit的事件名称不正确,或者没有正确使用计算属性导致双向绑定失败。这些需要提醒一下。 最后,生成相关问题的时候,要围绕v-model的深层机制、性能优化、对比Vue2的不同点,以及常见问题。比如如何自定义修饰符,或者多个v-model的应用场景。</think>### Vue3中v-model双向绑定使用方法详解 #### 一、基础用法 在Vue3中,`v-model`可通过`modelValue`属性和`update:modelValue`事件实现双向绑定。例如表单元素: ```html <!-- 父组件 --> <template> <ChildComponent v-model="message"/> </template> <script setup> import { ref } from 'vue' const message = ref('Hello') </script> ``` ```html <!-- 子组件 --> <template> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" > </template> <script setup> defineProps(['modelValue']) defineEmits(['update:modelValue']) </script> ``` 此为默认的单属性绑定模式[^1]。 #### 二、多v-model绑定 Vue3支持单个组件绑定多个`v-model`: ```html <!-- 父组件 --> <UserForm v-model:name="userName" v-model:age="userAge" /> ``` ```html <!-- 子组件 --> <template> <input :value="name" @input="$emit('update:name', $event.target.value)"> <input :value="age" @input="$emit('update:age', $event.target.value)"> </template> <script setup> defineProps(['name', 'age']) defineEmits(['update:name', 'update:age']) </script> ``` #### 三、深度组件封装示例 参考多层弹窗组件实现(来自引用[2]): ```html <!-- Dialog.vue --> <template> <el-dialog v-model="visible"> <!-- 内容 --> </el-dialog> </template> <script setup> const props = defineProps({ modelValue: Boolean }) const emit = defineEmits(['update:modelValue']) const visible = computed({ get: () => props.modelValue, set: (val) => emit('update:modelValue', val) }) </script> ``` 通过计算属性桥接第三方组件的双向绑定[^2]。 #### 四、注意事项 1. 默认属性名从`value`改为`modelValue` 2. 自定义属性时需明确指定参数:`v-model:title="pageTitle"` 3. 使用`defineEmits`声明自定义事件 4. 复合组件推荐使用`computed`属性作为中间层
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值