v-model的使用


v-model可以实现双向数据绑定
v-model即可以作用于表单元素,又可以作用于自定义组件,无论是哪种情况,它都是一个语法糖,最终会生成一个属性和一个事件

在表单中使用

会根据作用的表单元素类型而生成合适的属性和事件
例如作用于普通文本框会生成value属性和input事件
作用于单选框或者多选框时,会生成checked属性和change事件

<input type="text" v-model="msg" />
<!-- 等效于 -->
<input type="text" :value="msg" 
	@input="msg=$event.target.value" />
<p>{{ msg }}</p>

v-model的本质是一个语法糖
input元素本身有个oninput事件,这个是HTML5新增的,类似于onchange,每当输入框内容变化的时候,就会触发oninput,把最新的value传给msg
所以可以得出一个结论,在给<input />元素添加v-model属性时,默认会把value作为元素的属性,然后把"input"事件作为实时传递value的触发事件

在组件中使用v-model

组件中的v-model生效原则
接收一个value属性
在有新的value上触发input事件
父组件在子组件上使用v-model,默认会用value的prop来接收父组件v-model绑定的值,
然后子组件通过input事件将更新后的值传递给父组件
父组件

<template>
	<child v-model="number"></child>
</template>

<script>
export default {
	data(){
		return{
			number:100,
		}
	}
};
</script>

子组件

<template>
	<input type="text" :value="value" @input="$emit("input",$event.target.value)">
</template>

<script>
export default {
  data() {
    return {
      props:["value"]
    };
  },
};
</script>

v-model修饰符

.lazy

在一些特殊的需求和场景下,你可能希望数据同步不是实时同步而是在触发 change 事件的时候进行数据同步,那么你可以添加 lazy 修饰符进行处理,使用的示例如下:

<!-- 在“change”时而非“input”时更新 -->
<input v-model.lazy="msg" >

.number

在表单中处理输入验证必须是数字时,希望可以将用户输入的值自动转换成数字类型,那你可以在 v-model 上加上 number 修饰符进行处理。

<!-- 将输入的值自动转换成数字类型 -->
<input v-model.number="age" type="number">

.trim

对于用户在表单标签中输入的字符串,想去除首尾的空白字符,就可以用 trim 修饰符。

<!-- 去除输入值的首尾空白字符 -->
<input v-model.trim="msg">
### Vue 3 中 `v-model` 指令的使用方法与示例 `v-model` 是 Vue 提供的一个语法糖,用于在表单控件和组件之间实现双向数据绑定。在 Vue 3 中,`v-model` 的使用方式更加灵活,尤其在组合式 API 和自定义组件中得到了增强。以下将详细介绍其基本用法、在表单控件中的应用、以及如何在自定义组件中实现 `v-model`。 #### 基本用法 在 Vue 3 中,`v-model` 可以直接用于 HTML 表单元素,如 `<input>`、`<textarea>`、`<select>` 等,实现数据的双向绑定。例如,绑定一个文本输入框: ```vue <template> <input v-model="message" /> <p>输入的内容是:{{ message }}</p> </template> <script setup> import { ref } from 'vue'; const message = ref(''); </script> ``` 上述代码中,`message` 是一个响应式变量,通过 `v-model` 与 `<input>` 元素进行双向绑定。用户在输入框中输入的内容会自动更新 `message` 的值,并且 `message` 的变化也会反映在输入框中 [^4]。 #### 在表单控件中的应用 `v-model` 不仅适用于文本输入框,还可以用于复选框、单选按钮、下拉选择框等表单控件。 ##### 复选框 ```vue <template> <input type="checkbox" v-model="isChecked" /> <p>是否选中:{{ isChecked }}</p> </template> <script setup> import { ref } from 'vue'; const isChecked = ref(false); </script> ``` 在复选框中,`v-model` 绑定的是布尔值,选中时为 `true`,未选中时为 `false` [^3]。 ##### 单选按钮 ```vue <template> <input type="radio" v-model="selectedOption" value="option1" /> 选项1 <input type="radio" v-model="selectedOption" value="option2" /> 选项2 <p>选中的选项是:{{ selectedOption }}</p> </template> <script setup> import { ref } from 'vue'; const selectedOption = ref(''); </script> ``` 单选按钮组中,`v-model` 绑定的是选中项的 `value` 值 [^3]。 ##### 下拉选择框 ```vue <template> <select v-model="selectedOption"> <option value="option1">选项1</option> <option value="option2">选项2</option> </select> <p>选中的选项是:{{ selectedOption }}</p> </template> <script setup> import { ref } from 'vue'; const selectedOption = ref(''); </script> ``` `v-model` 在 `<select>` 元素中同样绑定的是选中项的 `value` 值 [^3]。 #### 自定义组件中的 `v-model` 在 Vue 3 中,`v-model` 也可以用于自定义组件,实现组件内部状态与父组件之间的双向绑定。默认情况下,`v-model` 使用 `modelValue` 作为 prop,并通过 `update:modelValue` 事件进行更新。 ##### 示例:自定义输入组件 ```vue <!-- ChildComponent.vue --> <template> <input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" /> </template> <script setup> const props = defineProps(['modelValue']); const emit = defineEmits(['update:modelValue']); </script> ``` ```vue <!-- ParentComponent.vue --> <template> <ChildComponent v-model="message" /> <p>输入的内容是:{{ message }}</p> </template> <script setup> import { ref } from 'vue'; import ChildComponent from './ChildComponent.vue'; const message = ref(''); </script> ``` 在自定义组件中,`modelValue` 是从父组件传递过来的值,而 `update:modelValue` 事件用于通知父组件更新 [^2]。 #### 使用 `v-model` 实现动态表单 `v-model` 还可以与其他指令(如 `v-show`)结合使用,实现动态表单交互。例如,在用户选择订购饮料后显示可供选择的饮料列表: ```vue <template> <select v-model="selectedCategory"> <option value="">请选择</option> <option value="coffee">咖啡</option> <option value="tea">茶</option> </select> <div v-show="selectedCategory === 'coffee'"> <h4>咖啡种类:</h4> <ul> <li v-for="item in coffeeOptions" :key="item">{{ item }}</li> </ul> </div> <div v-show="selectedCategory === 'tea'"> <h4>茶种类:</h4> <ul> <li v-for="item in teaOptions" :key="item">{{ item }}</li> </ul> </div> </template> <script setup> import { ref } from 'vue'; const selectedCategory = ref(''); const coffeeOptions = ['拿铁', '卡布奇诺', '美式']; const teaOptions = ['绿茶', '红茶', '乌龙茶']; </script> ``` 在该示例中,`v-model` 用于绑定用户选择的类别,`v-show` 根据选择的类别动态显示对应的饮料列表 [^5]。 #### Vue 2 与 Vue 3 的 `v-model` 差异 Vue 3 的 `v-model` 相比 Vue 2 更加灵活,尤其是在组合式 API 中。Vue 2 中 `v-model` 依赖 `this` 上下文,而 Vue 3 则通过 `modelValue` 和 `update:modelValue` 实现更清晰的状态管理。此外,Vue 3 支持在同一个组件上使用多个 `v-model`,通过 `v-model:name` 的方式实现多个双向绑定 [^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值