Chapter 17 v-model进阶

欢迎大家订阅【Vue2+Vue3】入门到实践 专栏,开启你的 Vue 学习之旅!

文章目录

  • 1 v-model原理
  • 2 表单类组件封装
  • 3 v-model简化代码


1 v-model原理

1. 基本原理

v-model 本质上是一个语法糖,它将 value 属性 和 input 事件 的绑定合并为一个指令。
对于输入框这种常见的表单元素,v-model 会自动为你绑定 value 属性和 input 事件,实现数据双向绑定。

2. 作用
提供数据的双向绑定

  • :value :数据变,视图跟着变
  • @input:视图变,数据跟着变

【示例】

<template>
<div id="app" ><input v-model="msg1" type="text"><input :value="msg2"  type="text">
</div>
</template><script>
export default {data(){return{msg1:'',msg2:''}}}
</script><style></style>

【详解】

v-model="msg1"msg1 会和第一个 <input> 元素的 value 进行双向绑定。

  • 当用户在输入框中输入内容时,msg1 会更新为输入的值。
  • 如果 msg1 改变,输入框的值会同步更新。

:value="msg2":第二个 <input> 通过 :value 绑定 msg2,但是它并没有绑定 input 事件。

  • msg2 只是将初始值传递给输入框,但当用户输入新的内容时,msg2 的值不会更新。
  • 如果希望 msg2 随着用户输入动态更新,还需要显式地处理输入事件。

【运行结果】
在这里插入图片描述
在这里插入图片描述
【优化】

<template>
<div id="app" ><input v-model="msg1" type="text"><!-- 模板中获取事件的形参 -> 通过 $event 获取 --><input :value="msg2" @input="msg2 = $event.target.value"  type="text">
</div>
</template>

:value="msg2" @input="msg2 = $event.target.value":第二个 <input> 不仅绑定了 msg2 的初始值(通过 :value="msg2"),还显式地绑定了 input 事件。

  • 每当用户输入时,@input 事件会触发,并通过 $event.target.value 获取输入框的值。
  • 通过 msg2 = $event.target.value,更新 msg2 的值,从而实现双向绑定。
  • 该方式使得 msg2 的值能够随着用户的输入动态更新。

【运行结果】
在这里插入图片描述

3. 注意事项
v-model 在不同类型的表单元素上工作时,底层的实现机制会有所不同。

  • 文本框 (<input type="text">):绑定 value 属性和 input 事件。
  • 复选框 (<input type="checkbox">):绑定 checked 属性和 change 事件,处理布尔值或数组。
  • 单选框 (<input type="radio">):绑定 checked 属性和 change 事件,处理选中的值。
  • 下拉框 (<select>):绑定 value 属性和 change 事件,处理选中的值。

Vue 会根据表单元素的不同,自动选择合适的属性和事件来实现数据的双向绑定,从而简化了开发者的工作。

2 表单类组件封装

1. 需求目标
实现子组件和父组件数据的双向绑定 。

2. 示例代码

父组件App.vue

<template><div class="app"><BaseSelect></BaseSelect></div>
</template><script>
import BaseSelect from './components/BaseSelect.vue'
export default {data() {return {selectId: '102',}},components: {BaseSelect,},
}
</script><style>
</style>

子组件BaseSelect.vue

<template><div><select><option value="101">北京</option><option value="102">上海</option><option value="103">武汉</option><option value="104">广州</option><option value="105">深圳</option></select></div>
</template><script>
export default {
}
</script><style>
</style>

【代码分析】

  • 父组件:定义了一个 selectId,用于存储当前选中的城市 ID,但没有将该值传递给子组件
  • 子组件:<select> 元素的值没有任何绑定,用户在子组件中选中城市时,父组件中的 selectId 不会自动更新

【暴露得问题】
父组件和子组件之间的数据没有双向绑定,修改子组件中的选择不会反映到父组件的数据中。

【优化】
父组件App.vue:

<template><div class="app"><BaseSelect:cityId="selectId"@changeId="selectId=$event"></BaseSelect></div>
</template><script>
import BaseSelect from './components/BaseSelect.vue'
export default {data() {return {selectId: '102',}},components: {BaseSelect,},
}
</script><style>
</style>

子组件BaseSelect.vue:

<template><div><select :value="cityId" @change=handleChange><option value="101">北京</option><option value="102">上海</option><option value="103">武汉</option><option value="104">广州</option><option value="105">深圳</option></select></div>
</template><script>
export default {props:{cityId:String},methods:{handleChange(e){this.$emit('changeId',e.target.value)}}}
</script><style>
</style>

【优化思路】
在这里插入图片描述
在这里插入图片描述
手动实现双向绑定:

  • 父组件:selectId 被传递给子组件 BaseSelect,并通过 @changeId 监听子组件发出的 changeId 事件,将子组件的选中值($event) 更新到父组件的 selectId 上。
  • 子组件:子组件通过 props 接收来自父组件的 cityId,并将 select 元素的 value 属性与其绑定,用户选择城市时,触发 @change 事件,使用 this.$emit('changeId', e.target.value) 将选中的值传递回父组件。

