grid 布局react组件可以循数据自定义渲染某个数据 ,或插入某些数据在某个索引下

js 复制代码
import React from "react";
import "./App.css"; // 引入CSS文件

interface GridDisplayProps {
  items: any[];
  rowNum?: number;
  renderItem?: (item: any, index: number) => React.ReactNode;
  customElement?: React.ReactNode;
  customIndex?: number;
}

const GridDisplay: React.FC<GridDisplayProps> = ({
  items,
  rowNum = 2,
  renderItem,
  customElement,
  customIndex = 0,
}) => {
  // 默认的渲染方式
  const defaultRenderItem = (item: any, index: number) =>
    <div>{`这是默认渲染${index}`}</div>;

  // 插入自定义元素
  const modifiedItems = [...items];
  if (customElement) {
    const targetIndex = customIndex < items.length ? customIndex : 0;
    modifiedItems.splice(targetIndex, 0, customElement);
  }

  // 将数组分成每行指定数量元素的子数组
  const rows: any[] = modifiedItems.reduce((resultArray: any[], item, index) => {
    const chunkIndex = Math.floor(index / rowNum);
    if (!resultArray[chunkIndex]) {
      resultArray[chunkIndex] = [];
    }
    resultArray[chunkIndex].push(item);
    return resultArray;
  }, []);

  return (
    <div className="container">
      {rows.map((row, rowIndex) => (
        <div className="row" key={rowIndex}>
          {row.map((item: any, index: number) => {
            const globalIndex = rowIndex * rowNum + index;
            return (
              <div
                className="item"
                key={index}
                style={{ width: `${100 / rowNum}%` }}
              >
                {React.isValidElement(item)
                  ? item
                  : renderItem
                  ? renderItem(item, globalIndex)
                  : defaultRenderItem(item, globalIndex)}
              </div>
            );
          })}
        </div>
      ))}
    </div>
  );
};

export default GridDisplay;
css 复制代码
.container {
  display: flex;
  flex-direction: column;
}

.row {
  display: flex;
}

.item {
  flex: 1;
  width: 50%;
}
相关推荐
IT 行者5 小时前
Web逆向工程AI工具:JSHook MCP,80+专业工具让Claude变JS逆向大师
开发语言·javascript·ecmascript·逆向
程序员 沐阳6 小时前
JavaScript 内存与引用:深究深浅拷贝、垃圾回收与 WeakMap/WeakSet
开发语言·javascript·ecmascript
cyclv9 小时前
无网络地图展示轨迹,地图瓦片下载,绘制管线
前端·javascript
HIT_Weston11 小时前
41、【Agent】【OpenCode】本地代理分析(五)
javascript·人工智能·opencode
前端Hardy12 小时前
前端必看!LocalStorage这么用,再也不踩坑(多框架通用,直接复制)
前端·javascript·面试
前端Hardy12 小时前
前端必看!前端路由守卫这么写,再也不担心权限混乱(Vue/React通用)
前端·javascript·面试
Lee川12 小时前
从零构建现代化登录界面:React + Tailwind CSS 前端工程实践
前端·react.js
竹林81812 小时前
从ethers.js迁移到Viem:我在重构DeFi前端时踩过的那些坑
前端·javascript
前端郭德纲13 小时前
JavaScript Object.freeze() 详解
开发语言·javascript·ecmascript
希望永不加班13 小时前
SpringBoot 静态资源访问(图片/JS/CSS)配置详解
java·javascript·css·spring boot·后端