v-model使用及原理

news2025/4/6 11:41:52
关于v-model,vue2与vue3用法不一致,本文学习采用了vue3官网文档。与vue2区别写在本文末尾。

一、为什么使用v-model?

v-model指令可以在表单input、textarea以及select元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。本质上是语法糖,负责监听用户的输入事件来更新数据。

二、什么场景下会使用v-model?

①表单提交。比如用户在检索、创建、更新信息时,需要提交一些数据。
②组件通信。

三、v-model原理

1、v-bind绑定value属性的值。
2、v-on绑定input事件监听到函数中,函数会获取最新的值赋值到绑定的属性中。

  • 在原生元素上使用:
<input v-model=”searchText” />
//模板编译器会对v-model进行更冗长的等价展开
<input :value=”searchText” @input=”searchText = $event.target.value”>
  • 在组件上使用:
<CustomInput
  :modelValue="searchText"
  @update:modelValue="newValue => searchText = newValue"
/>
//注:子组件默认接收和更新modelValue,modelvalue也可以自定义,如
<input v-model:newValue=”searhText” />
CustomInput.vue组件有两种实现方式,如下:
//方式一:<!-- CustomInput.vue -->
<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue']
}
</script>
<template>
  <input
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  />
</template>
//方式二:<!-- CustomInput.vue -->
<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue'],
  computed: {
    value: {
      get() {
        return this.modelValue
      },
      set(value) {
        this.$emit('update:modelValue', value)
      }
    }
  }
}
</script>

<template>
  <input v-model="value" />
</template>
  • 多个v-model绑定:
//父组件
<UserName
  v-model:first-name="first"
  v-model:last-name="last"
/>
//子组件
<script>
export default {
  props: {
    firstName: String,
    lastName: String
  },
  emits: ['update:firstName', 'update:lastName']
}
</script>

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

四、v-model是双向绑定,是单向数据流

单向数据流:父组件可以向子组件传递数据,并且改变子组件的值,而子组件不能改变父组件传递给它的prop属性,官方推荐的做法是它抛出事件,通知父组件自行改变绑定的值。
单向数据流总结:数据向下,事件向上。
在这里插入图片描述

五、v-model修饰符

lazy作用:v-model在进行双向绑定时,绑定的是input事件,那么会在每次内容输入后就将最新的值和绑定的属性进行同步。v-model.lazy会将绑定的事件切换为change事件,只有在提交(比如回车)才会触发。
number作用:v-model绑定的值最终都会转为string类型,及时设置type为number。
v-model.number非数字以后的字符会被过滤,绑定的value类型隐士转换为number。
trim作用:自动过滤用户输入的守卫空白字符(字符首尾的空格会被过滤)。
注:修饰符可以串用(v-model.lazy.number.trim = ‘value’)
自定义修饰符capitalize:父组件使用v-model.capitalize,子组件的prop(modelModifiers)包含了capitalize且其值为true,默认返回一个空对象。

<script>
export default {
  props: {
    modelValue: String,
    modelModifiers: {
      default: () => ({})
    }
  },
  emits: ['update:modelValue'],
      created(){
        console.log(this.modelModifiers)  //{capitalize: true}
}
  methods: {
    emitValue(e) {
      let value = e.target.value
      if (this.modelModifiers.capitalize) {
        value = value.charAt(0).toUpperCase() + value.slice(1)
      }
      this.$emit('update:modelValue', value)
    }
  }
}
</script>

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

六、vue3与vue2关于v-model的区别

①vue3默认prop、event为:modelValue和update:modelValue
vue2默认prop、event为:value和input
②vue3直接通过v-model后面参数v-model:msg来指定属性名,并且支持绑定多个v-model
vue2通过子组件的model属性中的prop值和event值来指定属性名和事件名。

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

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

相关文章

马哈鱼SQLFLow直接数据流介绍

