【Vue3】组件通信之props

news2024/9/22 9:47:07

【Vue3】组件通信之props

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

背景

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

简介

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

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>
        <div class="blog" v-for="blog in blogs" :key="blog.id">
            <div class="blog-title">标题:{{ blog.title }}</div>
            <div class="blog-author">作者:{{ author }}</div>
            <div class="blog-content">{{ blog.content }}</div>
        </div>
    </div>
</template>

<script setup lang="ts">
const data = defineProps(['author', 'blogs'])
</script>

<style scoped lang="scss">
.content {
    background-color: aquamarine;
    padding: 20px;
    .blog {
        border: 1px solid gray;
        border-radius: 5px;
        padding: 0 10px;
        margin-top: 5px;
        div {
            padding: 10px 5px;
        }
        .blog-title {
            font-weight: bold;
        }
        .blog-author {
            font-size: small;
            font-style: italic;
        }
        .blog-content {
            font-size: small;
        }
    }
}
</style>

注意:需要使用 defineProps 定义接收父组件的哪些 props,如果这里没有定义,则即使父组件有传值,子组件也不能使用。defineProps 的参数是一个数组。
因为用到了 CSS 预处理器,所以需要执行 npm install -D sass 命令安装。

5> 修改 Vue 根组件 src/App.vue,引用以上子组件并向其传值。

<template>
  <div class="parent">
    <h1>父组件</h1>
    <h2>Blog数量:{{ blogs.length }}</h2>
    <Blog :blogs="blogs" :author="author" />
  </div>
</template>

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

const author = ref('Nick')

const blogs = reactive([
  { id: '001', title: '美国大选', content: '美国大选将于...' },
  { id: '002', title: '奥运奖牌', content: '截止今日奥运奖牌榜...' },
  { id: '003', title: '俄乌战争', content: '乌克兰单方面提出希望和谈...' },
  { id: '004', title: '巴以冲突', content: '巴以冲突最新战况...' },
])
</script>

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

可见,父组件向子组件传值只需在子组件标签上添加自定义属性(:blogs="blogs" :author="author")。

6> 执行命令 npm run dev 启动应用,浏览器访问:http://localhost:5173/
在这里插入图片描述
通过颜色可以辨别组件范围,可以看到子组件正确呈现出了来自父组件的数据。

7> 修改 Vue 根组件 src/App.vue,实现父组件接收来自子组件的数据。

<template>
  <div class="parent">
    <h1>父组件</h1>
    <h2>Blog数量:{{ blogs.length }}</h2>
    <h2>浏览数量:{{ readTimes }}</h2>
    <Blog :blogs="blogs" :author="author" :syncReadTimes="syncReadTimes" />
  </div>
</template>

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

const author = ref('Nick')

const blogs = reactive([
  { id: '001', title: '美国大选', content: '美国大选将于...' },
  { id: '002', title: '奥运奖牌', content: '截止今日奥运奖牌榜...' },
  { id: '003', title: '俄乌战争', content: '乌克兰单方面提出希望和谈...' },
  { id: '004', title: '巴以冲突', content: '巴以冲突最新战况...' },
])

const readTimes = ref(0)

function syncReadTimes(value) {
  readTimes.value += value
}
</script>

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

可见,父组件定义了一个方法 syncReadTimes,并将此方法作为子组件的自定义属性(:syncReadTimes="syncReadTimes")传入。

7> 修改子组件,实现向父组件传数据。

<template>
    <div class="content">
        <h1>子组件</h1>
        <div class="blog" v-for="blog in blogs" :key="blog.id">
            <div class="blog-title">标题:{{ blog.title }}</div>
            <div class="blog-author">作者:{{ author }}</div>
            <div class="blog-content">{{ blog.content }}</div>
            <button @click="syncReadTimes(1)">浏览量+1</button>
        </div>
    </div>
</template>

<script setup lang="ts">
const data = defineProps(['author', 'blogs', 'syncReadTimes'])
</script>

<style scoped lang="scss">
.content {
    background-color: aquamarine;
    padding: 20px;
    .blog {
        border: 1px solid gray;
        border-radius: 5px;
        padding: 0 10px;
        margin-top: 5px;
        div {
            padding: 10px 5px;
        }
        .blog-title {
            font-weight: bold;
        }
        .blog-author {
            font-size: small;
            font-style: italic;
        }
        .blog-content {
            font-size: small;
        }
        button {
            margin: 10px 0;
        }
    }
}
</style>

