React 通信:深层传递(Props、Context、Children Jsx)

news2025/2/27 4:56:43

在之前的文章 探讨:围绕 props 阐述 React 通信 中总结了关于“父子”组件传值,但是当需要在组件树中深层传递参数以及需要在组件间复用相同的参数时,传递 props 就会变得很麻烦。

实际案例: 下述展示有两种状态:① 详情态;② 编辑态(tag形式)

组件设计:通过 isDetailed 来决定是“详情”还是“编辑”。

在这里插入图片描述
开发过程:拆分了四层,根组件设置了 isDetailed 来确定最终确定 <ViolationGroup> 中展示。

 {data.map((item) =>
    isDetailed ? (
      <div>{item.disposeReasonName}</div>
    ) : (
      <Tag bordered={false}>{item.disposeReasonName}</Tag>
    ),
  )}
根组件
DetailViolationGroupList
Item
ViolationGroup

props 传递(逐层传递)

根组件设置 isDetailed,然后逐层传递。

在这里插入图片描述

☝️缺点:需要找到最近的父节点,“状态提升” 到太高的层级会导致“逐层传递props”的情况。

✌️优势:这样做可以让哪些组件用了哪些数据变得十分清晰!

在这里插入图片描述

context 传递(深层传递)

Context 使组件向其下方的整个树提供信息,会穿过中间的任何组件。子组件可以通过某种方式“访问”到组件树中某处在其上层的数据。

无需逐层透传,直接广播形式!需要的组件直接获取。

在这里插入图片描述

  1. 创建 一个 context。(可以将其命名为 IsDetailedContext)
