You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React项目中在数组第三个元素后添加占位div的实现方案

解决方案

这里提供两种优雅的实现方式,你可以根据代码可读性和后续扩展需求选择:

方案一:使用 flatMap 一次性处理渲染逻辑

利用数组的 flatMap 方法,在遍历区块时判断是否需要插入占位div,代码紧凑且无需拆分数组:

const MyBlocks = ({ id }: { id: string }) => {
  const { data, loading } = useQuery<GqlRes>(BlocksQuery, {
    ssr: false,
    errorPolicy: 'all',
    variables: {
      blocksId: parseInt(id, 10),
    },
  });

  if (loading) {
    return <CircularProgress />;
  }

  const blocks = data?.blocks || [];

  return (
    <React.Fragment>
      {blocks.flatMap((item, index) => {
        // 生成当前区块组件,优先用item的唯一id作为key,没有则用索引
        const block = <Block key={item.id ?? String(index)} data={item} />;
        
        // 仅在第三个区块(索引为2)后插入占位div,且总区块数超过3个
        if (index === 2 && blocks.length > 3) {
          return [block, <div key="placeholder" id="placeholder" />];
        }
        return [block];
      })}
    </React.Fragment>
  );
};

export default MyBlocks;

方案二:拆分数组分批次渲染

将数组拆分为前3个和剩余部分,逻辑拆分更清晰,后续若要对前3个区块做单独样式或逻辑处理会更方便:

const MyBlocks = ({ id }: { id: string }) => {
  const { data, loading } = useQuery<GqlRes>(BlocksQuery, {
    ssr: false,
    errorPolicy: 'all',
    variables: {
      blocksId: parseInt(id, 10),
    },
  });

  if (loading) {
    return <CircularProgress />;
  }

  const blocks = data?.blocks || [];
  const firstThreeBlocks = blocks.slice(0, 3);
  const remainingBlocks = blocks.slice(3);

  return (
    <React.Fragment>
      {/* 渲染前3个区块 */}
      {firstThreeBlocks.map((item, index) => (
        <Block key={item.id ?? String(index)} data={item} />
      ))}
      {/* 总区块数超过3时才渲染占位div */}
      {blocks.length > 3 && <div id="placeholder" />}
      {/* 渲染剩余区块 */}
      {remainingBlocks.map((item, index) => (
        <Block key={item.id ?? String(index + 3)} data={item} />
      ))}
    </React.Fragment>
  );
};

export default MyBlocks;

注意事项

  • 尽量使用区块数据的唯一标识(比如 item.id)作为组件key,避免用索引当key——当数组元素顺序变化时,索引key会导致React错误复用组件,引发不必要的渲染或状态问题。
  • 两种方案都做了空值处理(data?.blocks || []),避免因后端返回空数据导致的报错。

内容的提问来源于stack exchange,提问作者meez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:45:15