当前位置: 首页 > news >正文

v-model ,在 vue3和 vue2中的区别

Vue 3 的 v-model 设计更简洁、灵活,减少了配置成本,同时支持更复杂的双向绑定场景,是对 Vue 2 语法的重要改进。

1. 自定义组件的默认 Prop 和事件不同

  • Vue 2

    自定义组件使用 v-model 时,默认绑定 value 作为 prop,input 作为事件。
    即 <Child v-model="parentVal" /> 等价于:

    <Child :value="parentVal" @input="parentVal = $event" />
    
    子组件:
    <template><input :value="value" @input="$emit('input', $event.target.value)"/>
    </template><script>
    export default {name: 'CustomInput',props: {value: {type: String,default: ''}}
    }
    </script>

    若要修改默认的 prop / 事件,需在子组件中通过 model 选项声明:

    // 子组件(Vue 2)
    export default {model: {prop: 'checked', // 自定义 prop 名event: 'change'  // 自定义事件名},props: ['checked']
    }
    
  • Vue 3

    自定义组件使用 v-model 时,默认绑定 modelValue 作为 prop,update:modelValue 作为事件。
    即 <Child v-model="parentVal" /> 等价于:

    <Child :modelValue="parentVal" @update:modelValue="parentVal = $event" 
    />
    

    无需额外配置,直接在子组件中声明 modelValue prop 即可:

    <!-- 子组件 -->
    <script setup>defineProps(['modelValue'])</script>
    

2. 支持多个 v-model 绑定

  • Vue 2
    一个组件只能有一个 v-model,若需多个双向绑定,必须手动绑定多个 prop 和事件:

    <Child :name="userName" @name-change="userName = $event":age="userAge" @age-change="userAge = $event"
    />
    
  • Vue 3
    支持通过参数化 v-model 实现多个双向绑定,语法为 v-model:propName
    例如同时绑定 name 和 age

    <!-- 父组件 -->
    <Child v-model:name="userName" v-model:age="userAge" 
    />
    

    子组件中对应声明 name 和 age prop,并通过 update:name 和 update:age 事件更新:

    <!-- 子组件 -->
    <script setup>
    const props = defineProps(['name', 'age'])
    const emit = defineEmits(['update:name', 'update:age'])
    </script><template><input :value="name" @input="emit('update:name', $event.target.value)"/><input :value="age" @input="emit('update:age', $event.target.value)"/>
    </template>
    

3. 修饰符处理方式不同

  • Vue 2
    自定义组件使用 v-model 修饰符(如 .trim)时,需在子组件中通过 model.modifiers 手动处理,逻辑繁琐:

    // Vue 2 子组件处理修饰符
    export default {model: { prop: 'value', event: 'input' },props: {value: String,modifiers: { default: () => ({}) } // 接收修饰符},methods: {handleInput(val) {if (this.modifiers.trim) {val = val.trim()}this.$emit('input', val)}}
    }
    
  • Vue 3
    修饰符会自动作为 modelModifiers prop 传递(参数化 v-model 则为 propNameModifiers),处理更直接:

    <!-- 父组件使用修饰符 -->
    <Child v-model.uppercase="text" /><!-- 子组件处理修饰符 -->
    <script setup>
    const props = defineProps({modelValue: String,modelModifiers: { default: () => ({}) } // 自动接收修饰符
    })
    const emit = defineEmits(['update:modelValue'])const handleInput = (e) => {let val = e.target.valueif (props.modelModifiers.uppercase) { // 直接使用修饰符val = val.toUpperCase()}emit('update:modelValue', val)
    }
    </script>
    

总结:核心差异对比

特性Vue 2 中的 v-modelVue 3 中的 v-model
默认 prop / 事件value + inputmodelValue + update:modelValue
多个双向绑定不支持,需手动绑定多个 prop / 事件支持 v-model:propName 语法
修饰符处理需通过 model.modifiers 手动处理自动解析为 modelModifiers prop
自定义 prop / 事件名需通过 model 选项配置无需配置,通过 v-model:prop 直接实现

http://www.xdnf.cn/news/1401733.html

相关文章:

  • Linux(1)|入门的开始:Linux基本指令
  • 认识Redis
  • IDM手机端,速度能提高6倍!
  • CPU的MBR寄存器和MDR寄存器
  • 联合体和枚举——嵌入式学习笔记
  • Linux IO复用
  • 优选算法:二分查找
  • 数据库攻略:“CMU 15-445”Project0:C++ Primer(2024 Fall)
  • 《Java反射与动态代理:从原理到实践》
  • SpringBoot整合Actuator实现健康检查
  • MIT 6.5840 (Spring, 2024) 通关指南——Lab 1: MapReduce
  • GitHub 热榜项目 - 日榜(2025-08-30)
  • 基于Ubuntu本地GitLab 搭建 Git 服务器
  • 解构机器学习:如何从零开始设计一个学习系统?
  • 【LeetCode】大厂面试算法真题回忆(121) —— 经典屏保
  • 并发编程——09 CountDownLatch源码分析
  • Spring Boot 后端接收多个文件的方法
  • 项目管理常用的方法有哪些
  • 三菱 PLC的中断指令/中断指针
  • 构建现代化的“历史上的今天“网站:从API到精美UI的全栈实践
  • 北方苍鹰优化算法优化的最小二乘支持向量机NGO-LSSVM多输入多输出回归预测【MATLAB】
  • 2025年06月 Scratch 图形化(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • Robolectric如何启动一个Activity
  • 倾斜摄影是选择RGB图像还是多光谱影响进行操作?
  • Transformer:从入门到精通
  • 嵌入式Linux驱动开发:蜂鸣器驱动
  • stack queue的实现 deque的底层结构 priority_queue的实现
  • 【Java实战⑦】从入门到精通:Java异常处理实战指南
  • 漫谈《数字图像处理》之分水岭分割
  • AUTOSAR进阶图解==>AUTOSAR_TR_ClassicPlatformReleaseOverview