使用 React Data Grid 实现动态列与数据映射

使用 React Data Grid 实现动态列与数据映射

本教程详细阐述如何在 `react-data-grid` 中实现动态列的生成与数据映射。通过将嵌套数组中的设备信息转换为独立的列,并精确地将对应值填充到行数据中,我们能够灵活地展示复杂结构的数据,从而优化数据表的呈现和管理。

动态生成 React Data Grid 列与数据映射教程

前端应用中,尤其是数据展示密集型场景,我们经常需要使用表格组件来呈现数据。react-data-grid 是一个功能强大且高度可定制的 React 表格组件。然而,当数据结构包含嵌套数组,并且我们希望将嵌套数组中的每个元素作为表格的动态列展示时,就需要进行一些数据转换和映射。本教程将指导您如何实现这一目标。

1. 理解原始数据结构

首先,我们来看一个典型的原始数据结构,其中包含日志信息和嵌套的设备列表:

const dailyLogsData = [  {    id: 1,    date_created: "01/15/2023",    time_updated: "15:53:05",    usage_notes: "sample notes",    maintenance_notes: "sample notes",    devices: [      { device_name: "Port Engine", device_value: "0125", device_id: 1 },      { device_name: "Generator", device_value: "0252", device_id: 2 },      { device_name: "Water Maker", device_value: "0321", device_id: 3 },      { device_name: "Fuel Engine", device_value: "", device_id: 4 },      { device_name: "Radiator", device_value: "", device_id: 5 },    ],  },  {    id: 2,    date_created: "01/16/2023",    time_updated: "15:53:05",    usage_notes: "sample notes",    maintenance_notes: "sample notes",    devices: [      { device_name: "Port Engine", device_value: "0125", device_id: 1 },      { device_name: "Generator", device_value: "0252", device_id: 2 },      { device_name: "Water Maker", device_value: "0321", device_id: 3 },      { device_name: "Fuel Engine", device_value: "0321", device_id: 4 },      { device_name: "Radiator", device_value: "0321", device_id: 5 },    ],  },];

我们的目标是将 devices 数组中的 device_name 转换为表格的列标题,并将对应的 device_value 填充到每行的相应列中。

2. 定义表格列结构

react-data-grid 需要一个 columns 数组来定义表格的每一列。这个数组通常包含静态列和动态列。

2.1 生成动态列

动态列可以从 dailyLogsData 中的第一个条目(假设所有日志条目的设备列表结构相同)的 devices 数组中提取。为了确保 key 属性的有效性,我们通常会对 device_name 进行处理,例如移除空格。

// 从第一个数据项的devices数组中提取动态列const dynamicColumns = dailyLogsData[0].devices.map((item) => ({  key: item.device_name.replace(/ /g, ""), // 移除空格作为key  name: item.device_name.toUpperCase(), // 列标题转换为大写  // 可以添加其他列属性,如 width, resizable 等}));

2.2 组合静态与动态列

将预定义的静态列与生成的动态列组合起来,形成完整的 columns 数组:

Anyword Anyword

AI文案写作助手和文本生成器,具有可预测结果的文案 AI

Anyword 153 查看详情 Anyword

const staticColumns = [  { key: "id", name: "ID", width: 60 },  { key: "date_time", name: "DATE/TIME", width: 180 },  { key: "usage_notes", name: "USAGE NOTES", width: 200 },  { key: "maintenance_notes", name: "MAINTENANCE NOTES", width: 200 },];const allColumns = [...staticColumns, ...dynamicColumns];

3. 转换行数据结构

这是实现动态列展示的关键步骤。react-data-grid 的 rows 属性需要一个对象数组,其中每个对象的键(key)必须与 columns 数组中定义的 key 匹配。这意味着我们需要将 devices 数组中的 device_name 和 device_value 扁平化到每个日志条目的顶层对象中。

我们可以通过 map 结合 forEach 来实现这一转换:

