【Vue3】组件通信之v-model

news2024/11/15 8:21:34

【Vue3】组件通信之v-model

  • 背景
  • 简介
  • 开发环境
  • 开发步骤及源码
  • 总结

背景

随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内容并非完全原创,大多是参考其他文章资料整理所得,感谢每位技术人的开源精神。

简介

本文介绍 Vue3 中如何使用 v-model 实现组件间通信,即组件间相互传数据。

Vue3 中组件间通信包括:

  • 父组件向子组件传数据,实现方案有:
    • props
    • v-model
    • $ref
    • 默认插槽 / 具名插槽
  • 子组件向父组件传数据
    • props
    • v-model
    • $parent
    • 自定义事件
    • 作用域插槽
  • 父组件向子组件的子组件传数据,即向孙子组件传数据
    • $attrs
    • provider & inject
  • 任意组件间传数据
    • mitt
    • Pinia

开发环境

分类名称版本
操作系统WindowsWindows 11
IDEVisual Studio Code1.91.1

开发步骤及源码

1> 创建 Vue3 工程,参考:【Vue3】工程创建及目录说明。

2> 删除 src 目录下 assetscomponents 目录。

3> 修改 src 目录下 main.ts

import { createApp } from 'vue'
import App from './App.vue'

createApp(App).mount('#app')

4> 定义子组件,接收来自父组件的数据。

<template>
    <div class="content">
        <h1>子组件</h1>
        <span>用户名:</span>
        <input type="text" 
            :value="modelValue"
            @input="emits('update:modelValue', (<HTMLInputElement>$event.target).value)" />
    </div>
</template>

<script setup lang="ts">
defineProps(['modelValue'])
const emits = defineEmits(['update:modelValue'])
</script>

<style scoped lang="scss">
.content {
    background-color: greenyellow;
    padding: 20px;
    input {
        border: 3px solid red;
        height: 30px;
        line-height: 30px;
        width: 300px;
    }
}
</style>

父组件通过 v-model 向子组件传数据,Vue3 框架默认 v-model 传的数据名为 modelValue,对应事件名为 update:modelValue,所以子组件需要使用 defineProps 函数声明接收来自父组件的数据 modelValue,使用 defineEmits 函数声明接收来自父组件的事件 update:modelValue
触发事件函数的参数是 $event.target.value,即子组件中 DOM(input)事件对象的值。
注意:需要执行 npm install -D sass 命令安装 CSS 预处理器。

5> 修改 Vue 根组件 src/App.vue,使用 v-model 向子组件传数据。

<template>
  <div class="parent">
    <Login v-model="username" />
  </div>
</template>

<script setup lang="ts">
import Login from './components/Login.vue'
import { ref, watch } from 'vue'

const username = ref('administrator')
watch(username, (newValue, oldValue) => {
  console.log('username changed from', oldValue, 'to', newValue)
})
</script>

<style scoped lang="scss">
.parent {
  background-color: orange;
  padding: 20px;
}
</style>

以上代码中 <Login v-model="username" /> 等同于 <Login :modelValue="username" @update:modelValue="username = $event" />,后者为 v-model 的本质。

6> 执行命令 npm run dev 启动应用,浏览器访问:http://localhost:5173/
在这里插入图片描述
页面初始化时 <input> 框内显示来自父组件的数据 administrator,每次修改 <input> 框中数据,控制台便会打印出数据变化日志,此日志为 App.vue 打印的,表明父组件也收到了子组件传来的修改后的变更数据。

7> Vue3 默认 v-model 数据名是 modelValue,此名称可以自定义。自定义 v-model 数据名便于在同一组件标签上使用多个 v-model 属性传数据,修改 App.vue 向子组件传两个数据。

<template>
  <div class="parent">
    <Login v-model:account="username" v-model:credential="password" />
  </div>
</template>

<script setup lang="ts">
import Login from './components/Login.vue'
import { ref, watch } from 'vue'

const username = ref('administrator')
const password = ref('00000000')
watch([username, password], (newValue, oldValue) => {
  console.log('username changed from', oldValue, 'to', newValue)
})
</script>

<style scoped lang="scss">
.parent {
  background-color: orange;
  padding: 20px;
}
</style>

8> 修改子组件,声明接收父组件的两个数据并进行处理。

<template>
    <div class="content">
        <h1>子组件</h1>
        <span>用户名:</span>
        <input type="text" 
            :value="account"
            @input="emits('update:account', (<HTMLInputElement>$event.target).value)" />
        <span>密码:</span>
        <input type="text" 
            :value="credential"
            @input="emits('update:credential', (<HTMLInputElement>$event.target).value)" />
    </div>
