vue3和vue2 语法差异之v-model详细说明

news2024/12/25 10:02:59

文章目录

  • 0.前言
  • 1.参考文档
  • 2.详细说明
    • 介绍
    • 2.x 语法
      • 使用 `v-bind.sync`
    • 3.x 语法
      • `v-model` 参数
      • `v-model` 修饰符
    • 迁移策略
  • 3.总结

在这里插入图片描述

0.前言

在 Vue 3 中,v-model 的使用方式与 Vue 2 有一些差异。下面是 Vue 3 中 v-model 的一些主要变化:

  1. 组件上的默认绑定:
    在 Vue 2 中,使用 v-model 绑定自定义组件时,默认情况下会将 value 作为 prop,将 input 事件作为更新模型的事件。而在 Vue 3 中,默认情况下将使用名为 modelValue 的 prop 和 update:modelValue 事件来实现双向绑定。这可以通过在组件内部使用 emits 选项来自定义事件名。

  2. 可以自定义 v-model 的 prop 名称:
    在 Vue 3 中,我们可以通过向 v-model 添加参数来自定义 prop 的名称。例如,可以使用 v-model:customProp 来将 customProp 作为 prop 名称。这使得在自定义组件中更灵活地控制 v-model 的绑定。

  3. 移除了 .sync 修饰符:
    在 Vue 2 中,可以使用 .sync 修饰符来实现双向绑定,即将属性的更新反映到父组件。然而,在 Vue 3 中,.sync 修饰符已被移除。相反,你可以使用参数来实现类似的双向绑定的效果。例如,v-model:propertyName 等同于 :modelValue="propertyName" @update:modelValue="propertyName = $event"

  4. 多个 v-model 绑定:
    在 Vue 2 中,一个组件只能有一个 v-model 绑定。而在 Vue 3 中,你可以在同一个组件上使用多个 v-model 绑定。你可以为每个 v-model 绑定指定不同的 prop 名称和事件名称,使得组件能够处理多个独立的双向绑定。

1.参考文档

Vue 2文档:

  • 官方文档:Vue.js Guide - Global API
  • 官方文档:Vue.js API Reference - Global
  • Vue Mastery课程:Vue.js Essentials - Global API

Vue 3文档:

  • 官方文档:Vue.js Guide - Application Composition
  • 官方文档:Vue.js API Reference - createApp
  • Vue Mastery课程:Vue 3 Fundamentals - Application Instance

2.详细说明

介绍

在 Vue 2.0 发布后,开发者使用 v-model 指令时必须使用名为 value 的 prop。如果开发者出于不同的目的需要使用其他的 prop,他们就不得不使用 v-bind.sync。此外,由于v-modelvalue 之间的这种硬编码关系的原因,产生了如何处理原生元素和自定义元素的问题。

在 Vue 2.2 中,我们引入了 model 组件选项,允许组件自定义用于 v-model 的 prop 和事件。但是,这仍然只允许在组件上使用一个 v-model

在 Vue 3 中,双向数据绑定的 API 已经标准化,以减少开发者在使用 v-model 指令时的混淆,并且更加灵活。

2.x 语法

在 2.x 中,在组件上使用 v-model 相当于绑定 value prop 并触发 input 事件:

<ChildComponent v-model="pageTitle" />

<!-- 是以下的简写: -->

<ChildComponent :value="pageTitle" @input="pageTitle = $event" />

如果想要更改 prop 或事件名称,则需要在 ChildComponent 组件中添加 model 选项:

<!-- ParentComponent.vue -->

<ChildComponent v-model="pageTitle" />
// ChildComponent.vue

export default {
  model: {
    prop: 'title',
    event: 'change'
  },
  props: {
    // 这将允许 `value` 属性用于其他用途
    value: String,
    // 使用 `title` 代替 `value` 作为 model 的 prop
    title: {
      type: String,
      default: 'Default title'
    }
  }
}

所以,在这个例子中 v-model 是以下的简写:

<ChildComponent :title="pageTitle" @change="pageTitle = $event" />

使用 v-bind.sync

在某些情况下,我们可能需要对某一个 prop 进行“双向绑定”(除了前面用 v-model 绑定 prop 的情况)。为此,我们建议使用 update:myPropName 抛出事件。例如,对于在上一个示例中带有 title prop 的 ChildComponent,我们可以通过下面的方式将分配新 value 的意图传达给父级:

this.$emit('update:title', newValue)

然后父组件可以在需要时监听该事件,并更新本地的 data property。例如:

<ChildComponent :title="pageTitle" @update:title="pageTitle = $event" />

为了方便起见,我们可以使用 .sync 修饰符来缩写,如下所示:

<ChildComponent :title.sync="pageTitle" />

3.x 语法

在 3.x 中,自定义组件上的 v-model 相当于传递了 modelValue prop 并接收抛出的 update:modelValue 事件:

<ChildComponent v-model="pageTitle" />