直接数据流介绍 本文将介绍一些生成直接数据流的SQL元素&#xff0c;这些元素是生产数据流的主要原型。 1、Select 示例语句&#xff1a; SELECT a.empName "eName" FROM scott.emp a Where sal > 1000目标列“eName”的数据来自scott.emp.empName列&#xff…

【安卓源码】安卓app应用进程启动原理

目录 0. 应用app 调用 startActivity 1. AMS 调用 startActivity 方法 2. zygote socket 通信,通知 zygote 创建应用进程 1-1&#xff09; 去fork 一个子进程 Zygote.forkAndSpecialize 1-2&#xff09;执行子进程方法 handleChildProc 1-3&#xff09;执行父进程方法 ha…

用户管理 ---MySQL总结(七)

用户管理 对于MySQL的用户也是需要进行管理&#xff0c;这里的东西类似与Linux的多用户管理&#xff0c;基本相同 用户属性 MySQL的用户都是储存在数据库mysql的user之中。 这里使用desc table_name;查看user表的属性。 desc user;//下面的就是输出的结果host:登陆限制 user…

chatgpt赋能Python-python_ai_app

用Python编写AI应用程序 Python是目前最受欢迎的编程语言之一&#xff0c;被广泛用于各种应用程序的开发。其中&#xff0c;人工智能&#xff08;AI&#xff09;应用程序成为Python编程人员最感兴趣和热门的领域之一。这篇文章将重点介绍用Python编写AI应用程序的好处&#xf…

从零开始Vue3+Element Plus后台管理系统(16)——组合式函数hook二次封装el-table

终于写到组合式函数了&#xff0c;它类似vue2的mixin&#xff0c;但优于mixin&#xff0c;用好了可以事半功倍。 在 Vue 应用的概念中&#xff0c;“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。 官方文档&#xff1a;https://cn.vu…

chatgpt赋能Python-python_chan

Python的Channel模块&#xff1a;优化你的并发控制 Python是一门优秀的编程语言&#xff0c;在众多优秀的模块中&#xff0c;Channel模块是一个备受喜爱的模块。它是Python并发控制的建议之一&#xff0c;可以被用来在多个协程之间传递和传输消息。这个模块不仅仅是Python 3.5…

chatgpt赋能Python-python_cal

Python编程的神器——Cal 随着人工智能、机器学习等技术的发展&#xff0c;Python语言成为了最热门的编程语言之一。Python可以帮助程序员快速实现自己的想法&#xff0c;让程序的编写变得更加简单和容易。在Python中&#xff0c;有许多高效好用的工具和库&#xff0c;而其中最…

chatgpt赋能Python-python_chi2

Python中的Chi-Squared测试&#xff1a;一种用于统计分析的重要方法 数据分析是当今商业和科学中最重要的工具之一&#xff0c;它可以帮助人们了解他们的业务和科学领域。其中数据分析的技术以Python为代表的编程语言越来越受到欢迎&#xff0c;这些方法可以用于分类、回归、聚…

《数据可视化》课程期末项目_地理交通数据可视化

2022年上海疫情爆发期间交通数据可视化分析 《数据可视化》课程期末项目报告-选题&#xff1a;地理数据可视化 GitHub源码地址(如果有用点个 star 吧~谢谢&#xff01;) 文章目录 1.0 项目简介2.0 数据简介2.1 航线数据2.2 公交路线数据2.1 项目流程 3.0 数据处理3.1 航线数据…

【面试题】如何实现vue虚拟列表,纵享丝滑

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 最近在工作中遇到了一个列表的需求&#xff0c;因为做的是C端&#xff0c;所以对性能…

什么是接口测试?接口测试流程有哪些?我来告诉你

目录 首先&#xff0c;什么是接口呢&#xff1f; 一、常见接口&#xff1a; 二、前端和后端&#xff1a; 三、什么是接口测试&#xff1a; 四、接口组成 五、为什么要做接口测试&#xff1a; 六、接口测试怎么测&#xff1a; 七、用什么工具测 八. 接口测试持续集成 九…