</template>

<script setup lang="ts">
defineProps(['account', 'credential'])
const emits = defineEmits(['update:account', 'update:credential'])
</script>

<style scoped lang="scss">
.content {
    background-color: greenyellow;
    padding: 20px;
    input {
        border: 3px solid red;
        height: 30px;
        line-height: 30px;
        margin-right: 20px;
        width: 300px;
    }
}
</style>

9> 浏览器刷新访问:http://localhost:5173/,页面初始化时 <input> 框内显示来自父组件的数据 administrator00000000,每次修改 <input> 框中数据,控制台便会打印出数据变化日志,此日志为 App.vue 打印的,表明父组件也收到了子组件传来的修改后的变更数据。
在这里插入图片描述

总结

  • 使用 v-model 实现组件间通信的方法常用于封装自定义 UI 组件库,在日常业务开发过程中较少使用;
  • 使用 v-model 实现组件间通信的底层原理是:动态 value + input 事件
  • 父组件需要在子组件标签上通过 v-model 属性标识所传的数据;
  • 子组件需要使用 defineProps 函数声明接收父组件的数据,使用 defineEmits 函数声明接收父组件数据对应的事件;
  • v-model 默认传的数据名为 modelValue,对应事件名为 update:modelValue。数据名可自定义,格式:v-model:自定义数据名;事件名前缀固定为 update:,格式:update:自定义数据名

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

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

相关文章

图像梯度与几种算子

“滤波器”也可以称为“卷积核”&#xff0c;“掩膜”&#xff0c;“算子”等。 1、Sobel算子 Sobel算子是一个33的卷积核&#xff0c;利用局部差分寻找边缘&#xff0c;计算得到梯度的近似值。x和y方向的Sobel算子分别为&#xff1a; 梯度有方向&#xff0c;对于一个图像&a…

电子元器件—三极管(一篇文章搞懂电路中的三极管)(笔记)(面试考试必备知识点)

三极管的定义及工作原理 1. 定义 三极管&#xff08;Transistor&#xff09;是一种具有三层半导体材料&#xff08;P-N-P 或 N-P-N&#xff09;构成的半导体器件&#xff0c;用于信号放大、开关控制和信号调制等应用。三极管有三个引脚&#xff1a;发射极&#xff08;Emitter…