export const IsDetailedContext = createContext(false);
  1. 在需要数据的组件内 使用 刚刚创建的 context。(ViolationGroup 将会使用 IsDetailedContext
 const isDetailed = useContext(IsDetailedContext);
  1. 在指定数据的组件中 提供 这个 context。 (根组件 将会提供 IsDetailedContext
<IsDetailedContext.Provider value={true}>
  <DetailViolationGroupList violationGroupList={data?.detail?.violationGroupList}></DetailViolationGroupList>
</IsDetailedContext.Provider>

☝️缺点:对数据的抽离,导致理解成本略高。

✌️优势:许多组件需要相同的信息,避免通过许多中间组件向下传递 props(冗长)!

在这里插入图片描述

⚓ Context 的工作方式类似于 CSS 属性继承。在 React 中,覆盖来自上层的某些 context 的唯一方法是将子组件包裹到一个提供不同值的 context provider 中

包装成组件形式

定义:组件形式

/* context.js */
import { createContext, useContext } from 'react';

export const IsDetailedContext = createContext(false);

export const IsDetailedProvider = ({ children, isDetailed }) => {
  const originalIsDetailed = useContext(IsDetailedContext); // 原始默认值 false
  return (
     <IsDetailedContext.Provider value={isDetailed ?? originalIsDetailed}>
      {children}
    </IsDetailedContext.Provider>
  );
};

使用方

<IsDetailedProvider isDetailed={true}>
  <DetailViolationGroupList
    violationGroupList={data?.detail?.violationGroupList}
  ></DetailViolationGroupList>
</IsDetailedProvider>
知识点:空值合并运算符

🐾 空值合并运算符??)是一个逻辑运算符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。与逻辑或运算符(||)不同,逻辑或运算符会在左侧操作数为假值时返回右侧操作数。也就是说,如果使用 || 来为某些变量设置默认值,可能会遇到意料之外的行为。

'' ?? 1 // ''
'' || 1 // 1
0 ?? 1	// 0
0 || 1  // 1

与 state 结合

Context 不局限于静态值。如果在下一次渲染时传递不同的值,React 将会更新读取它的所有下层组件!可以和 state 结合使用。

children 传递(jsx)

抽象组件并将 JSX 作为 children 传递。

children
根组件
Item
ViolationGroup

上述示例,让 Itemchildren 当做一个参数,渲染 <Item><ViolationGroup isDetailed={true} /></Item>,然后去掉<DetailViolationGroupList> 层。这样就减少了定义数据的组件和使用数据的组件之间的层级。=> 直接在父组件中引用使用!

在这里插入图片描述

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

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

相关文章

智慧分流:探索互联网与物联网的负载均衡技术

数字化时代&#xff0c;个人认为&#xff0c;无论是互联网还是物联网&#xff0c;还是其他网&#xff0c;在各个层级&#xff0c;都对系统的稳定性和效率提出了更高的要求。负载均衡技术作为保障系统平稳运行的关键&#xff0c;其重要性不言而喻。在数字世界的海洋中&#xff0…

【TB作品】MSP430G2553,单片机,口袋板, 单相交流电压、电流计设计

题5 单相交流电压、电流计设计 设计基于MSP430的单相工频交流电参数检测仪。交流有效值0-220V&#xff0c;电流有效值0-40A。电压、电流值经电压、电流传感器输出有效值为0-5V的交流信号&#xff0c;传感器输出的电压、电流信号与被测电压、电流同相位。 基本要求如下 &#xf…

AI写作平台:提升文档撰写效率的神器

工欲善其事&#xff0c;必先利其器。 随着AI技术与各个行业或细分场景的深度融合&#xff0c;日常工作可使用的AI工具呈现出井喷式发展的趋势&#xff0c;AI工具的类别也从最初的AI文本生成、AI绘画工具&#xff0c;逐渐扩展到AI思维导图工具、AI流程图工具、AI生成PPT工具、AI…

电子竞赛6——基于DDS的正弦波发生器

前言 作为电子系统必不可少的信号源,在很大程度上决定了系统的性能, 因而常称之为电子系统的“心脏”。传统的信号源采用振荡器, 只能产生少数几种波形,自动化程度较低,且仪器体积大,灵活性与准确度差。而现在要求信号源能产生波形的种类多、频率高,而且还要体积小、可靠性高、…

推荐一款功能强大的显示器!

最近在写项目开发文档&#xff0c;经常需要几个界面来回切换&#xff0c;真的深刻感受到了一台外接显示器对一名程序员来说有多重要了&#xff0c;画功能流程图的时候嫌弃自己的笔记本屏幕不够大&#xff0c;看代码的时候又在想要是有个旋转屏就好了&#xff0c;来回切换界面的…

【OpenHarmony开发】自定义系统应用之实践

前言 OpenHarmony系统应用是指预装在OpenHarmony操作系统中的应用程序&#xff0c;也称为系统应用。这些应用程序通常由操作系统开发者开发&#xff0c;包括系统设置、电话、短信、浏览器、相机、音乐、视频等常用应用程序。这些应用程序通常具有更高的权限和更深入的系统集成…

看到漂亮的UI设计,就挪不开眼,还有救吗?

在App设计中&#xff0c;瓷片区&#xff08;Tile Area&#xff09;是指用于展示信息或功能的独立区域。瓷片区可以被设计成具有不同的形状、大小、颜色和内容。以下是瓷片区的一些作用&#xff1a; 信息展示&#xff1a; 瓷片区可以用于显示重要的信息&#xff0c;如最新消息、…

uni-app 表格tr添加点击事件

首先找到uni.tr这个组件的页面&#xff0c;路径uni_modules/uni-table/components/uni-tr/uni-tr.vue 然后添加点击事件 在你的表格页面就可以添加点击事件了

电脑C盘满了怎么清理?5招为您释放电脑空间!

“我的电脑使用了一段时间了&#xff0c;不知道是不是因为内存满了&#xff0c;现在很多功能都没办法使用。有什么方法可以清理c盘空间且不误删重要文件的吗&#xff1f;” 当我们打开电脑&#xff0c;发现系统提示C盘空间不足&#xff0c;或者电脑运行变得缓慢时&#xff0c;很…

LabVIEW电磁超声热态金属在线缺陷检测系统

LabVIEW软件开发的电磁超声热态金属在线缺陷检测系统针对极端高温环境下的金属材料&#xff0c;进行实时、无损的缺陷检测&#xff0c;具有高精度和高可靠性&#xff0c;能够显著提高材料质量控制的效率和准确性。 项目背景 随着工业技术的发展&#xff0c;高温环境下的金属材…

高德地图轨迹回放/轨迹播放

前言 本篇文章主要介绍高德地图的轨迹回放或播放的实现过程&#xff0c;是基于vue2实现的功能&#xff0c;同时做一些改动也是能够适配vue3的。其中播放条是用的是element UI中的el-slider组件&#xff0c;包括使用到的图标也是element UI自带的。可以实现轨迹的播放、暂停、停…

这三种电容在PCB设计中怎么摆放?

电容在高速 PCB 设计中起着重要的作用&#xff0c;通常也是 PCB 上用得多的器件。在 PCB 中&#xff0c;电容通 常分为滤波电容、去耦电容、储能电容等。 1 电源输出电容&#xff0c;滤波电容 我们通常把电源模块输入、输出回路的电容称为滤波电容。简单理解就是&#xff0c;…

56岁张卫健前任貌突然回春大进化?自曝婚礼前夕流产

现年56岁的江欣燕于1985年以18岁之龄参加第4届新秀歌唱大赛入行&#xff0c;曾拍过多部无线经典电视剧&#xff0c;包括《娱乐插班生》、《同事三分亲》及《女人俱乐部》等。现时甚少作幕前演出的江欣燕日前在社交平台上载分享了新短片&#xff0c;当中更以Deep V上阵&#xff…

Nacos 2.x 系列【14】临时实例、永久实例

文章目录 1. 概述2. 注册实例2.1 SDK2.2 Open API2.3 Spring Cloud 3. 临时实例4. 永久实例 1. 概述 Nacos 提供了两种服务类型供用户注册实例时选择&#xff1a; 临时实例&#xff1a;只是临时存在于注册中心中&#xff0c;会在服务下线或不可用时被注册中心剔除&#xff0c…

HTML基本标签使用【超链接标签、表格标签、表单标签、input标签】

目录 一、基本介绍1.1 概念1.2 HTML的核心特点 二、HTML基本标签三、超链接标签四、表格标签✌<table> 标签属性✍<tr> 标签属性✌ <td> 和 <th> 标签属性演示注意事项 五、表单标签综合应用 最后 一、基本介绍 1.1 概念 HTML&#xff0c;全称为超文…

AutoDL Python实现 自动续签 防止实例过期释放 小脚本 定时任务 apscheduler requests

背景介绍 平常对模型进行训练、微调的时候&#xff0c;我在 AutoDL 有一台主机。 但是有些主机环境我配置好了&#xff0c;又不想让它过期&#xff0c;可能过段时间还会再用。 我一不留神就会超过15天&#xff0c;导致我的机器给释放了很难受。 所以写了一个Python的小脚本&…

玩手游多开还停留在模拟器阶段?不如试试云手机

在手游的世界里&#xff0c;尤其是回合制和资源类游戏&#xff0c;采用多开账号以获取更多游戏资源或者体验不同的游戏策略&#xff0c;是许多玩家的需求。但其实&#xff0c;目前大多数玩家在实现手游多开时&#xff0c;还停留在使用模拟器的阶段。但实际上&#xff0c;有一种…

直播平台美颜技术分析:视频美颜SDK功能实现原理

本篇文章&#xff0c;笔者将深入分析视频美颜SDK的功能实现原理&#xff0c;探讨其在直播平台中的应用。 一、视频美颜技术概述 通过这些功能&#xff0c;用户可以在直播过程中呈现更加理想的自己&#xff0c;从而提高观众的观看体验和互动积极性。 二、视频美颜SDK的功能 1…

Java多线程基础知识-1

什么是程序&#xff1f; 可执行的文件。 什么是进程&#xff1f; 进程是程序一次动态执行的过程&#xff0c;它是资源分配与管理的基本单位。 什么线程&#xff1f; 线程是进程创建的&#xff0c;它是调度和执行的基本单位。线程不拥有系统资源&#xff0c;只拥有一点必不可…

YOLOv10训练自己的数据集(图像目标检测)

目录 1、下载代码 2、环境配置 3、准备数据集 4、yolov10训练 可能会出现报错&#xff1a; 1、下载代码 源码地址&#xff1a;https://github.com/THU-MIG/yolov10 2、环境配置 打开源代码&#xff0c;在Terminal中&#xff0c;使用conda 创建虚拟环境配置 命令如下&a…