const transformedRows = dailyLogsData.map((item) => {  // 创建基础行对象,包含静态列的数据  const row = {    id: item.id,    date_time: `${item.date_created} | ${item.time_updated}`,    usage_notes: item.usage_notes,    maintenance_notes: item.maintenance_notes,  };  // 遍历设备的数组,将每个设备的名称作为key,值作为value添加到行对象中  item.devices.forEach((device) => {    // 确保这里的key与dynamicColumns中生成的key一致    row[device.device_name.replace(/ /g, "")] = device.device_value;  });  return row;});

经过上述转换后,transformedRows 数组中的每个对象将具有以下结构(以第一个数据项为例):

{  id: 1,  date_time: "01/15/2023 | 15:53:05",  usage_notes: "sample notes",  maintenance_notes: "sample notes",  PortEngine: "0125",  Generator: "0252",  WaterMaker: "0321",  FuelEngine: "",  Radiator: ""}

4. 整合到 React Data Grid 组件

现在,我们已经准备好了 columns 和 rows 数据,可以将其传递给 DataGrid 组件进行渲染。

import React from 'react';import DataGrid from 'react-data-grid';import 'react-data-grid/lib/styles.css'; // 引入样式function MyDynamicDataGrid() {  // 原始数据  const dailyLogsData = [    // ... (如上文所示的 dailyLogsData)    {      id: 1,      date_created: "01/15/2023",      time_updated: "15:53:05",      usage_notes: "sample notes",      maintenance_notes: "sample notes",      devices: [        { device_name: "Port Engine", device_value: "0125", device_id: 1 },        { device_name: "Generator", device_value: "0252", device_id: 2 },        { device_name: "Water Maker", device_value: "0321", device_id: 3 },        { device_name: "Fuel Engine", device_value: "", device_id: 4 },        { device_name: "Radiator", device_value: "", device_id: 5 },      ],    },    {      id: 2,      date_created: "01/16/2023",      time_updated: "15:53:05",      usage_notes: "sample notes",      maintenance_notes: "sample notes",      devices: [        { device_name: "Port Engine", device_value: "0125", device_id: 1 },        { device_name: "Generator", device_value: "0252", device_id: 2 },        { device_name: "Water Maker", device_value: "0321", device_id: 3 },        { device_name: "Fuel Engine", device_value: "0321", device_id: 4 },        { device_name: "Radiator", device_value: "0321", device_id: 5 },      ],    },  ];  // 1. 生成动态列  const dynamicColumns = dailyLogsData[0].devices.map((item) => ({    key: item.device_name.replace(/ /g, ""),    name: item.device_name.toUpperCase(),    width: 120, // 可选:设置动态列宽度    resizable: true, // 可选:允许调整列宽  }));  // 2. 定义静态列并与动态列组合  const staticColumns = [    { key: "id", name: "ID", width: 60, resizable: true },    { key: "date_time", name: "DATE/TIME", width: 180, resizable: true },    { key: "usage_notes", name: "USAGE NOTES", width: 200, resizable: true },    { key: "maintenance_notes", name: "MAINTENANCE NOTES", width: 200, resizable: true },  ];  const allColumns = [...staticColumns, ...dynamicColumns];  // 3. 转换行数据  const transformedRows = dailyLogsData.map((item) => {    const row = {      id: item.id,      date_time: `${item.date_created} | ${item.time_updated}`,      usage_notes: item.usage_notes,      maintenance_notes: item.maintenance_notes,    };    item.devices.forEach((device) => {      row[device.device_name.replace(/ /g, "")] = device.device_value;    });    return row;  });  return (    
);}export default MyDynamicDataGrid;

5. 注意事项与最佳实践

键名一致性: 确保在生成动态列的 key 时,使用的逻辑与在转换行数据时为设备值设置属性名(key)的逻辑完全一致。例如,都使用 device.device_name.replace(/ /g, “”)。数据一致性: 假定 dailyLogsData 中所有条目的 devices 数组结构(设备名称和顺序)基本一致。如果不同日志条目的设备列表差异很大,您可能需要更复杂的逻辑来处理列的合并或缺失值。性能考量: 对于非常庞大的数据集,频繁的 map 和 forEach 操作可能会影响性能。在这种情况下,可以考虑使用 useMemo 或 useCallback 来缓存计算结果,避免不必要的重新渲染。空值处理: 如果 device_value 可能为 null 或 undefined,确保您的渲染逻辑能够妥善处理这些情况,例如显示为空字符串或特定占位符。错误处理: 考虑 dailyLogsData 或 devices 数组为空的情况,确保代码不会因此而崩溃。例如,在生成 dynamicColumns 之前检查 dailyLogsData[0] 是否存在。

总结

通过本教程,您学习了如何利用 JavaScript 的 map 和 forEach 方法,将嵌套数据结构扁平化,并为 react-data-grid 生成动态列和对应的行数据。这种方法使得 react-data-grid 能够灵活地展示来自复杂数据源的信息,极大地提高了数据表格的适应性和可读性。掌握这种数据转换技巧,对于构建高效且用户友好的数据密集型 React 应用至关重要。

