当前位置: 首页 > news >正文

react通过上下文深入传递数据

通常,您将通过 props 将信息从父组件传递到子组件。但是,如果必须将道具传递到中间的许多组件,或者应用中的许多组件需要相同的信息,则传递道具可能会变得冗长且不方便。Context 允许父组件将一些信息提供给其下树中的任何组件(无论其深度如何),而无需通过 prop 显式传递它。

传递道具的问题

传递道具是将数据通过 UI 树显式传递到使用它的组件的好方法。

但是,当您需要将一些道具深入树中传递时,或者如果许多组件需要相同的道具时,传递道具可能会变得冗长和不方便。最接近的共同祖先可能与需要数据的组件相距甚远,将状态提升到如此高的水平可能会导致一种称为“支柱钻孔”的情况。

如果有一种方法可以在不传递道具的情况下将数据“传送”到树中需要它的组件,那不是很好吗?有了 React 的上下文功能,就有了!

上下文:传递道具的替代方案

Context 允许父组件向其下的整个树提供数据。上下文有很多用途。下面是一个例子。考虑以下接受 a 大小的组件:Headinglevel

import Heading from './Heading.js';
import Section from './Section.js';export default function Page() {return (<Section><Heading level={1}>Title</Heading><Heading level={2}>Heading</Heading><Heading level={3}>Sub-heading</Heading><Heading level={4}>Sub-sub-heading</Heading><Heading level={5}>Sub-sub-sub-heading</Heading><Heading level={6}>Sub-sub-sub-sub-heading</Heading></Section>);
}
export default function Section({ children }) {return (<section className="section">{children}</section>);
}
export default function Heading({ level, children }) {switch (level) {case 1:return <h1>{children}</h1>;case 2:return <h2>{children}</h2>;case 3:return <h3>{children}</h3>;case 4:return <h4>{children}</h4>;case 5:return <h5>{children}</h5>;case 6:return <h6>{children}</h6>;default:throw Error('Unknown level: ' + level);}
}

假设您希望同一标题中的多个标题始终具有相同的大小:Section

import Heading from './Heading.js';
import Section from './Section.js';export default function Page() {return (<Section><Heading level={1}>Title</Heading><Section><Heading level={2}>Heading</Heading><Heading level={2}>Heading</Heading><Heading level={2}>Heading</Heading><Section><Heading level={3}>Sub-heading</Heading><Heading level={3}>Sub-heading</Heading><Heading level={3}>Sub-heading</Heading><Section><Heading level={4}>Sub-sub-heading</Heading><Heading level={4}>Sub-sub-heading</Heading><Heading level={4}>Sub-sub-heading</Heading></Section></Section></Section></Section>);
}
export default function Section({ children }) {return (<section className="section">{children}</section>);
}
export default function Heading({ level, children }) {switch (level) {case 1:return <h1>{children}</h1>;case 2:return <h2>{children}</h2>;case 3:return <h3>{children}</h3>;case 4:return <h4>{children}</h4>;case 5:return <h5>{children}</h5>;case 6:return <h6>{children}</h6>;default:throw Error('Unknown level: ' + level);}
}

目前,您将 prop 分别传递给每个:level<Heading>

<Section>
<Heading level={3}>About</Heading>
<Heading level={3}>Photos</Heading>
<Heading level={3}>Videos</Heading>
</Section>

如果您可以将 prop 传递给组件并将其从 .这样,您可以强制同一部分中的所有标题都具有相同的大小:level<Section><Heading>

<Section level={3}>
<Heading>About</Heading>
<Heading>Photos</Heading>
<Heading>Videos</Heading>
</Section>

相关文章:

  • 嵌入式进阶——LED呼吸灯(PWM)
  • 封装 UpdateManager 实现启动微信小程序时自动强制更新
  • Python | 一文搞定列表推导式
  • 微信小程序源码-基于Java后端的小区租拼车管理信息系统毕业设计(附源码+演示录像+LW)
  • web学习笔记(五十六)
  • windows 7 10 11快捷键到启动页面
  • 对systemverilog/verilog中forever语法的理解
  • 【实战JVM】-基础篇-03-Java内存结构
  • mybatis 注解式 XML式 通用mapper(tk-mybatis)使用
  • Spring AOP源码分析
  • 基于MetaGPT构建LLM多智能体
  • c++ using 关键字
  • React 路由5版本的使用详解(基于Class类版本的使用react-router-dom@5)
  • 【编译原理复习笔记】中间语言
  • RK 11.0 多屏模式下修改鼠标进入方式
  • [deviceone开发]-do_Webview的基本示例
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【翻译】babel对TC39装饰器草案的实现
  • 3.7、@ResponseBody 和 @RestController
  • CentOS7简单部署NFS
  • Django 博客开发教程 16 - 统计文章阅读量
  • hadoop集群管理系统搭建规划说明
  • JavaScript类型识别
  • SpingCloudBus整合RabbitMQ
  • TCP拥塞控制
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vue数据传递--我有特殊的实现技巧
  • 半理解系列--Promise的进化史
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 前端知识点整理(待续)
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​低代码平台的核心价值与优势
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (2)leetcode 234.回文链表 141.环形链表
  • (2)STL算法之元素计数
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (poj1.2.1)1970(筛选法模拟)
  • (SpringBoot)第二章:Spring创建和使用
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (九)信息融合方式简介
  • (转)http协议
  • (转)Scala的“=”符号简介
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET COER+CONSUL微服务项目在CENTOS环境下的部署实践
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .NET Project Open Day(2011.11.13)
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .Net--CLS,CTS,CLI,BCL,FCL
  • .NET设计模式(2):单件模式(Singleton Pattern)