
本文介绍如何在React中,无需递归,迭代渲染树形结构数据。 示例树形数据结构如下:
const root = {
value: "root",
children: [
{
value: "child 1",
children: [
{ value: "grandchild 1", children: [] },
{ value: "grandchild 2", children: [] },
],
},
{
value: "child 2",
children: [{ value: "grandchild 3", children: [] }],
},
],
};
目标渲染效果:
root --child 1 ----grandchild 1 ----grandchild 2 --child 2 ----grandchild 3
关键在于使用迭代算法,例如广度优先搜索(BFS)。 我们使用队列存储待处理节点。 首先将根节点入队,然后循环处理队列中的节点直到队列为空。 每次迭代,取出队首节点,渲染其值,并将子节点入队。 为了表示层级,使用变量跟踪节点深度,并根据深度添加缩进。
以下是一个React组件实现,利用BFS避免了递归:
import React, { useState, useEffect } from 'react';
function TreeComponent({ root }) {
const [nodes, setNodes] = useState([]);
useEffect(() => {
const queue = [root];
const nodesWithLevel = [];
let level = 0;
while (queue.length > 0) {
const currentLevelNodes = [];
const nextLevelQueue = [];
for (let i = 0; i < queue.length; i++) {
const node = queue[i];
currentLevelNodes.push({ ...node, level });
node.children.forEach(child => nextLevelQueue.push(child));
}
nodesWithLevel.push(...currentLevelNodes);
queue = nextLevelQueue;
level++;
}
setNodes(nodesWithLevel);
}, [root]);
return (
{nodes.map((node, index) => (
{node.value}
))}
);
}
export default TreeComponent;
此代码使用useEffect钩子在组件挂载时执行BFS,将节点及其层级信息存储在nodes状态中。 然后,组件渲染nodes数组,使用marginLeft样式根据节点层级创建缩进。 这避免了递归调用,实现了高效的树形结构渲染。 实际应用中,可以根据需求调整缩进方式和样式。










