JSX中递归遍历n层树形嵌套JSON渲染节点的实现问题
问题原因
现有代码无法渲染子层级,是三个逻辑错误导致的:
- 递归遍历gates的代码写在了return语句之后,只要传入的plotObject不为空,函数会直接返回当前层级的population div,后续遍历逻辑永远不会执行
- 递归调用时写错了函数名:遍历gates节点时写的是
plotObject(gate.plot),实际需要调用renderPlots函数本身,且遍历生成的子节点没有被return到JSX结构中 - 缺少空值兜底:如果某个plot节点没有gates字段,直接调用
.map会触发JS报错
修正方案
递归渲染树形结构的核心逻辑是:先渲染当前节点内容,再遍历所有子节点,对每个子节点重复执行渲染逻辑,最终把所有层级的节点拼接为完整的JSX结构返回。
修正后的完整代码如下:
function Plot(props) { const renderPlots = (plotObject) => { // 空节点直接返回,不渲染 if (!plotObject) return null; return ( <> {/* 渲染当前节点的population字段 */} <div>{plotObject.population}</div> {/* 遍历所有子gate节点,递归渲染嵌套的plot */} {plotObject.gates?.map((gate, gateIndex) => ( // 加左内边距体现层级关系,不需要可删除 <div key={gateIndex} style={{ paddingLeft: '24px' }}> {renderPlots(gate.plot)} </div> ))} </> ); }; return ( <div style={{ height: "200px" }}> Render Plots: {/* 注意顶层数据结构,传入最外层的plot节点 */} {renderPlots(MultiStainState.plot)} </div> ); }
代码说明:
- 用可选链
?.访问gates字段,兼容没有子节点的叶子plot,不会触发map类型错误- 循环渲染时添加了key属性,符合React渲染规范
- 子层级增加了左内边距,渲染后可直观看出树形嵌套关系,不需要可删除对应样式
- 调用renderPlots时传入
MultiStainState.plot,匹配给出的顶层数据结构,避免拿不到population字段
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

