react分组列表如何优化
虚拟列表技术
对于长列表,采用虚拟列表(如react-window或react-virtualized)仅渲染可视区域内的元素,减少DOM节点数量。示例代码:
import { FixedSizeList as List } from 'react-window';
const Row = ({ index, style }) => (
<div style={style}>Row {index}</div>
);
const VirtualList = () => (
<List height={600} itemCount={1000} itemSize={35} width={300}>
{Row}
</List>
);
分组数据预处理
将原始数据按分组规则预先处理为层级结构,避免重复计算。例如:
const groupData = (data, key) => {
return data.reduce((acc, item) => {
const groupKey = item[key];
if (!acc[groupKey]) acc[groupKey] = [];
acc[groupKey].push(item);
return acc;
}, {});
};
避免内联函数
将事件处理函数和样式对象提取到组件外部,减少重复渲染:

const handleClick = useCallback((id) => {
// 逻辑处理
}, []);
// 组件内
<button onClick={() => handleClick(item.id)}>Click</button>
惰性加载分组内容
初始只渲染分组标题,点击时才加载子项。结合React.lazy和Suspense实现动态加载:
const LazyGroup = React.lazy(() => import('./GroupContent'));
const Group = ({ title }) => (
<Suspense fallback={<Spinner />}>
<LazyGroup title={title} />
</Suspense>
);
使用Key优化列表
为分组和子项分配稳定且唯一的key,避免React误判DOM变更。例如:

{groups.map((group) => (
<div key={`group-${group.id}`}>
{group.items.map((item) => (
<div key={`item-${item.uuid}`}>...</div>
))}
</div>
))}
记忆化计算
通过useMemo缓存分组计算结果,依赖项变化时重新计算:
const groupedData = useMemo(() => {
return groupData(rawData, 'category');
}, [rawData]);
减少嵌套层级
避免过深的组件树结构,通过扁平化设计或复合组件降低渲染压力。例如将分组标题和内容拆分为独立组件:
<GroupHeader title={title} />
<GroupItems items={items} />






