《react 实战系列》children 透传
接水怪
共 3136字,需浏览 7分钟
· 2021-09-25
问题
react 三层组件,也就是常说的爷孙组件,怎么通信?
方案一,props 直接传
我称之为暴力写法(因为这种方式,其实不管嵌套多少层,都可以这样写,很暴力),直接看代码。
function Top () {
const [middleData] = useState(1);
const [bottomData] = useState(2);
return <Middle middleData={middleData} bottomData={bottomData} />
}
function Middle ({ middleData, bottomData }) {
return (
<>
{middleData}
<Bottom bottomData={bottomData} />
</>
)
}
function Bottom ({ bottomData }) {
return <>{bottomData}</>
}
Bottom 组件通过 Middle 组件中转,成功拿到了 Top 组件的值。那这样有什么问题呢?
这样写,如果 Top 组件需要传递其它数据给到 Bottom,就意味着 Middle 组件需要加字段。
方案一改进版
我们把所有需要从 Top 传递给 Bottom 的封装为一个字段,比如叫 allBottomProps。
function Top () {
const [middleData] = useState(1);
const [bottomData] = useState(2);
return <Middle middleData={middleData} allBottomProps={{ bottomData: bottomData }} />
}
function Middle ({ middleData, allBottomProps }) {
return (
<>
{middleData}
<Bottom {...allBottomProps} />
</>
)
}
function Bottom ({ bottomData }) {
return <>{bottomData}</>
}
这样改进之后,Top 组件需要给 Bottom 传递其它数据时,就不需要去动 Middle 的代码了。那这样还有什么问题吗?能不能把 Middle 这层抹平,不然即使封装在一个字段,还是逃脱不了 Middle 的魔爪。我想直接测试 Middle 时,还得造一份 Bottom 组件的数据。
方案二,通过 children 透传
先看代码(类似于 vue 中的 slot),再来分析
function Top () {
const [middleData] = useState(1);
const [bottomData] = useState(2);
return (
<>
<Middle middleData={middleData}>
<Bottom bottomData={bottomData} />
</Middle>
</>
)
}
function Middle ({ middleData, children }) {
return (
<>
{middleData}
{children}
</>
)
}
function Bottom ({ bottomData }) {
return <>{bottomData}</>
}
利用 children 处理之后,优点比较明显:
Middle 组件变得更加的独立,跟 Bottom 不再耦合 直接在 Top 组件就可以进行数据的分发 直接在 Top 组件就可以看清楚组件的结构,很清晰
小结
业务代码,并且嵌套的层级不算深,可以试试 children 透传。结构简单、清晰。
下期预告
十一将至,相信很多小伙伴都要骑上心爱的小摩托出去旅游。作为一个土生土长的重庆人,决定简短写一篇攻略(主要是吃),让去重庆的小伙伴不踩雷,吃到正宗的美食。
像很多网红点都是不推荐去吃的,商业化太严重,已经变得不纯粹了。具体下篇细说咯~~~
评论
5000w+ 的大表如何拆?亿级别大表拆分实战复盘
前言笔者是在两年前接手公司的财务系统的开发和维护工作。在系统移交的初期,笔者和团队就发现,系统内有一张5000W+的大表。跟踪代码发现,该表是用于存储资金流水的表格,关联着众多功能点,同时也有众多的下游系统在使用这张表的数据。进一步的观察发现,这张表还在以每月600W+的数据持续增长,也就是说,不超
码农编程进阶笔记
0
新时代写作与互动:《一本书讲透 Elasticsearch》读者群的创新之路
1、《一本书讲透 Elasticsearch》销售最近进展汇报给大家同步一下《一本书讲透 Elasticsearch》图书的进展情况,本周五(2024年4月26日),出版社编辑老师反馈图书相关销量进展:预计全网销量 1000 册+,发货量 2462 册(截止2024年4月28日)。2023年12月2
铭毅天下
0
Go 1.22 的新增功能系列之二:reflect.TypeFor
Go 1.22 的第一个候选版本已经发布,这意味着最终版本即将发布,现在是我在博客中介绍我在这个周期中所做工作的时候了。像往常一样,我的贡献很小,但它们是我的,所以我将从幕后的角度来谈谈它们。首先是reflect.TypeFor。这是整个函数:// TypeFor returns the [Type
GoCN
0
宇宙的尽头是编制?985高校硕士拟聘遗体火化工疯传!
本文来源:大皖新闻、潇湘晨报、南都街谈、超级数学建模、创业邦4月22日,广州市民政局网站发布的《广州市民政局直属事业单位2023年第一次公开招聘工作人员拟聘用人员公示(第一批)》引发舆论关注。名单中有毕业于香港中文大学的刘某拥有研究生学历,专业为哲学(佛学研究),另外二人本科分别毕业于华南理工大学建
机器学习初学者
0
Go 1.22 的新增功能系列之一:cmp.Or
截至撰写本文时,Go 1.22 已经发布几个月了。早就该结束我为 1.22 所做的工作的系列了。抱歉耽搁了这么久,我最近忙于生活事务。如果您错过了我关于reflect.TypeFor(https://blog.carlana.net/post/2024/golang-reflect-type-for
GoCN
1
React正在杀死Angular吗?
点击上方 前端Q,关注公众号回复加群,加入前端Q技术交流群作者 |Hassan Trabelsi
策划 & 翻译 |张卫滨这是一个老生常谈的争论(在技术时代,这是在所难免的):Angular 对战 React。这就像“先有鸡还是先有蛋”的难题,不过这个问题是针对 Web 开发
前端Q
0
【每周一课#06】MidJourney应用实战
#AI绘画# #MJ# #文生图#时间:4月24日周三 21:00课程大纲:1、关于AIGC:概念、发展历程、就业前景2、MJ基础认识:如何使用、底层逻辑、MJ与SD优缺点比较3、MJ基础功能介绍:任务指令、后缀参数、图生图、图生文、垫图、局部修改等4、MJ应用场景与变现方向
Python涨薪研究所
0
【每周一课#06】MidJourney 应用实战
#AI绘画# #MJ# #文生图#时间:4月24日周三 21:00课程大纲:1、关于AIGC:概念、发展历程、就业前景2、MJ基础认识:如何使用、底层逻辑、MJ与SD优缺点比较3、MJ基础功能介绍:任务指令、后缀参数、图生图、图生文、垫图、局部修改等4、MJ应用场景与变现方向
Python涨薪研究所
0