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-->
    <BaseSelect
      v-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 自动接收更新后的值。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

区块链技术如何改变我们的日常生活?

区块链技术&#xff0c;这个听起来很高科技的词&#xff0c;其实已经在悄悄地改变我们的日常生活了。不信&#xff1f;让我给你举几个例子&#xff1a; 防作弊&#xff1a;想象一下&#xff0c;如果有一个账本&#xff0c;每个人都能随时查看&#xff0c;那想在里面作弊就难了…

nacos安装部署

nacos安装部署 1.安装nacos 1.安装nacos nacos的安装很简单下载后解压启动即可&#xff0c;但是在启动前请确保jdk环境正常&#xff1b; 1.首先我们要下载nacos安装包&#xff1a;可以到官网下载&#xff0c;注意我这里使用的是2.1.0版本&#xff1b; 2.下载完成后&#xff0…

前端css实例

前端css实例 一、带条纹的表格 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>条纹样式的表格<…

基于云模型和遗传算法的建设工程风险决策多目标优化研究

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于云模型和遗传算法的建设工程风险决策多目标优化研究 基于云模型和遗传算法的建设工程风险决策多目标优化研究涉及在建设工程领域中运用云模型和遗传算法来优化风险决策的多个目标。云模型是一种将模糊理论与概率…

【Vue2.x】vue-treeselect修改宽度、回显

目录 修改vue-treeSelect 组件的高度方法1&#xff1a;CSS中的important语法&#xff0c;覆盖样式方法2&#xff1a;修改组件样式文件&#xff0c;重新引入样式文件 修改单选的回显&#xff0c;显示当前选中节点以及相应父级节点第一步 下载源码第二步 修改源码第三步 编译源码…

利用 SpringBoot 开发的新冠密接者跟踪系统:医疗机构疫情防控辅助方案

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

数据湖的概念(包含数据中台、数据湖、数据仓库、数据集市的区别)--了解数据湖,这一篇就够了

文章目录 一、数据湖概念1、企业对数据的困扰2、什么是数据湖3、数据中台、数据湖、数据仓库、数据集市的区别 网上看了好多有关数据湖的帖子&#xff0c;还有数据中台、数据湖、数据仓库、数据集市的区别的帖子&#xff0c;发现帖子写的都很多&#xff0c;而且专业名词很多&am…

Mac 环境下类Xshell 的客户端介绍

在 Mac 环境下&#xff0c;类似于 Windows 环境中 Xshell 用于访问 Linux 服务器的工具主要有以下几种&#xff1a; SecureCRT&#xff1a; 官网地址&#xff1a;https://www.vandyke.com/products/securecrt/介绍&#xff1a;支持多种协议&#xff0c;如 SSH1、SSH2、Telnet 等…

Linux系统编程——进程替换

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

MATLAB 中有关figure图表绘制函数设计(论文中常用)

在撰写论文时&#xff0c;使用 MATLAB 导出的图像常常因大小和格式不统一&#xff0c;导致投稿时编辑部频繁退稿&#xff0c;要求修改和调整。这不仅浪费时间&#xff0c;也增加了工作量。为了减少这些麻烦&#xff0c;可以在 MATLAB 中导出图像时提前设置好图表的大小、格式和…

YOLO系列论文综述(从YOLOv1到YOLOv11)【第13篇:YOLOv10——实时端到端物体检测】

YOLOv10 1 摘要2 网络结构3 YOLOv1-v10对比 YOLO系列博文&#xff1a; 【第1篇&#xff1a;概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】【第2篇&#xff1a;YOLO系列论文、代码和主要优缺点汇总】【第3篇&#xff1a;YOLOv1——YOLO的开山之作】【第4篇&#xff1a…

Python基于滑动窗口CNN损伤梁桥数据、故宫城墙图像数据分类可视化|数据分享

全文链接&#xff1a;https://tecdat.cn/?p38442 分析师&#xff1a;Yufei Guo 在现代土木结构工程领域&#xff0c;结构损伤的准确识别与定位对于保障基础设施的安全性和耐久性具有极为关键的意义。传统的人工检查方法&#xff0c;如目视检查以及借助专业设备进行检测&#x…

基于Pytorch的CIFAR100数据集上从ResNet50到VGG16的知识蒸馏实验记录

知识蒸馏的概念 可以参照NeurIPS2015的论文“Distilling the Knowledge in a Neural Network”了解知识蒸馏的概念。 知识蒸馏的狭义概念就是从复杂模型中迁移知识来提升简单模型的性能。复杂模型称之为教师模型&#xff0c;简单模型称之为学生模型。最近&#xff0c;笔者重温…

jQuery九宫格抽奖,php处理抽奖信息

功能介绍 jQuery九宫格抽奖是一种基于jQuery库的前端抽奖效果。通过九宫格的形式展示抽奖项&#xff0c;用户点击抽奖按钮后&#xff0c;九宫格开始旋转&#xff0c;最终停在一个随机位置上&#xff0c;此位置对应的抽奖项为用户的中奖结果。 本文实现九宫格的步骤为&#xf…

鸿蒙修饰符

文章目录 一、引言1.1 什么是修饰符1.2 修饰符在鸿蒙开发中的重要性1.3 修饰符的作用机制 二、UI装饰类修饰符2.1 Styles修饰符2.1.1 基本概念和使用场景2.1.2 使用示例2.1.3 最佳实践 2.2 Extend修饰符2.2.1 基本概念2.2.2 使用示例2.2.3 Extend vs Styles 对比2.2.4 使用建议…

输入json 达到预览效果

下载 npm i vue-json-pretty2.4.0 <template><div class"newBranchesDialog"><t-base-dialogv-if"addDialogShow"title"Json数据配置"closeDialog"closeDialog":dialogVisible"addDialogShow":center"…

MDETR - Modulated Detection for End-to-End Multi-Modal Understanding

Abstract 多模态推理系统&#xff08;如视觉问答系统或图像与文本之间的匹配系统&#xff09;通常依赖于一个预训练的物体检测器&#xff0c;用于从图像中提取感兴趣的区域。这些物体检测器通常是作为“黑盒”使用的&#xff0c;也就是说&#xff0c;它们在被训练时独立于下游…

pytest+allure生成报告显示loading和404

pytestallure执行测试脚本后&#xff0c;通常会在电脑的磁盘上建立一个临时文件夹&#xff0c;里面存放allure测试报告&#xff0c;但是这个测试报告index.html文件单独去打开&#xff0c;却显示loading和404, 这个时候就要用一些办法来解决这个报告显示的问题了。 用命令产生…

【MyBatis】验证多级缓存及 Cache Aside 模式的应用

文章目录 前言1. 多级缓存的概念1.1 CPU 多级缓存1.2 MyBatis 多级缓存 2. MyBatis 本地缓存3. MyBatis 全局缓存3.1 MyBatis 全局缓存过期算法3.2 CacheAside 模式 后记MyBatis 提供了缓存切口&#xff0c; 采用 Redis 会引入什么问题&#xff1f;万一遇到需强一致场景&#x…

MySQL —— MySQL 程序

目录 前言 一、MySQL 程序简介 二、mysqld -- MySQL 服务器 三、mysql -- MySQL 客户端 1. mysql 客户端简介 2. mysql 客户端选项 &#xff08;1&#xff09;指定选项的方式 &#xff08;2&#xff09;mysql 客户端命令常用选项 &#xff08;3&#xff09;在命令行中使…