首先要在 defineProps 中定义接收来自父组件的 syncReadTimes,然后增加一个按钮 <button>,每点击一次便调用父组件的 syncReadTimes 并传入数据 1

8> 浏览器页面(http://localhost:5173/)刷新后点击按钮,会发现父组件中的 浏览数量 显示随点击次数增加。
在这里插入图片描述

总结

Vue3 中 props 可以实现父组件与子组件间的双向数据通信:

  • 子组件通过 defineProps 定义接收父组件的哪些数据;
  • 父组件将传给子组件的数据通过自定义属性添加到组件标签上;
  • 父组件如果要接收来自子组件的数据,则定义一个方法,并将此方法作为自定义属性添加到组件标签上,子组件通过 defineProps 定义接收此方法引用,通过调用此方法向父组件传数据。

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

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

相关文章

发送邮箱调用接口时需要注意哪些安全事项?

发送邮箱调用接口的使用方法&#xff1f;如何集成三方API接口&#xff1f; 无论是系统通知、用户注册验证还是营销邮件&#xff0c;这些功能都依赖于邮件发送接口的稳定和安全。然而&#xff0c;确保这些接口的安全性是至关重要的&#xff0c;AokSend将详细讨论在发送邮箱调用…

超13万律师使用的工具,启信宝推出“司法大数据”功能

合合信息旗下的启信宝&#xff0c;作为行业领先的商业查询APP&#xff0c;依托其3亿企业及机构的实时动态数据&#xff0c;涵盖工商、股权、司法、知识产权等多维度信息&#xff0c;推出了“司法大数据”功能。 随着大数据、人工智能技术的发展&#xff0c;律师行业已转型为开…

怎么写文献综述

怎么写文献综述 写文献综述是对已有文献资料进行系统性和批判性的评述和总结&#xff0c;以了解当前研究领域的研究成果和发展动态。 以下是撰写文献综述的一般步骤&#xff1a; 选择主题和目标&#xff1a; 确定你要综述的主题领域&#xff0c;并明确综述的目标和范围。这有…

蓝牙网关和蓝牙MESH总结

可参考&#xff1a; https://zhuanlan.zhihu.com/p/695144946 蓝牙网关 参考&#xff1a; https://www.bilibili.com/read/cv28872282/ 蓝牙网关是一种特殊的网络设备&#xff0c;它能够实现蓝牙设备与互联网或其他类型网络之间的数据传输和通信。通过蓝牙网关&#xff0c;用户…

Leetcode238. 除自身以外数组的乘积(java实现)

今天分享的题目是letcode238. 除自身以外数组的乘积 先来看题目描述&#xff1a; 本道题我最先想到的是先乘积所有的元素&#xff0c;然后除以所有元素&#xff0c;但是本题无法使用除法。 本题的解题思路是使用前缀积。 拿nums[]{1,2,3,4}; 先遍历前缀积&#xff0c;num[0]的…

Spring AOP总结

1、AOP&#xff08;Aspect-Oriented Programming&#xff09;&#xff1a;面向切面编程让开发更高效。 工作中经常需要处理日志记录、事物管理、安全控制等跨越多个业务模块的公共逻辑。 它是一种编程的范式。它通过将跨多个业务模块的公共逻辑抽取并封装成独立的模块&#xf…

人工智能大模型综述学习笔记

目录 一、深度学习的局限性和大模型发展背景 二、大模型架构 1、多头自注意力机制 2、Transformer架构 三、常见大模型发展概况 1、语言大模型发展概况 掩码语言模型解释 因果语言模型解释 何时使用什么&#xff1f; 2、视觉-语言大模型 四、大模型的特点 1、大模型…

uni-app项目打包成H5部署到服务器

1. uni-app项目打包成H5部署到服务器 前端使用 uniapp开发项目完成后&#xff0c;需要将页面打包&#xff0c;生成H5的静态文件&#xff0c;部署在服务器上。这样通过服务器链接地址&#xff0c;直接可以在手机上点开来访问。   将项目打包成H5部署到服务器&#xff0c;然后链…

Java中类的构造

1.私有化成员变量。 2.空参构造方法。 3.带全部参数的构造方法。 4.get / set方法。 package demo;public class student{//1.私有化成员变量。//2.空参构造方法。//3.带全部参数的构造方法。//4.get / set方法。private String name;private int age;public student() {}pu…

基于SpringBoot+Vue的多媒体信息共享平台(带1w+文档)

基于SpringBootVue的多媒体信息共享平台(带1w文档) 基于SpringBootVue的多媒体信息共享平台(带1w文档) 随着武理多媒体信息共享平台的不断出现&#xff0c;用户需求不断增多&#xff0c;武理多媒体信息共享平台也不断的得到壮大。该系统主要是满足多方面的需求的实际需要&#…

MySQL案例:MHA实现主备切换(主从架构)万字详解

目录 MHA 概念 MHA的组成 特点 案例介绍 &#xff08;1&#xff09;案例需求 &#xff08;2&#xff09;案例实现思路 &#xff08;3&#xff09;案例拓扑图 &#xff08;4&#xff09;案例环境 案例步骤 基本环境配置 关闭防火墙和内核安全机制 安装数据库 授权…

数据结构——链式结构二叉树

目录 一、二叉树的链式结构 二、手动创建一棵链式二叉树 三、 二叉树的遍历 &#xff08;1&#xff09;前序遍历&#xff08;先序遍历&#xff09; &#xff08;2&#xff09;中序遍历 (3)后序遍历 四、二叉树的有关函数 &#xff08;1&#xff09;头文件 &#xff08;…

【机器学习】逻辑回归的梯度下降以及在一变量数据集、两变量数据集下探索优化的梯度下降算法

引言 在机器学习中&#xff0c;逻辑回归是一种用于二分类问题的方法。它使用逻辑函数&#xff08;也称为sigmoid函数&#xff09;来预测属于某个类别的概率。逻辑回归的损失函数通常是交叉熵损失&#xff0c;用于衡量预测值与真实值之间的差异 文章目录 引言一、逻辑回归的梯度…

电机的伺服调试和pid调节有什么异同?

电机的伺服调试和PID调节在调节控制系统的精度和性能方面都是重要的&#xff0c;但它们有不同的侧重点和方法&#xff1a; 伺服调试 定义&#xff1a;伺服调试是指对伺服系统进行优化和调整&#xff0c;以确保其在控制对象&#xff08;如电机&#xff09;上的表现达到预期。伺…

《LeetCode热题100》---<5.②普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的六道题 第三道&#xff1a;轮转数组&#xff08;中等&#xff09; 第四道&#xff1a;除自身以外数组的乘积&#xff08;中等&#xff09; 第三道&#xff1a;轮转数组&#xff08;中等&#xff09; 方法一&#xff1a;使用额外的数…

KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门

转载&#xff1a;KubeSphere 部署的 Kubernetes 集群使用 GlusterFS 存储实战入门 知识点 定级&#xff1a;入门级 GlusterFS 和 Heketi 简介 GlusterFS 安装部署 Heketi 安装部署 Kubernetes 命令行对接 GlusterFS 实战服务器配置(架构1:1复刻小规模生产环境&#xff0c;…

AI助力,轻松组建你的汽车梦之队!

咱汽车销售想增加目标客户&#xff0c;可不简单&#xff01;市场竞争那叫一个激烈&#xff0c;吸引客户注意力太难了&#xff01;不过别怕&#xff0c;咱有办法。我在 ai123.cn 这个平台上&#xff0c;找到了好多适合咱的 AI 工具和资源&#xff0c;这就跟大家分享分享。 比如说…

upload-labs漏洞靶场~文件上传漏洞

寻找测试网站的文件上传的模块&#xff0c;常见&#xff1a;头像上传&#xff0c;修改上传&#xff0c;文件编辑器中文件上传&#xff0c;图片上传、媒体上传等&#xff0c;通过抓包上传恶意的文件进行测试&#xff0c;上传后缀名 asp php aspx 等的动态语言脚本&#xff0c;查…

基于C语言从0开始手撸MQTT协议代码连接标准的MQTT服务器,完成数据上传和命令下发响应(华为云IOT服务器)

文章目录 一、前言二、搭建开发环境三、网络编程基础概念科普3.1 什么是网络编程3.2 TCP 和 UDP协议介绍3.3 TCP通信的实现过程 四、Windows下的网络编程相关API介绍4.1 常用的函数介绍4.2 函数参数介绍4.3 编写代码体验网络编程 五、访问华为云IOT服务器创建一个产品和设备5.2…

STM32ADC

ADC简介&#xff1a;有打moba游戏的别搞混了&#xff0c;这不是射手adc。在32中&#xff0c;ADC的全称为&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 也就是模拟-数字电路的转换器。其实通俗的来讲&#xff0c;它就是一个电压表。 目录 一.ADC原理…