vue3里面的v-model指令

本文介绍了在Vue3中如何使用v-model指令。通过创建一个名为myInput的自定义组件,并在父组件中以v-model='content'进行绑定,子组件内部则通过modelValue来接收传递的值。如果要修改接收的属性名,可以在子组件props中定义不同的key。

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

第一步在components文件夹中 创建一个myInput.vue文件

	<template>
    <div>
        <input type="text" :value="modelValue" @input="iptChange">
    </div>
</template>

<script>
import { ref } from 'vue'
export default {
    props: {
        modelValue: String // 这里要注意 vue2中 v-model在input框中使用其实就是v-bind:value 和 @input事件的组合
        // 但是在3.0中 绑定的值为modelValue 这也就是我这里问题产生的原因
    },
    //setup接收两个参数 第一个参数其实就是本页面中的props属性 不过这个参数不建议解构赋值,因为如果解构赋值会使数据失去响应式
    // 第二个参数是一个上下文对象 暴露了vue2中输入this的属性和方法解构大概是这样的
    <!--{ attrs: (...)
		emit: (...) 这里的emit可以实现在vue2中的 this.$emit的功能 只不过要更新v-model的数据需要使用update 类似于一千的sync修饰符的写法
		expose: exposed => {…}
		slots: (...)
		get attrs: ƒ attrs()
		get emit: emit() { return (event, ...args) => {…}
		get slots: ƒ slots()
		__proto__: Object
	}-->
    setup(props, ctx) {
        function iptChange(e) {
        	// ctx 这里通过emit来修改父组件中v-model的数据
            ctx.emit('update:modelValue', e.target.value)
        }
        return {
            iptChange
        }
    }
}
</script>

<style scoped>
</style>

在需要使用myInput的组件中

<template>
  <div class="home">
  
    <my-input v-model="content"></my-input>
  </div>
</template>

<script>
import myInput from '@/components/myInput'
import { ref, watchEffect } from 'vue'
export default {
  name: 'Home',
  components:{ // 这里使用了vue2的组件注册方法
    myInput
  },
  setup() {
    let content = ref('')
    watchEffect(() => { // watchEffect可以监听数据的变化 和watch的区别是不需要指定属性区监听
      console.log(content.value); 
    })
    return {
      content
    }
  }
}
</script>

补充说明

我们这个例子中使用的是 v-model=“content” 这种方法 在子组件中需要接受的值就是modelValue
如果你想修改一下接受的属性 可以这样写

 <my-input v-model:key="content"></my-input>

这样写的化我们就可以在子组件中的props中接收key属性也就是下面这种写法

<input :value="key"  @input="iptChange"/>
props: {
	key: String
}
// 当然这是修改的数据也就随之改变
setup(props, ctx) {
	 function iptChange(e) {
          ctx.emit('update:key', e.target.value)
      }
      return {
          iptChange
      }
}

<think>嗯,用户想了解Vue3中v-model指令的使用方法和示例。首先,我需要回顾一下Vue3中v-model的变化。Vue2里,v-model默认绑定的是value属性和input事件,但在Vue3中,默认改成了modelValue和update:modelValue。这对父子组件的数据绑定方式有影响,需要重点说明。 然后,用户可能需要知道如何自定义多个v-model绑定,比如在一个子组件里同时绑定多个值。这时候要用到像v-model:title这样的语法,每个绑定对应不同的prop和事件。需要举个例子,比如用户信息表单组件,同时绑定姓名和年龄。 另外,修饰符的处理在Vue3中也有所变化。Vue3允许自定义修饰符,比如.trim、.number这些内置的,还可以通过modelModifiers来添加自定义的。比如,可以创建一个capitalize修饰符,自动将输入的首字母大写。这部分需要代码示例来说明。 还要注意比较Vue2和Vue3的区别,帮助用户迁移或者理解差异。比如在Vue2中,一个组件只能有一个v-model,而Vue3支持多个。同时,默认的prop和事件名称的变化,可能影响现有代码的兼容性,需要使用迁移指南中的方法进行调整。 然后,结合用户提供的引用内容,虽然引用是关于v-text和v-html的,但可能用户之前接触过这些指令,现在想深入v-model。不过引用内容里没有直接提到v-model,所以需要确保回答不依赖这些引用,而是专注于v-model本身的特性。 用户可能的问题还包括如何处理表单元素,比如input、checkbox、select等的v-model绑定。需要给出基本用法的示例,比如文本输入框、单选按钮、下拉菜单等,展示不同的数据类型和事件绑定。 还有,是否需要提到组合式API中的使用?比如在setup函数里使用ref或reactive来绑定v-model。可能用户对Vue3的组合式API比较熟悉,所以可以结合示例展示如何在setup语法中使用。 另外,性能优化方面,虽然v-model本身不会有明显的性能问题,但在处理大型表单或高频更新时,可能需要考虑使用.lazy修饰符来减少更新频率,提升性能。这也是一个值得提及的点。 最后,确保回答结构清晰,分点讲解,每个部分都有代码示例,并且对比Vue2的变化,帮助用户理解升级后的差异。可能还需要总结最佳实践,比如何时使用多个v-model绑定,如何合理使用修饰符等。</think>### Vue3 v-model 指令使用指南 #### 一、基础用法 在Vue3中,`v-model` 实现了**双向数据绑定**,支持表单元素和组件的双向通信。与Vue2相比,语法更灵活且支持多个绑定。 1. **表单元素绑定** ```html <!-- 文本输入框 --> <input v-model="message" type="text"> <p>{{ message }}</p> <!-- 单选按钮 --> <input v-model="selected" type="radio" value="A"> <input v-model="selected" type="radio" value="B"> <!-- 下拉菜单 --> <select v-model="city"> <option value="Beijing">北京</option> <option value="Shanghai">上海</option> </select> ``` 2. **组件绑定** ```html <ChildComponent v-model="parentData" /> ``` 等价于: ```html <ChildComponent :modelValue="parentData" @update:modelValue="newValue => parentData = newValue" /> ``` #### 二、核心升级特性 1. **自定义参数名称** 支持多个独立双向绑定: ```html <UserForm v-model:name="userName" v-model:age="userAge" /> ``` 子组件通过定义: ```javascript props: [&#39;name&#39;, &#39;age&#39;], emits: [&#39;update:name&#39;, &#39;update:age&#39;] ``` 2. **修饰符处理** 内置`.trim`、`.number`、`.lazy`修饰符: ```html <input v-model.trim="text"> ``` 自定义修饰符: ```html <CustomInput v-model.capitalize="value" /> ``` 子组件通过`modelModifiers`检测: ```javascript props: { modelValue: String, modelModifiers: { default: () => ({}) } } ``` #### 三、组合式API示例 ```html <script setup> import { ref } from &#39;vue&#39; const searchText = ref(&#39;&#39;) const isChecked = ref(false) </script> <template> <input v-model="searchText"> <input v-model="isChecked" type="checkbox"> </template> ``` #### 四、与Vue2对比 | 特性 | Vue2 | Vue3 | |--------------|-----------------------|-------------------------------| | 默认绑定 | value + input | modelValue + update:modelValue| | 多绑定 | 不支持 | 支持v-model:arg语法 | | 修饰符 | 仅内置 | 支持自定义修饰符检测 | #### 五、最佳实践 1. 组件间通信优先使用`v-model`而非.sync 2. 复杂表单建议使用`v-model:arg`分离关注点 3. 敏感数据处理应添加校验逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值