我是React的新手,我想将对象数据从一个子组件移动到另一个子组件,这是我的代码:
import React from "react";
import SiteRow from "./SiteRow";
import AlertList from "../Alerts/AlertList";
import data from "../../static/fixtures/data.json";
const SiteList = () => {
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={data.sites} />
</table>
</div>
<AlertList />
</div>
);
};
export default SiteList;
当我点击SiteRow
组件中的一行时,必须在AlertList
的子组件AlertRow
中显示数据,我一直在寻找这个,但我被卡住了,知道吗?
谢谢。
我读过关于React Context的文章,但我没有分享数据的想法。
有几种方法可以做到这一点,
- 一种方法是在两者的父组件中创建一个状态子组件
- 第二种方法是初始化React上下文
- 否则,存在用于全局的外部库,如redux共享状态
最简单的方法是将状态放置在它们的共同祖先中,在本例中为SiteList
。
在SiteRow
中,您创建了一个回调道具(下面演示中的onSelectSite
(,每次单击一行时都会调用它。在SiteList
中,您将使用该回调来更新状态(下面演示中的selectedSite
(。然后,您将把这样的状态传递给AlertList
。
参见工作演示:
const data = {sites: [{site: 'click me aaa'}, {site: 'click me bbb'}]};
const AlertList = ({ site }) => {
return (
<div>
<hr />
AlertList - selected site: {JSON.stringify(site)}
</div>
);
}
const SiteRow = ({ sites, onSelectSite }) => {
return (
<tbody>
{sites.map(s => <tr onClick={e => onSelectSite(s, e)}><td>{s.site}</td></tr>)}
</tbody>
);
}
const SiteList = () => {
const [selectedSite, setSelectedSite] = React.useState(null);
const handleSelectedSite = (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={data.sites} onSelectSite={handleSelectedSite} />
</table>
</div>
<AlertList site={selectedSite} />
</div>
);
};
ReactDOM.createRoot(document.getElementById('app')).render(<SiteList />);
table, tr, td {
border: 1px solid black;
border-collapse: collapse;
}
td { color: blue; cursor: pointer; }
<script type="text/javascript" src="//unpkg.com/react@18/umd/react.production.min.js"></script>
<script type="text/javascript" src="//unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
<div id="app"></div>
如果你有一个很深的组件树。还有其他方法可以简化道具的传递,例如Context或像Redux这样的库。