【运行结果】
在这里插入图片描述
在这里插入图片描述

  • 实现了父子组件之间的数据双向绑定。
  • 当用户在子组件中选择不同的城市时,selectId 会自动更新。
  • 如果 selectId 在父组件中发生变化,子组件的选择框也会同步更新。

3 v-model简化代码

1. 目标

父组件通过 v-model 简化代码,实现子组件和父组件数据 双向绑定

2. 简化思路

v-model 其实就是 :value@input 事件的简写

  • 子组件:props 通过 value 接收数据,事件触发 input
  • 父组件:v-model 直接绑定数据

在这里插入图片描述

3. 示例代码

父组件App.vue

<template><div class="app"><!-- v-mdel= :value +@input--><BaseSelectv-model="selectId"></BaseSelect></div>
</template><script>
import BaseSelect from './components/BaseSelect.vue'
export default {data() {return {selectId: '102',}},components: {BaseSelect,},
}
</script><style>
</style>

子组件BaseSelect.vue

<template><div><select :value="value" @change=handleChange><option value="101">北京</option><option value="102">上海</option><option value="103">武汉</option><option value="104">广州</option><option value="105">深圳</option></select></div>
</template><script>
export default {props:{value:String},methods:{handleChange(e){this.$emit('input',e.target.value)}}}
</script><style>
</style>

使用 v-model 实现双向绑定:

  • 父组件:通过 v-model="selectId"selectId 绑定到子组件的 value 上。
    子组件:接收一个名为 valueprop,并使用 :value="value" 来将父组件的 selectId 传递给 <select> 元素。当选择发生变化时,子组件会触发 input 事件,父组件通过 v-model 自动接收更新后的值。

【运行结果】
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-boot-maven-plugin 标红

情况&#xff1a;创建好 Spring Boot 项目后&#xff0c;pom.xml 文件中 spring-boot-maven-plugin 标红。 解决方案&#xff1a;加上 Spring Boot 的版本即可解决。

电子应用设计方案-31:智能AI音响系统方案设计

智能 AI 音响系统方案设计 一、引言 智能 AI 音响作为一种新兴的智能家居设备&#xff0c;通过融合语音识别、自然语言处理、音频播放等技术&#xff0c;为用户提供便捷的语音交互服务和高品质的音乐体验。本方案旨在设计一款功能强大、性能稳定、用户体验良好的智能 AI 音响系…

“harmony”整合不同平台的单细胞数据之旅

其实在Seurat v3官方网站的Vignettes中就曾见过该算法&#xff0c;但并没有太多关注&#xff0c;直到看了北大张泽民团队在2019年10月31日发表于Cell的《Landscap and Dynamics of Single Immune Cells in Hepatocellular Carcinoma》&#xff0c;为了同时整合两类数据&#xf…

接口测试工具:reqable

背景 在众多接口测试工具中挑选出一个比较好用的接口测试工具。使用过很多工具&#xff0c;如Postman、Apifox、ApiPost等&#xff0c;基本上是同类产品&#xff0c;一般主要使用到的功能就是API接口和cURL&#xff0c;其他的功能目前还暂未使用到。 对比 性能方面&#xff…

内容安全与系统构建加速,助力解决生成式AI时代的双重挑战

内容安全与系统构建加速&#xff0c;助力解决生成式AI时代的双重挑战 0. 前言1. PRCV 20241.1 大会简介1.2 生成式 Al 时代的内容安全与系统构建加速 2. 生成式 AI2.1 生成模型2.2 生成模型与判别模型的区别2.3 生成模型的发展 3. GAI 内容安全3.1 GAI 时代内容安全挑战3.2 图像…

SRS搭建直播推流服务

学习链接 5分钟教你搭建SRS流媒体服务器 - B站视频 SRS Stack 入门B站合集视频 - SRS官方教程 SRS官网 SRS官网文档 ossrs/srs github SRS for window - 可以安装windows版本的srs&#xff0c;SRS 5.0.89正式支持Windows&#xff0c;每个5.0的版本都会提供安装包 文章目录…

javaScript数据类型存储

2.1、简单类型与复杂类型 简单类型又叫做基本数据类型或者值类型&#xff0c;复杂类型又叫做引用类型 值类型&#xff1a;简单数据类型/基本数据类型&#xff0c;在存储时变量中存储的时值本身&#xff0c;因此叫做值类型 string、number、boolean、undefined、null 注意&…

深度学习之 DenseNet和2图像分割常用数据集

