javascript - Jsx 返回对象并导致无限循环
问题描述
我正在学习 React,我有这个代码片段,它通过返回必要的 JSX 来构建一个 html 表(数据有 100 多个对象条目)。
对于上下文,数据也是一个对象数组:
[{},{},{}]
const [trafficData, setTrafficData] = useState();
getTrafficDetails().then(r => {
setTrafficData(r);
})
<TrafficWidget data={trafficData} />
消费于:
const TrafficWidget = ({ data }) => {
let [trafficStatus, setTrafficStatus] = useState([]);
if (data && data.length > 0) {
const mapData = data.map((item) => {
return (
<tr key={item.id}>
<td>{item.name}</td>
<td>{item.totalEmission}</td>
</tr>
);
});
setTrafficStatus(mapData);
}
return(<tbody>{trafficStatus}</tbody>)
}
我遇到的问题是,当我询问mapData
数组时,它显示为{$$typeof: Symbol(react.element), type: "tr", key: "082", ref: null, props: {…}, …}
然后导致Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
为什么当我返回 jsx 时它会作为一个对象出现,为什么这会导致无限循环?
解决方案
const { Fragment } = React
const TrafficWidget = ({
data
}) => (
<tbody>
{data.map((item) => (
<Fragment key={item.id}>
<tr>
<td>{item.name}</td>
<td>{item.totalEmission}</td>
</tr>
</Fragment>
))}
</tbody>
)
let data = [
{
name: "Henry",
totalEmission: 500,
id: "936-DEF12"
},
{
name: "Nick",
totalEmission: 200,
id: "843-7266B"
},
]
ReactDOM.render(<TrafficWidget data={data} />, document.getElementById('main'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<main id="main">loading or error...</main>
推荐阅读
- typescript - 在手写的 d.ts 文件中,如何从模块根目录中的一个命名空间公开函数?
- opencv - darknet_images.py 没有检测到任何物体。暗网 YOLOv4
- wordpress-rest-api - phpcUrl 不返回最新的 JSON 数据
- visual-studio-code - 远程 VS Code 上的 jupyter notebook 的颜色主题很奇怪
- excel - 在 Excel 中使用 VLOOKUP 不断返回 N/A 错误
- python - 有没有办法循环遍历熊猫数据框名称来绘制图形?
- asp.net-mvc - 剑道网格中已发布版本上的不同过滤器图标
- qt - Qt Qml 垂直标签栏
- spring - Spring @Bean - Spring Bean 的创建依赖于服务类名
- kubernetes - 分布式 OrientDB 在 kubernetes 中相互连接的问题