You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React组件间传值问题:子组件间数据交互实现方案咨询

解决思路:通过父组件做中间层传递数据

对于你这种兄弟组件(SiteRow 和 AlertList)之间的传值需求,最适合新手的方式是状态提升——把共享状态放到它们的共同父组件SiteList里,通过回调和props传递数据,比React Context更直观好上手。

具体步骤如下:

1. 在SiteList中添加状态存储选中的站点数据

用React的useState钩子创建状态,用来保存用户点击的SiteRow行对应的站点对象。

2. 给SiteRow传递点击回调函数

当用户点击SiteRow里的某一行时,调用这个回调函数,把选中的站点数据传给SiteList,更新状态。

3. 把选中的站点数据传给AlertList

将SiteList中存储的选中站点数据作为props传给AlertList,AlertList再把数据传给AlertRow展示。

修改后的SiteList代码

import React, { useState } from "react";
import SiteRow from "./SiteRow";
import AlertList from "../Alerts/AlertList";
import data from "../../static/fixtures/data.json";

const SiteList = () => {
    // 初始化选中站点状态,默认值设为null
    const [selectedSite, setSelectedSite] = useState(null);

    // 定义回调函数,接收选中的站点数据
    const handleSiteSelect = (site) => {
        setSelectedSite(site);
    };

    return (
      <div className="row">
        <div className="col-8">
          <table className="table table-bordered">
            <thead>
              <tr>
                <th scope="col">Site</th>
                <th scope="col">Alerts</th>
                <th scope="col">Savings</th>
                <th scope="col">Uptime</th>
                <th scope="col">Power</th>
              </tr>
            </thead>
            {/* 给SiteRow传递sites数组和点击回调 */}
            <SiteRow sites={data.sites} onSiteSelect={handleSiteSelect} />
          </table>
        </div>
        {/* 给AlertList传递选中的站点数据 */}
        <AlertList selectedSite={selectedSite} />
      </div>
    );
};

export default SiteList;

SiteRow组件的修改示例

需要在渲染每一行的时候绑定点击事件,触发父组件传来的onSiteSelect回调:

import React from "react";

const SiteRow = ({ sites, onSiteSelect }) => {
    return (
        <tbody>
            {sites.map(site => (
                // 给行绑定点击事件,把当前site对象传给回调
                <tr key={site.id} onClick={() => onSiteSelect(site)} style={{ cursor: 'pointer' }}>
                    <td>{site.name}</td>
                    <td>{site.alertsCount}</td>
                    <td>{site.savings}</td>
                    <td>{site.uptime}</td>
                    <td>{site.power}</td>
                </tr>
            ))}
        </tbody>
    );
};

export default SiteRow;

AlertList和AlertRow的修改示例

AlertList接收selectedSite,传给AlertRow展示对应告警:

// AlertList.jsx
import React from "react";
import AlertRow from "./AlertRow";

const AlertList = ({ selectedSite }) => {
    // 未选中站点时显示提示
    if (!selectedSite) {
        return <div>请选择一个站点查看告警</div>;
    }

    return (
        <div className="col-4">
            <h3>{selectedSite.name} 的告警</h3>
            {/* 把选中站点的告警数据传给AlertRow */}
            <AlertRow alerts={selectedSite.alerts} />
        </div>
    );
};

export default AlertList;
// AlertRow.jsx
import React from "react";

const AlertRow = ({ alerts }) => {
    return (
        <ul className="list-group">
            {alerts.map(alert => (
                <li key={alert.id} className="list-group-item">
                    <strong>{alert.title}</strong>: {alert.description}
                </li>
            ))}
        </ul>
    );
};

export default AlertRow;

为什么不用React Context?

Context适合跨多层组件共享数据的场景(比如用户登录状态、全局主题配置),而你的需求只是兄弟组件之间传值,用父组件做中间层的方式更简单直接,不需要额外理解Context的Provider、Consumer逻辑,先掌握这种基础的状态传递方式,之后再学习Context会更容易。

内容的提问来源于stack exchange,提问作者Guillermo Alfonso Morales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:01:11