SpringBoot智慧旅游在线平台的设计与实现(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLM…

从地铁客流讲开来:地铁客运量特征

1.数据来源 数据来源&#xff1a;MetroWatch地铁观察 | 地铁客流量数据 在做城市地铁客流数据的整理及可视化这块其实国内已经有很多大牛一直在做无偿免费的更新&#xff0c;其中覆盖多城市且每日更新数据的主要有两个&#xff1a;一个是地铁数据库 | 地铁客流量查询 (metrod…

数字农业农村云平台整体规划建设方案PPT

数字农业农村云平台的规划建设方案是一个全面而复杂的项目&#xff0c;涉及到多个方面的整合与创新。根据搜索结果&#xff0c;以下是一些关键点&#xff1a; 资料下载方式&#xff0c;请看每张图片右下角信息 1. 组织领导与政策支持&#xff1a;加强组织领导&#xff0c;确保…

如何在联络中心使用人工智能驱动的语音分析?

人工智能驱动的语音分析是一种使用自然语言处理和机器学习技术的语音识别软件。借助呼叫中心的语音分析&#xff0c;您可以将实时语音转换为文本。之后&#xff0c;程序会评估此文本以揭示有关客户需求、偏好和情绪的详细信息。 在联络中心&#xff0c;语音分析工具有助于&…

OpenCV函数

1&#xff0c;cv2.imread cv2.imread:这个函数可以直接用cv2.imread(filename, cv2.IMREAD_GRAYSCALE)直接将图片以黑白图像输入&#xff0c;也可以通过cv2.imread(img, 0)来将图片以黑白图像输入。其实这两者是一样的&#xff0c;如下图所示&#xff0c;可以将特定的颜色通道…

C语言程序设计之结构体篇2

程序设计之结构体2 问题2_1的代码2_1结果2_1 问题1_2代码1_2结果1_2 问题1_3代码1_3结果1_3 问题1_4代码1_4结果1_4 问题2_1的 函数 f u n fun fun 的功能是&#xff1a; 对 N N N 名学生的学习成绩&#xff0c;按从高到低的顺序找出前 m m m &#xff08; m < 10 m<1…

『 C++11 』模板可变参数包,Lambda表达式与 function 包装器

文章目录 模板可变参数模板可变参数包的展开可变参数包与STL容器中的emplace函数关系 Lambda 表达式function 包装器function 包装器对成员函数的包装bind 绑定 模板可变参数模板 可变参数模板是C11引入的一个特性,允许模板接收任意数量的参数; 该特性增加了C的泛型编程能力; 可…

搭建jenkins一键部署java项目

一、搭建jenkins 链接: https://pan.baidu.com/s/1jzx15PiyI8EhLd_vg7q8bw 提取码: ydhl 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 直接使用docker导入镜像&#xff0c;运行就好 docker run -di --name jenkins -p 8080:8080 -v /home/jenkins_home:/var/je…

黑神话:悟空

《黑神话&#xff1a;悟空》是由游戏科学公司制作的以中国神话为背景的动作角色扮演游戏&#xff0c;将于2024年8月20日发售 [9] [14]&#xff0c;简体中文PC标准版售价268人民币,数字豪华版售价328人民币。 [27] [34] 游戏中&#xff0c;玩家将扮演一位“天命人”&#xff0c…

洗袜子的小洗衣机哪款好?小户型洗衣机推荐!懒人洗袜子神器分享

市面上的那些迷你的小型洗衣机可以洗袜子&#xff0c;洗涤空间够一次性洗5-6双左右的袜子&#xff01;这种不仅不会因为清洗的衣物数量少而浪费水浪费电&#xff0c;同时使用也很便利&#xff0c;小小个的放在家的任意角落就可以进行清洗&#xff0c;不仅是清洗袜子这些&#x…

jquery.ajax + antd.Upload.customRequest文件上传进度

前情提要&#xff1a;大文件分片上传&#xff0c;需要利用Upload的customRequest属性自定义上传方法。也就是无法通过给Upload的action属性赋值上传地址进行上传&#xff0c;所以Upload组件自带的上传进度条&#xff0c;也没法直接用了&#xff0c;需要在customRequest中加工一…

GraphSAGE (SAmple and aggreGatE)知识总结

1.前置知识 inductive和transductive 模型训练&#xff1a; Transductive learning在训练过程中已经用到测试集数据&#xff08;不带标签&#xff09;中的信息&#xff0c;而Inductive learning仅仅只用到训练集中数据的信息。 模型预测&#xff1a; Transductive learning只能…

6.前端怎么做一个验证码和JWT,使用mockjs模拟后端

流程图 创建一个发起请求 创建一个方法 getCaptchaImg() {this.$axios.get(/captcha).then(res > {console.log(res);this.loginForm.token res.data.data.tokenthis.captchaImg res.data.data.captchaImgconsole.log(this.captchaImg)})}, captchaImg: "", 创…

【数据结构】排序基本概念、插入排序、希尔排序(详解)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…

java学习--泛型

前言 当我们将dog类放入集合List中想要遍历通过一下手段可实现遍历名字和年龄&#xff0c;但是当我们要加入一个新的Cat类时&#xff0c;他并不会报错&#xff0c;只有编译了才会报错&#xff0c;因为在这一步的时候注定了只能是Dog类&#xff0c;但这是非常不方便的 此时我们…

哦吼,新模型?文生图领域的新模型FLUX.1(附模型下载网盘地址和详细使用方法)

&#x1f3a1;背景 Black Forest Labs 是由 Stable Diffusion 原班人马成立的公司&#xff0c;致力于研发优质的多模态模型并开源。该公司由多位前 Stability AI 研究员组成&#xff0c;包括 Robin Rombach 在内的团队成员&#xff0c;他们在图像和视频生成领域有着杰出的贡献…

取消订单业务

文章目录 概要整体架构流程技术细节小结 概要 取消订单是电子商务、外卖平台、在线零售等多个行业中常见的业务需求之一。这项功能允许消费者或商家取消已下的订单&#xff0c;通常是因为各种原因&#xff08;如商品缺货、配送问题、支付问题等&#xff09;。 需求分析以及接…

【课程总结】day19(中):Transformer架构及注意力机制了解

前言 本章内容&#xff0c;我们将从注意力的基础概念入手&#xff0c;结合Transformer架构&#xff0c;由宏观理解其运行流程&#xff0c;然后逐步深入了解多头注意力、多头掩码注意力、融合注意力等概念及作用。 注意力机制&#xff08;Attension&#xff09; 背景 深度学…