chatgpt赋能Python-python_canbus

Python Canbus&#xff1a;如何使用Python编程语言控制Canbus&#xff1f; 介绍 Canbus被广泛地应用于现代汽车中&#xff0c;是一个用于通讯的协议&#xff0c;允许汽车的各个部分进行通信。为了控制Canbus&#xff0c;很多工程师都使用Python编程语言&#xff0c;因为它简单…

爬虫练习-12306自动购票升级版

文章目录 前言代码更新 前言 hello兄弟们&#xff0c;偷懒归来了。别问为啥这么久没更&#xff0c;问就是失踪了 最近一直在学习Django以及爬虫进阶之类的知识&#xff0c;加上快期末了&#xff0c;一直没有想起来自己还有一个账号没有更新&#xff0c;sorry啦 言归正传&…

SpringBoot - Jackson详解

写在前面 JSON 是目前主流的前后端数据传输方式。在 Spring Boot 项目中&#xff0c;只要添加了 WEB依赖&#xff08;spring-boot-starter-web&#xff09;&#xff0c;就可以很方便地实现 JSON 转换。WEB 依赖默认加入了 jackson-databind 作为 JSON 处理器&#xff0c;我们不…

算法小试炼(差不多相当于重新过一遍ACWING,为了夏令营做点准备)

1.最长不重复子串 这个题目的具体意思就不用我说了&#xff0c;我这里给出两种算法 1&#xff09;暴力搜索 只要机器够快&#xff0c;没有什么是暴搜解决不了的^ ^&#xff08;开玩笑 很简单&#xff0c;我们只需要遍历长度&#xff0c;跟左边界就好了&#xff0c;这个应该没…

测试必知必会的Mock数据方法

Mock数据的含义 那么Mock数据是什么意思呢 首先Mock这个英文单词有模拟的意思&#xff0c;模拟数据通俗的理解就是构造假数据&#xff0c;即Mock数据就是通过构造假数据来达到测试的目的&#xff0c;它广泛运用于功能测试、接口测试、单元测试 在功能测试中&#xff0c;可以…

离散数学 | 图论 | 欧拉图 | 哈密顿图 | 割点 | 桥(欧拉图和哈密顿图有没有割点和桥?)

本文主要解决以下几个问题&#xff1a; 1.欧拉图能不能有割点&#xff0c;能不能有桥&#xff1f; 2.哈密顿图能不能有割点&#xff0c;能不能有桥&#xff1f; 首先我们要明白几个定义 割点的定义就是在一个图G中&#xff0c;它本来是连通的&#xff0c;去掉一个点v以后这个…

【firewalld防火墙】

目录 一、firewalld概述二、firewalld 与 iptables 的区别1、firewalld 区域的概念 三、firewalld防火墙默认的9个区域四、Firewalld 网络区域1、区域介绍2、firewalld数据处理流程 五、firewalld防火墙的配置方法1、使用firewall-cmd 命令行工具。2、使用firewall-config 图形…

【计算机网络基础】章节测试4 网络层

R1与R2是一个自治系统中采用RIP路由协议的两个相邻路由器,R1的路由表如图(a)所示。如果R1收到R2发送的如图(b)所示的(V,D)报文,更新之后的R1的4个路由表项的距离从上到下依次为0、4、4、2,那么图 (b)中a、b、c、d 可能的数据一个是( C )。 A. 1、2、2、1 B. 2、2、3、1…

Java 核心技术 卷I 第2章 Java程序设计环境

第2章 Java程序设计环境 2.1 安装Java开发工具包 2.1.1 下载JDK www.oracle.com/technetwork/java/javase/downloads Java术语 2.1.2 设置JDK 下载JDK之后&#xff0c;需要安装这个开发包并明确要在哪里安装&#xff0c;后面还会需要这个信息. 指/opt/jdk1.8.0_31/bin或c…