如何在react/next.js app中的同级组件间传递数据

news/2024/7/15 18:06:19 标签: javascript, react.js, 开发语言, next.js

这篇文章也可以在我的博客中查看

问题

为什么会有这么奇怪的需求?在事情真正发生前真的难说,但真遇到一个需要这么做的情况。

最近想做一个网页时钟,它的结构如下:

+ 时钟(计算时间,组织各个要素)
|--+ 设置面板(时间设置)
|--+ 主题(显示时间的样式)
  1. 设置是针对于时钟的,比如:进制、时区……
  2. 主题可以不断增加,用于花里花哨地改变时钟的输出

但现在我需要为主题也增加设置项,加入到设置面板中
因此需要同级传递数据(主题->设置面板)

解决

改变结构

我也想过改变时钟的结构,比如:

+ 时钟(计算时间,组织各个要素)
|--+ 主题(显示时间的样式)
   |--+ 设置面板(时间设置)

这样主题、设置面板就是父子关系,想要往下传递数据使用一般的props属性就可以

但是我的设置面板本身是针对时钟的,也就是无论主题怎么更变,设置面板的总体样式都是不变的。
也就是,我布局设置面板,不需要主题的参与

虽然这么做是可以解决问题的,但针对这个案例:
我左思右想,最后还是认为:设置面板的父元素应该是时钟,而不是主题

父组件中介

先总结一下,各种流向信息在React中的传递方法是:

  1. 自上而下:向Props属性传入值
  2. 自下而上:向Props属性传入setState函数回调
  3. 全局:Context
  4. 同级:???

好吧。显然,最直截了当的方法是:把同级看做是一个“自下而上而下”操作

设置面板

子组件ClockSettings中,定义可插入的ReactNode元素插槽:

interface IClockSettingsProps {
    themeSettingsNode?: ReactNode,
}

export default function ClockSettings({ ...props }: IClockSettingsProps) {
	return (
		<div>
			{props.themeSettingsNode}
		</div>
	)
}

主题

首次渲染时调用onLoadSettings,传出该主题的设置项元素(ReactNode):

interface IClockProps {
    onLoadSettings?: (value: ReactNode) => void,
}

export default function ClockTheme1({ ...props }: IClockProps) {
    useEffect(() => {
        props.onLoadSettings?.(
            <div>
				{/* input element maybe... */}
            </div>
        )
    }, []);
}

父元素

最后,在父元素(时钟)里,组合数据的传递:

export default function Clock() {
    const [settingsNode, setSettingsNode] = useState<ReactNode>();
	return <>
        <ClockTheme1 onLoadSettings={setSettingsNode} />
        <ClockSettings themeSettingsNode={settingsNode} />
	</>
	)
}

小结

在同级组件之间传递数据,无论是简单数值还是复杂元素,都需要通过父组件作为跳板


http://www.niftyadmin.cn/n/5041976.html

相关文章

视频号视频怎么下载(视频号如何下载里面的视频)

根据大家分享出来的视频号如何下载里面的视频的相关提供的下载方案&#xff0c;我们特别总结了多款可以下载视频号视频怎么下载的办法&#xff01; 如果你还不会提取视频号里的视频&#xff0c;赶快来看看视频号里的视频怎么保存到相册的吧&#xff01; 1:视频下载缓存 该方法…

C#,数值计算——64位哈希表的计算方法与实现代码

1 文本格式 using System; namespace Legalsoft.Truffer { public class HashAll { public HashAll() { } /// <summary> /// Pseudo-DES hashing of the 64-bit word(lword, rword). Both 32-bit arguments /// are …

Flink1.14 Source概念入门讲解与源码解析

目录 Flink Source概念 Source Source源码 getBoundedness() createReader(SourceReaderContext readerContext) createEnumerator(SplitEnumeratorContext enumContext) SplitEnumerator restoreEnumerator(SplitEnumeratorContext enumContext, EnumChkT checkpoint) …

maven找不到jar包

配置settings.xml文件之后出现报错找不到jar包 先改maven设置: 然后在重新清理构建项目: 可以通过执行以下命令清理本地 Maven 仓库 mvn dependency:purge-local-repository

电动车充电桩存在网络安全风险吗?

近年来&#xff0c;随着纯电和混动汽车数量的爆炸式增长&#xff0c;其配套的充电桩的需求也呈直线攀升趋势。不过&#xff0c;这些充电桩可能面临着独特的网络安全风险。只要黑客们掌握了足够的相关信息&#xff0c;他们不但能够远程关闭供电网络&#xff0c;甚至会入侵和篡改…

STC15F104W控制3个74HC595芯片输出数码管显示

一、74HC595脚位图及说明 管脚说明&#xff1a; 14脚&#xff1a;DS&#xff08;SER&#xff09;&#xff0c;串行数据输入引脚 13脚&#xff1a;OE&#xff0c;输出使能控制脚&#xff0c;它是低电才使能输出&#xff0c;所以接GND 12脚&#xff1a;RCK&#xff08;STCP&…

Redis 有序集合操作实战(全)

目录 ZADD 加入有序集 ZCARD 取成员数量 ZCOUNT 计算区间成员数量 ZINCRBY 运算 ZRANGE 取区间成员(升序) ZRANGEBYSCORE 按分值排序取成员 ZRANK 取成员排名 ZREM 移除成员 ZREMRANGEBYRANK 按位置区间批量移除 ZREMRANGEBYSCORE 按分值区间移除 ZREVRANGE 取区间成…

InfluxDB时序数据库安装和使用

安装 下载 wget https://dl.influxdata.com/influxdb/releases/influxdb2-2.4.0-linux-amd64.tar.gz安装&#xff08;没有/opt/module/目录的话先创建&#xff09; tar -zxvf influxdb2-2.4.0-linux-amd64.tar.gz -C /opt/module/运行 cd /opt/module/influxdb2_linux_amd64…