以上就是使用 React Data Grid 实现动态列与数据映射的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/881607.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月28日 10:15:46
下一篇 2025年11月28日 10:16:08

相关推荐

  • 解决PHPMyAdmin执行SQL语句时的锁等待问题

    解决phpmyadmin执行sql时的锁等待问题,需先定位锁源并针对性优化。1. 查看进程列表:通过show full processlist;识别长时间运行、状态为locked或waiting for table metadata lock等问题sql;2. 优化慢查询:使用explain分析未命…

    2025年12月11日 好文分享
    000
  • 调整PhpStorm字体和字号以提升阅读体验

    调整 phpstorm 字体、字号和配色能有效缓解视觉疲劳,提升编码效率。1. 选择等宽字体如 jetbrains mono、fira code 或 source code pro,确保字符对齐;2. 设置字号在 14~16px 之间,根据屏幕分辨率微调;3. 调整行距至 1.3~1.5 倍,增强段…

    2025年12月11日 好文分享
    000
  • PHP怎样处理Opcache优化 PHP性能优化之Opcache配置指南

    opcache通过缓存预编译php脚本提升应用性能,关键配置包括:1.启用opcache(opcache.enable=1);2.设置足够内存(建议128mb起步);3.优化字符串缓冲区(8-16mb);4.调整最大缓存文件数;5.生产环境关闭时间戳验证(opcache.validate_times…

    2025年12月11日 好文分享
    000
  • 配置PHPCMS的站群动态域名的详细步骤

    phpcms站群动态域名配置通过服务器重写规则与系统站点管理结合实现。1. 服务器配置:nginx中设置主站点与子站点的server块,利用泛域名或通配符匹配所有子站请求并转发至phpcms入口文件;2. phpcms后台配置:在“站点管理”中添加站点并绑定对应域名,配置站点信息后更新缓存确保生效;…

    2025年12月11日 好文分享
    000
  • 安装和配置PHPCMS的搜索引擎优化插件

    phpcms seo插件的安装与配置核心在于提升网站在搜索引擎中的可见性和优化效果,具体步骤包括:1. 下载适配当前phpcms版本的seo插件,来源可以是官方社区、开源仓库或第三方开发者;2. 解压后通过ftp或主机面板上传插件文件至指定目录,如phpcms/modules或phpcms/plug…

    2025年12月11日 好文分享
    000
  • PHP如何调用TSLint检测 TypeScript代码检测指南

    php 调用 tslint 检测 typescript 代码的方法是通过执行命令行调用 tslint cli 并解析其输出结果。1. 安装 node.js 和 npm;2. 安装 tslint 及相关规则集;3. 配置 tslint.json 文件;4. 使用 php 的 exec() 函数执行 t…

    2025年12月11日 好文分享
    000
  • 异常错误如何捕获处理?try-catch使用技巧

    使用 try-catch 处理异常需明确错误处理目的,避免盲目捕获。1. 基本结构是将可能出错的代码放入 try 块,catch 中处理并至少记录错误信息。2. 精准捕获错误类型,如仅处理 syntaxerror,其他错误重新抛出,避免吞掉未知错误。3. finally 用于执行清理工作,如关闭文件…

    2025年12月11日 好文分享
    000
  • 邮件发送怎么实现?PHPMailer配置

    php邮件发送为何经常失败?常见问题与排查。1.smtp配置错误:smtp主机、端口、加密方式及用户名密码必须准确无误,密码常需使用授权码而非登录密码;2.网络或防火墙问题:服务器可能因防火墙或isp限制无法连接smtp端口,需检查并开放相应端口;3.认证失败:确认用户名为完整邮箱地址,密码为授权码…

    2025年12月11日 好文分享
    000
  • 解决PHPMyAdmin中用户账户被锁定的问题

    要解决 phpmyadmin 中用户账户被锁定的问题,首先应检查 mysql 错误日志以确定锁定原因。1. 使用 root 用户登录 phpmyadmin 或恢复 root 权限;2. 执行 sql 查询 update mysql.user set account\_locked = ‘…

    2025年12月11日 好文分享
    000
  • 用户登录系统如何开发?Session认证机制详细教程

    session 是用户登录系统开发中最常见的认证方式,适合中小型 web 应用。1. session 是服务器端记录用户状态的机制,通过生成唯一 session id 并存储在客户端 cookie 中实现用户识别;2. 实现流程包括用户提交信息、后端验证并创建 session、返回 session …

    2025年12月11日 好文分享
    000
  • 为PHPCMS编辑器添加代码高亮显示功能

    要为phpcms编辑器添加代码高亮显示功能,1. 引入前端高亮库prism.js或highlight.js;2. 下载并放置prism.css和prism.js文件至项目目录;3. 修改ueditor配置以支持插入符合要求的html结构;4. 在前端模板中正确引入css与js文件并初始化;5. 确保…

    2025年12月11日 好文分享
    000
  • MySQL表内容增加:PHP后端实现方法

    php后端实现mysql表内容增加的方法是通过构建并执行insert sql语句,主要步骤包括:1. 建立数据库连接;2. 获取用户输入数据;3. 构建sql插入语句;4. 执行sql并处理结果;5. 关闭数据库连接。为防止sql注入,推荐使用预处理语句或mysqli_real_escape_str…

    2025年12月11日 好文分享
    000
  • PhpStorm插件更新不及时的解决策略

    遇到 phpstorm 插件更新不及时的问题,可依次尝试以下方法解决:1.手动检查插件更新源是否正常,确保默认仓库地址为 https://www.php.cn/link/9e8a5c1f4174912f20cdad10d566a2d2,必要时添加或替换;2.使用手动下载安装的方式强制更新,访问 je…

    2025年12月11日 好文分享
    000
  • PhpStorm的代码分析和静态检查功能使用

    phpstorm 的代码分析和静态检查功能能有效提升代码质量。1. 启用并配置代码检查,通过设置选择需要的检查规则并设定严重级别;2. 使用类型提示提高分析准确性,帮助 phpstorm 更精准识别变量类型;3. 利用“意图操作”快捷键快速修复问题,如添加命名空间或初始化变量;4. 配合外部工具如 …

    2025年12月11日 好文分享
    000
  • 解决PHPCMS网站数据同步问题的方法

    要解决phpcms网站数据同步问题,首先明确业务对实时性或最终一致性的需求。1. 数据库层面同步:采用mysql主从复制实现核心数据表的高效同步,适用于读写分离场景;若需双向写入,则使用主主复制,但需处理冲突和故障切换。2. 文件系统同步:利用rsync配合inotify实现文件实时同步,同时注意与…

    2025年12月11日 好文分享
    000
  • PHP权限控制:RBAC实现方案

    php权限控制的核心是确保授权用户才能访问资源或执行操作,rbac是一种常用方案。rbac通过角色管理权限,简化权限管理过程,其核心思想是将用户与权限分离,通过角色作为桥梁连接两者。实现通常包括用户、角色、权限、资源和操作五个关键组成部分,并通过设计角色和权限、创建数据库表、实现权限验证逻辑等步骤完…

    2025年12月11日 好文分享
    000
  • 优化PHPCMS网站数据的存储和管理

    phpcms网站数据优化需从数据库调优、缓存机制和内容生命周期管理三方面系统性推进。1. 数据库层面,对v9_news、v9_content等核心表的catid、inputtime、status字段建立合适索引,使用复合索引提升查询效率;2. 将数据库引擎迁移至innodb以支持行级锁和事务,定期执…

    2025年12月11日 好文分享
    000
  • 怎样用PHP爬取动态网页?Headless浏览器解决方案

    用php爬取动态网页需使用headless浏览器模拟浏览器行为。具体步骤包括:1. 安装chrome或chromium浏览器并启用无头模式;2. 安装webdriver(如chromedriver)并配置至系统path;3. 通过composer安装facebook/webdriver库;4. 使用…

    2025年12月11日 好文分享
    000
  • PHPMyAdmin操作数据库时出现“数据冲突”的解决思路

    数据冲突错误需先看提示中的冲突值和键名,1.定位问题:根据错误信息确定冲突的表、字段及值;2.检查数据:查询对应表确认是否存在重复记录;3.修正操作:插入时调整数据或改用更新,更新时确保唯一字段不重复;4.处理自增问题:必要时重置auto_increment值。 当你在PHPMyAdmin里操作数据…

    2025年12月11日 好文分享
    000
  • 解决PhpStorm代码高亮显示异常的问题

    代码高亮异常通常由缓存、设置或插件引起,解决方法如下:1. 清除 phpstorm 缓存并重启,删除 c:users用户名.cachejetbrainsphpstorm2023.x 或 macos 对应目录下的内容;2. 检查配色方案,切换至默认主题 darcula 或 intellij light…

    2025年12月11日 好文分享
    000

发表回复

登录后才能评论
关注微信