<!-- 是以下的简写: -->

<ChildComponent
  :modelValue="pageTitle"
  @update:modelValue="pageTitle = $event"
/>

v-model 参数

若需要更改 model 的名称,现在我们可以为 v-model 传递一个参数,以作为组件内 model 选项的替代:

<ChildComponent v-model:title="pageTitle" />

<!-- 是以下的简写: -->

<ChildComponent :title="pageTitle" @update:title="pageTitle = $event" />

v-bind anatomy

这也可以作为 .sync 修饰符的替代,而且允许我们在自定义组件上使用多个 v-model

<ChildComponent v-model:title="pageTitle" v-model:content="pageContent" />

<!-- 是以下的简写: -->

<ChildComponent
  :title="pageTitle"
  @update:title="pageTitle = $event"
  :content="pageContent"
  @update:content="pageContent = $event"
/>

v-model 修饰符

除了像 .trim 这样的 2.x 硬编码的 v-model 修饰符外,现在 3.x 还支持自定义修饰符:

html

<ChildComponent v-model.capitalize="pageTitle" />

查阅关于组件上的自定义 v-model 修饰符的更多信息。

迁移策略

我们推荐:

  • 检查你的代码库中所有使用 .sync 的部分并将其替换为 v-model

    <ChildComponent :title.sync="pageTitle" />
    
    <!-- 替换为 -->
    
    <ChildComponent v-model:title="pageTitle" />
    
  • 对于所有不带参数的 v-model,请确保分别将 prop 和 event 命名更改为 modelValueupdate:modelValue

    <ChildComponent v-model="pageTitle" />
    
    
    // ChildComponent.vue
    
    export default {
      props: {
        modelValue: String // 以前是`value:String`
      },
      emits: ['update:modelValue'],
      methods: {
        changePageTitle(title) {
          this.$emit('update:modelValue', title) // 以前是 `this.$emit('input', title)`
        }
      }
    }
    

[迁移构建开关:]

  • COMPONENT_V_MODEL
  • COMPILER_V_BIND_SYNC

3.总结

以下是对变化的总体概述:

  • 非兼容:用于自定义组件时,v-model prop 和事件默认名称已更改:

    • prop:value -> modelValue
    • 事件:input -> update:modelValue
  • 非兼容v-bind.sync 修饰符和组件的 model 选项已移除,可在 v-model 上加一个参数代替;

  • 新增:现在可以在同一个组件上使用多个 v-model 绑定;

  • 新增:现在可以自定义 v-model 修饰符。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/892609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信捷 XD PLC 16位整数转换为双精度浮点数

完成16位整数转换为双精度浮点数&#xff0c;信捷XD PLC需要两个指令&#xff0c;逐步转换&#xff0c;一个指令搞不定。 具体的: 第1步&#xff1a;int16->int32 第2步&#xff1a;int32->Double 例子&#xff0c;比如说将D0转换成浮点数放到D100~D103

卷积操作后特征图尺寸,感受野,参数量的计算

文章目录 1、输出特征图的尺寸大小2、感受野的计算3、卷积核的参数量 1、输出特征图的尺寸大小 如果包含空洞卷积&#xff0c;即扩张率dilation rate不为1时&#xff1a; 2、感受野的计算 例如&#xff0c;图像经过两个3*3&#xff0c;步长为2的卷积后感受野为&#xff1a; co…

linux--epoll

epoll 参考文献 https://www.cnblogs.com/lojunren/p/3856290.html https://www.51cto.com/article/717096.html linux下的I/O复用epoll详解 要深刻理解epoll&#xff0c;首先得了解epoll的三大关键要素&#xff1a;mmap、红黑树、链表。 IO多路复用 首先需要了解什么是IO多…

如何增强企业合同管理数字化能力

随着科技的发展和信息化时代的来临&#xff0c;企业在合同管理方面面临着日益复杂的挑战。传统的合同管理方式已经无法满足企业对合同管理效率和准确性的需求。因此&#xff0c;增强企业合同管理的数字化能力成为迫切的任务。 下面是一些关键步骤&#xff0c;可以帮助企业有效…

java+springboot+mysql理发会员管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的理发会员管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、客户、发型师角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff1b;会员管理&#xff1b;发型师管理&#xff1b…

spring详解

spring是于2003年兴起的一款轻量级的&#xff0c;非侵入式的IOC和AOP的一站式的java开发框架&#xff0c;为简化企业级应用开发而生。 轻量级的&#xff1a;指的是spring核心功能的jar包不大。 非侵入式的&#xff1a;业务代码不需要继承或实现spring中任何的类或接口 IOC&…

jeecg导出excel文件时候是id,展示名称的处理方式

一.问题描述: 在jeecg3.5.3版本中,创建了一个基础表,并配置菜单,输入数据以后,如果需要导出数据,而且数据类型的展示页面类型是他表字段,这个情况下,直接使用jeecg默认功能,导出的excel并不会和页面一样,默认显示出来被选字段的字段名称。 例如:页面显示如下: 实…

