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

v-model与.aync的区别

好的,这是一个非常核心的 Vue 2 到 Vue 3 的升级问题。v-model 和 .sync 修饰符都是用于实现组件双向绑定的语法糖,但它们在 Vue 2 和 Vue 3 中有不同的设计和命运。

简单来说,Vue 3 自定义了 v-model 的语法,使其能够完全替代 .sync 修饰符的功能,因此 .sync 在 Vue 3 中被移除了。

下面我们详细对比一下它们的区别和演变过程。


Vue 2 中的 v-model 和 .sync

在 Vue 2 中,它们是两个不同但功能相似的语法糖。

1. v-model (用于组件)
  • 默认行为: 一个组件上只能有一个 v-model

  • 实现原理: 它相当于传递了一个 value prop 并监听了一个 input 事件。

    vue

    <!-- 父组件用法 -->
    <ChildComponent v-model="pageTitle" /><!-- 等价于 -->
    <ChildComponent :value="pageTitle" @input="pageTitle = $event" />
  • 子组件实现: 子组件需要接收 value prop,并在需要更新时触发 input 事件。

    vue

    <!-- 子组件 -->
    <script>
    export default {props: ['value'],methods: {updateValue(newValue) {this.$emit('input', newValue); // 触发 input 事件}}
    }
    </script>
2. .sync 修饰符
  • 解决痛点: 为了解决一个组件需要多个“双向绑定”prop 的情况。

  • 实现原理: 它是一种语法糖,相当于传递了一个 prop 并监听了一个 update:myPropName 事件。

    vue

    <!-- 父组件用法 -->
    <ChildComponent :title.sync="pageTitle" /><!-- 等价于 -->
    <ChildComponent :title="pageTitle" @update:title="pageTitle = $event" />
  • 子组件实现: 子组件需要接收相应的 prop(如 title),并在需要更新时触发 update:title 事件。

    vue

    <!-- 子组件 -->
    <script>
    export default {props: ['title'],methods: {updateValue(newValue) {this.$emit('update:title', newValue); // 注意事件名格式}}
    }
    </script>
Vue 2 中的对比总结
特性v-model.sync 修饰符
数量限制一个组件上只能有一个一个组件上可以多个
底层实现:value + @input:propName + @update:propName
适用场景用于最重要的、唯一的一个双向绑定值(如输入框的 value)用于其他需要双向绑定的属性(如对话框的 visible 状态)

Vue 3 中的演变:v-model 统一天下

Vue 3 对 v-model 进行了重大改进,使其具备了 .sync 的所有能力,因此 .sync 修饰符被正式废弃和移除了

Vue 3 的 v-model
  • 突破数量限制: 现在一个组件上可以绑定多个 v-model

  • 更改默认实现: 默认不再使用 value 和 input

    • PropmodelValue

    • 事件update:modelValue

  • 支持参数: 可以通过参数来指定要绑定的 prop 名,从而实现多个双向绑定。

新旧用法对比
目的Vue 2 写法Vue 3 等价写法
单个双向绑定<Child v-model="value"/><Child v-model="value"/>
(但内部是 modelValue 和 update:modelValue)
多个双向绑定<Child :title.sync="t" :content.sync="c"/><Child v-model:title="t" v-model:content="c"/>
示例:Vue 3 中实现多个 v-model

父组件

vue

<template><!-- 绑定两个 v-model --><ChildComponent v-model="pageTitle" v-model:subtitle="subTitle" />
</template><script setup>
import { ref } from 'vue';
const pageTitle = ref('Main Title');
const subTitle = ref('Sub Title');
</script>

子组件 (ChildComponent.vue)

vue

<template><input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"/><input :value="subtitle" @input="$emit('update:subtitle', $event.target.value)"/>
</template><script setup>
// 定义 props
defineProps(['modelValue', 'subtitle']);
// 定义事件
defineEmits(['update:modelValue', 'update:subtitle']);
</script>

核心区别与结论

方面.sync 修饰符 (Vue 2)v-model (Vue 3)
版本状态Vue 2 特有,已在 Vue 3 中废弃Vue 2 和 Vue 3 均支持,但实现不同
数量限制可多个Vue 2:一个
Vue 3:可多个
语法:title.sync="val"v-model:title="val"
底层事件名update:titleupdate:title (Vue 3 带参数时)
设计理念作为 v-model 的补充一统天下,成为双向绑定的唯一标准语法

最终结论

  1. .sync 是 Vue 2 的历史产物,用于解决当时 v-model 只能绑定一个值的问题。

  2. Vue 3 通过赋予 v-model 绑定参数的能力(v-model:arg),完美地解决了多个双向绑定的需求,使得 .sync 失去了存在的必要。

  3. 因此,当你学习 Vue 3 时,可以完全忘记 .sync 修饰符。所有需要双向绑定的地方,都使用 v-model。如果需要绑定多个,就加上参数,如 v-model:visiblev-model:title 等。

  4. 如果你在维护一个 Vue 2 项目,那么需要同时理解 v-model 和 .sync 的用法。如果要将 Vue 2 项目升级到 Vue 3,一个重要的步骤就是将所有的 .sync 用法替换为 v-model:arg


文章转载自:

http://Q5zl7Y7I.rnfwx.cn
http://Ij9Ditx0.rnfwx.cn
http://ApeUtnKz.rnfwx.cn
http://mDnGb93h.rnfwx.cn
http://BinooPcf.rnfwx.cn
http://Vas5i7zA.rnfwx.cn
http://Pkbup1sX.rnfwx.cn
http://cxvK3N3D.rnfwx.cn
http://6m5G3wje.rnfwx.cn
http://HaRwSDfB.rnfwx.cn
http://NXUVxt2p.rnfwx.cn
http://lyjlbIB2.rnfwx.cn
http://AdM2OrQX.rnfwx.cn
http://jzbKbtaE.rnfwx.cn
http://wvhYQ563.rnfwx.cn
http://tK66FUOR.rnfwx.cn
http://tzPzau8n.rnfwx.cn
http://KEJLa6mb.rnfwx.cn
http://L2Fvvbt8.rnfwx.cn
http://nMmYM0uw.rnfwx.cn
http://HaDxgsjt.rnfwx.cn
http://p6eMhB9U.rnfwx.cn
http://EUaR6y34.rnfwx.cn
http://DuecUCLF.rnfwx.cn
http://kmCinbl0.rnfwx.cn
http://Za5XEHBC.rnfwx.cn
http://RQaPkVel.rnfwx.cn
http://QKxupMrc.rnfwx.cn
http://zgXtgN3E.rnfwx.cn
http://QX6829XF.rnfwx.cn
http://www.dtcms.com/a/383268.html

相关文章:

  • 淘宝返利app的前端性能优化:从资源加载到首屏渲染的全链路优化
  • 【LeetCode】38. 外观数列
  • ZYNQ7020 Bank划分
  • 【2025】Office核心组件Microsoft word,Excel,PowerPoint详细使用指南
  • ARM编译器的__inline和 __forceinline
  • Zookeeper介绍与部署(Linux)
  • [硬件电路-216]:电场是什么?只有正电荷或只有负电荷,能产生电场吗?
  • pthread_mutex_lock函数深度解析
  • 【记录】初赛复习 Day1
  • 深入理解跳表(Skip List):原理、实现与应用
  • SciKit-Learn 全面分析 20newsgroups 新闻组文本数据集(文本分类)
  • 使用 Neo4j 和 Ollama 在本地构建知识图谱
  • 【愚公系列】《人工智能70年》018-语音识别的历史性突破(剑桥语音的黄金十年)
  • Debezium日常分享系列之:MongoDB 新文档状态提取
  • Linux 日志分析:用 ELK 搭建个人运维监控平台
  • docker内如何用ollama启动大模型
  • Flask学习笔记(二)--路由和变量
  • FlashAttention(V3)深度解析:从原理到工程实现-Hopper架构下的注意力机制优化革命
  • 一文入门:机器学习
  • Uniswap:DeFi领域的革命性交易协议
  • 3. 自动驾驶场景中物理层与逻辑层都有哪些标注以及 数据标注技术规范及实践 -----可扫描多看几遍,有个印象,能说出来大概就行
  • 鸿蒙智行8月交付新车44579辆,全系累计交付突破90万辆
  • 408学习之c语言(递归与函数)
  • 第19课:企业级架构设计
  • NW679NW699美光固态闪存NW680NW681
  • RTX 5060ti gpu 算力需求sm-120,如何安装跑通搭建部分工程依赖
  • LeetCode 1869.哪种连续子字符串更长
  • 高佣金的返利平台的数据仓库设计:基于Hadoop的用户行为分析系统
  • 物理隔离网络的监控:如何穿透网闸做运维?
  • 知识图谱网页版可视化可移动代码