1 DenseNet 卷积神经网络结构的设计主要朝着两个方向发展&#xff0c;一个是更宽的网络&#xff08;代表&#xff1a;GoogleNet、VGG&#xff09;&#xff0c;一个是更深的网络&#xff08;代表&#xff1a;ResNet&#xff09;。但是随着层数的加深会出现一个问题——梯度消失&…

Nginx:反向代理

目录 反向代理原理 反向代理配置 日志对比 反向代理原理 网站通过代理服务器发布&#xff0c;用户无需得知网站的实际地址&#xff0c;通过代理服务器进行请求与响应。 用户所有的网站请求报文与响应报文都被代理服务器拦截&#xff0c;在网络层将源地址和目的地址进行了修改…

Linux系统编程——进程替换

目录 前言 二、进程程序替换的概念 三、进程程序替换的原理 ​编辑 四、为什么需要进行进程程序替换 五、如何进行进程程序替换 1、进程替换函数&#xff1a; 1)execl()函数 2)execv()函数 3) execlp()函数 4) execvp()函数 5&#xff09;execle函数 6&#xff09;ex…

探索HarmonyOS:一键掌握Router与NavPathStatck的传参和页面回调技巧

路由的选择 HarmonyOS提供两种路由实现的方式&#xff0c;分别是 Router 和 NavPatchStack。两者使用场景和特效各有优劣。 组件适用场景特点备注Router模块间与模块内页面切换通过每个页面的url实现模块间解耦NavPathStack模块内页面切换通过组件级路由统一路由管理 什么时候使…

go使用mysql实现增删改查操作

1、安装MySQL驱动 go get -u github.com/go-sql-driver/mysql2、go连接MySQL import ("database/sql""log"_ "github.com/go-sql-driver/mysql" // 导入 mysql 驱动 )type Users struct {ID intName stringEmail string }var db *sql.DBfu…

ffmpeg安装(windows)

ffmpeg安装-windows 前言ffmpeg安装路径安装说明 前言 ffmpeg的安装也是开箱即用的,并没有小码哥说的那么难 ffmpeg安装路径 这就下载好了! 安装说明 将上面的bin目录加入到环境变量,然后在cmd中测试一下: C:\Users\12114\Desktop\test\TaskmgrPlayer\x64\Debug>ffmpe…

FPGA存在的意义:为什么adc连续采样需要fpga来做,而不会直接用iic来实现

FPGA存在的意义&#xff1a;为什么adc连续采样需要fpga来做&#xff0c;而不会直接用iic来实现 原因ADS111x连续采样实现连续采样功能说明iic读取adc的数据速率 VS adc连续采样的速率adc连续采样的速率iic读取adc的数据速率结论分析 FPGA读取adc数据问题一&#xff1a;读取adc数…

《Vue零基础入门教程》第十四课:列表渲染

往期内容 《Vue零基础入门教程》第六课&#xff1a;基本选项 《Vue零基础入门教程》第八课&#xff1a;模板语法 《Vue零基础入门教程》第九课&#xff1a;插值语法细节 《Vue零基础入门教程》第十课&#xff1a;属性绑定指令 《Vue零基础入门教程》第十一课&#xff1a;事…

Redis主从架构

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的键值对存储系统&#xff0c;广泛应用于缓存、消息队列、实时分析等场景。为了提高系统的可用性、可靠性和读写性能&#xff0c;Redis提供了主从复制&#xff08;Master-Slave Replication&#xf…

学成在线day08

部署静态页面 相关操作&#xff1a;https://mx67xggunk5.feishu.cn/wiki/FLozwxrrxihTJbkyTHgchDt4nUc nginx的最终配置文件&#xff1a; worker_processes 1; events {worker_connections 1024; } http {include mime.types;default_type application/octet-strea…

Oracle数据恢复—Oracle数据库sysaux文件损坏的数据恢复案例

Oracle数据库故障&分析&#xff1a; 一台Oracle数据库打开报错&#xff0c;报错信息&#xff1a; “system01.dbf需要更多的恢复来保持一致性&#xff0c;数据库无法打开”。管理员联系我们数据恢复中心寻求帮助&#xff0c;并提供了Oracle_Home目录的所有文件。用户方要求…

ArraList和LinkedList区别

文章目录 一、结构不同二、访问速度三、插入和删除操作的不同1、决定效率有两个因素&#xff1a;数据量和位置。2、普遍说法是“LinkedList添加删除快”&#xff0c;这里是有前提条件的 四、内存占用情况五、使用场景六、总结 一、结构不同 LinkedList&#xff1a;它基于双向链…

B站狂神说Mybatis+Spring+SpringMVC整合理解(ssm框架整合)

文章目录 0.写在前面(对mybatis,spring的理解)&#xff08;不看可跳过&#xff09;0.1 为什么需要mybatis0.2 为什么需要spring0.3为什么需要springmvc 1.新建ssmbuild数据库2.新建Maven项目3.初始化步骤3.1 配置下载maven依赖&#xff0c;构建资源导出3.2 连接数据库3.3建包&a…