Spring讲解和ioc用途及Web容器的整合

目录 一、Spring概述 ( 1 ) 背景 ( 2 ) 是什么 ( 3 ) 核心特性 二、Spring中的ioc 2.1 讲解 2.2 主要功能 2.3 实例演示 三、注入方式 3.1 set注入 3.2 构造注入 3.3 接口注入 四、Web容器整合 4.1 思考 4.2 实操 对我们的收获 一、Spring概述 ( 1 ) 背景 Spr…

春秋云镜 CVE-2020-17530

春秋云镜 CVE-2020-17530 S2-061 靶标介绍 对CVE-2019-0230的绕过&#xff0c;Struts2官方对CVE-2019-0230的修复方式是加强OGNL表达式沙盒&#xff0c;而CVE-2020-17530绕过了该沙盒。当对标签属性中的原始用户输入进行评估时&#xff0c;强制 OGNL 评估可能会导致远程代码执…

C语言实例_获取文件MD5值

一、MD5介绍 MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希函数算法。将任意长度的数据作为输入&#xff0c;并生成一个唯一的、固定长度&#xff08;通常是128位&#xff09;的哈希值&#xff0c;称为MD5值。MD5算法以其高度可靠性和广泛应用而闻名…

15-生命周期

Vue生命周期 和 生命周期的四个阶段 Vue生命周期总结: 四个阶段,八个钩子 -> 三个常用 created,mounted,beforeDestroy 生命周期的钩子函数 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…

智能报警系统:利用人工智能保障安全和及时应对危险

引言&#xff1a;随着人工智能的快速发展&#xff0c;智能报警系统成为了一种高效、及时应对危险和保障安全的重要工具。通过分析监控视频中的图像、声音以及其他传感器数据&#xff0c;人工智能可以自动检测和识别火灾、破坏、烟雾、异常温度等情况&#xff0c;并及时触发报警…

STM32单片机SPI通信实战:示例代码详解与应用案例

引言&#xff1a; 单片机SPI&#xff08;串行外设接口&#xff09;通信是一种常用的串行同步通信协议&#xff0c;用于单片机与外设之间的高速数据传输。SPI通信具有简单、高效、可靠等特点&#xff0c;在各种嵌入式系统中被广泛应用。本文将介绍单片机SPI通信的原理、配置和性…

WebRTC | 网络传输协议RTP与RTCP

目录 一、UDP与TCP 1. TCP 2. UDP 二、RTP 1. RTP协议头 &#xff08;1&#xff09;V&#xff08;Version&#xff09;字段 &#xff08;2&#xff09;P&#xff08;Padding&#xff09;字段 &#xff08;3&#xff09;X&#xff08;eXtension&#xff09;字段 &#x…

嵌入式笔试面试刷题(day11)

文章目录 前言一、字节流&#xff0c;数据报&#xff0c;报文二、makefile怎么引入库和模块三、多次free一块内存空间会怎么样四、字符操作函数越界会发生什么五、QT中一个信号可以连接多个槽函数吗六、QT中一个槽函数可以对应多个信号吗总结 前言 本篇文章继续刷题。 一、字…

系统架构设计师---计算机基础知识之存储管理

存储管理的主要任务&#xff1a;提高主存的利用率、扩充主存以及对主存信息实现有效保护。 存储管理的对象&#xff1a;主存储器(简称主存或内存)。 逻辑地址和物理地址&#xff1a;用户编程所用的地址称为逻辑地址(虚地址)&#xff0c;而实际的内存地址 则称为物理地址(实地…

【组合数学】CF1622 D

Problem - 1622D - Codeforces 题意&#xff1a; 思路&#xff1a; 一开始的思路&#xff1a; 事实上&#xff0c;观察样例可知&#xff0c;如果一个小区间被包含在大区间里面&#xff0c;那么我们需要计算的是大区间的贡献 所以只需要找出大区间即可 一开始想的是找出所有…

C语言案例 判断是否为回文数-06.1

题目&#xff1a;随机输入一个5位数&#xff0c;判断它是不是回文数 步骤一&#xff1a;定义程序的目标 编写C程序&#xff0c;随机输入一个5位数&#xff0c;判断它是不是回文数 步骤二&#xff1a;程序设计 原理&#xff1a;即12321是回文数&#xff0c;个位与万位相同&#…

剑指Offer68-II.二叉树的最近公共祖先 C++

1、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

前端开发,怎么解决浏览器兼容性问题? - 易智编译EaseEditing

解决浏览器兼容性问题是前端开发中常见的挑战之一。不同的浏览器可能对网页元素的渲染和功能支持有所不同&#xff0c;因此需要采取一些策略来确保您的网页在不同浏览器上都能正常运行和呈现。以下是一些解决浏览器兼容性问题的方法和策略&#xff1a; 使用CSS Reset&#xff…