在 React Data Grid 中实现动态列与数据转换

在 React Data Grid 中实现动态列与数据转换

本教程详细介绍了如何在 react data grid 组件中处理嵌套数据结构,将其转换为动态列和对应的行数据。通过将 `devices` 数组中的设备名称映射为表格列,并将设备值填充到相应行中,实现灵活的数据展示。文章涵盖了列定义、行数据转换的实现细节,并提供了完整的代码示例,帮助开发者高效地构建动态数据表格。

在现代前端应用中,数据表格是展示复杂信息不可或缺的组件。react-data-grid 提供了一个强大且高性能的解决方案。然而,当面临需要根据数据动态生成列的场景时,尤其是数据结构中包含嵌套数组时,就需要对数据进行适当的预处理。本文将指导您如何将包含嵌套设备信息的日志数据,转换为 react-data-grid 所需的动态列定义和扁平化行数据。

理解原始数据结构

我们首先来看一个典型的日志数据结构 dailyLogsData,其中包含了一些基础信息和 devices 数组:

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 },      // ... 更多设备    ],  },  // ... 更多日志条目];

我们的目标是将 devices 数组中的 device_name 作为表格的列标题,而 device_value 则作为该列对应行的数据。

react-data-grid 的数据要求

react-data-grid 组件主要通过 columns 和 rows 两个 props 来渲染表格:

columns: 一个数组,每个元素定义一个列。至少需要 key (唯一标识符) 和 name (显示名称) 属性。rows: 一个数组,每个元素代表一行数据。每个行对象必须包含与 columns 定义的 key 对应的属性。

生成动态列定义

首先,我们需要从 dailyLogsData 中提取所有唯一的设备名称,并将它们转换为 react-data-grid 所需的列定义。为了确保列的 key 唯一且符合 JavaScript 对象属性命名规范,我们会对 device_name 进行处理,例如移除空格。

// 假设所有日志条目的设备列表结构相同,我们取第一个条目作为参考const dynamicDeviceColumns = dailyLogsData[0].devices.map((item) => ({  key: item.device_name.replace(/ /g, ""), // 移除空格作为 key  name: item.device_name.toUpperCase(),    // 设备名称转换为大写作为显示名称}));// 结合静态列和动态生成的设备列const columns = [  { key: "id", name: "ID" },  { key: "date_time", name: "DATE/TIME" },  { key: "usage_notes", name: "USAGE NOTES" },  { key: "maintenance_notes", name: "MAINTENANCE NOTES" },  ...dynamicDeviceColumns, // 展开动态生成的设备列];

在这个例子中,Port Engine 会生成一个 key 为 PortEngine,name 为 PORT ENGINE 的列。

转换行数据以匹配动态列

这是实现动态列的关键步骤。我们需要遍历 dailyLogsData 中的每个日志条目,并为每个条目构建一个扁平化的行对象。这个行对象不仅包含日志条目的基础信息,还需要将 devices 数组中的每个设备信息转换为独立的属性,其属性名与之前生成的动态列的 key 相匹配。

const rows = 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,  };  // 遍历当前日志条目中的 devices 数组,动态添加设备值  item.devices.forEach((device) => {    // 确保这里的 key 生成逻辑与 columns 定义中的 key 生成逻辑一致    const deviceKey = device.device_name.replace(/ /g, "");    row[deviceKey] = device.device_value;  });  return row;});

通过这种方式,对于第一个日志条目,rows 数组中的第一个对象将可能看起来像这样:

{  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: "",}

请注意,PortEngine、Generator 等属性名与 columns 数组中动态列的 key 完全匹配。这是 react-data-grid 正确渲染数据的核心。

整合到 React 组件中

最后,将生成的 columns 和 rows 传递给 DataGrid 组件:

import React from 'react';import DataGrid from 'react-data-grid'; // 确保已安装 react-data-gridconst 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 },      ],    },  ];  // 生成动态列定义  const dynamicDeviceColumns = dailyLogsData[0].devices.map((item) => ({    key: item.device_name.replace(/ /g, ""),    name: item.device_name.toUpperCase(),  }));  const columns = [    { key: "id", name: "ID" },    { key: "date_time", name: "DATE/TIME" },    { key: "usage_notes", name: "USAGE NOTES" },    { key: "maintenance_notes", name: "MAINTENANCE NOTES" },    ...dynamicDeviceColumns,  ];  // 转换行数据  const rows = 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;

注意事项与最佳实践

Key 的一致性: 确保在生成 columns 数组中的 key 和 rows 数组中对象属性名时,使用完全相同的逻辑。任何不匹配都会导致数据无法正确显示。数据完整性: 如果 dailyLogsData 中的某些条目可能缺少 devices 数组,或者 devices 数组为空,上述代码仍然可以正常工作,因为 forEach 循环不会执行。如果 device_value 可能为 null 或 undefined,它们将直接显示在表格中。性能优化: 对于非常大的数据集,在组件渲染时进行大量的数据转换可能会影响性能。在这种情况下,可以考虑使用 useMemo 钩子来缓存 columns 和 rows 的计算结果,仅当 dailyLogsData 发生变化时才重新计算。错误处理: 考虑 dailyLogsData[0].devices 可能为空的情况。在实际应用中,您可能需要添加一个条件检查,以防止在数据为空时尝试访问 dailyLogsData[0] 导致错误。例如:

const dynamicDeviceColumns = dailyLogsData.length > 0 && dailyLogsData[0].devices  ? dailyLogsData[0].devices.map(...)  : [];

列排序/过滤/编辑: react-data-grid 提供了丰富的 API 来支持列的排序、过滤和编辑。在动态列的场景下,这些功能同样适用,但可能需要额外的逻辑来处理动态生成的列。

总结

通过上述步骤,我们成功地将包含嵌套 devices 数组的复杂数据结构,转换为 react-data-grid 所需的扁平化 columns 和 rows 格式,从而实现了动态列的展示。这种数据转换模式在处理非标准或需要高度灵活的表格布局时非常有用,为 react-data-grid 带来了更大的灵活性。掌握这种数据预处理技巧,将使您能够更有效地利用 react-data-grid 来构建功能强大的数据可视化界面。

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

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
掌握React中Fetch API的健壮错误处理:构建可复用的API请求工具
上一篇 2025年12月21日 00:57:32
JavaScript内存管理机制剖析
下一篇 2025年12月21日 00:57:46

相关推荐

  • DeepSeek能不能帮我写代码 简单编程任务如何交给DeepSeek完成

    DeepSeek能不能帮我写代码 简单编程任务如何交给DeepSeek完成DeepSeek能不能帮我写代码 简单编程任务如何交给DeepSeek完成DeepSeek能不能帮我写代码 简单编程任务如何交给DeepSeek完成DeepSeek能不能帮我写代码 简单编程任务如何交给DeepSeek完成

    很多用户好奇,像DeepSeek这样的AI模型能否帮助完成编程任务,特别是那些相对简单的编程需求。答案是肯定的。DeepSeek具备理解自然语言描述并尝试生成相应代码的能力,这使得它成为完成一些简单编程任务的有力工具。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月24日 用户投稿
    100
  • ubuntu如何mount网络驱动器

    在ubuntu中挂载网络驱动器有多种方法,以下是一些常见的方法: 方法一:使用mount命令 确定网络驱动器的地址:例如,如果是Samba共享,地址可能是smb://server/share。如果是NFS共享,地址可能是nfs://server/share。安装必要的软件包:对于Samba共享,安装…

    2026年9月24日
    000
  • Java中双精度浮点数的小数位控制技巧

    Java中双精度浮点数的小数位控制技巧Java中双精度浮点数的小数位控制技巧Java中双精度浮点数的小数位控制技巧Java中双精度浮点数的小数位控制技巧

    本文深入探讨了在Java中有效控制double类型数值小数位数的方法。通过Math.round()函数结合乘除操作,可以实现数值本身的四舍五入并改变其精度;而String.format()则提供了灵活的字符串格式化功能,用于在不修改原始数值的情况下精确控制显示的小数位数。这两种方法分别适用于不同的业…

    2026年9月24日 用户投稿
    000
  • Steam新游周报:经典恐怖游戏新作登场!

    Steam新游周报:经典恐怖游戏新作登场!Steam新游周报:经典恐怖游戏新作登场!Steam新游周报:经典恐怖游戏新作登场!Steam新游周报:经典恐怖游戏新作登场!

    十一国庆前的最后一周,Steam上又有许多令人兴奋的新作发布!本周策略玩家与模拟建设玩家有福了,将有数款新作等着你们,体育爱好者们则能玩到EA一款足球年货游戏,而本周黑马则是一款来自科乐美的经典日式恐怖游戏。让我们进入这周的新游周报吧! 周一(9月22日) 名望(抢先体验) Steam商店页面:名望…

    2026年9月24日 用户投稿
    000
  • 高质量免费logo设计网站 国产免费logo生成工具推荐

    国产免费Logo设计网站推荐即时设计、DesignEvo、牛人设计等,这些平台提供海量模板、支持中文输入与AI智能生成,具备全中文界面、本土化元素和矢量导出功能,适合零基础用户快速制作高质量Logo。 高质量免费logo设计网站国产免费logo生成工具推荐这是不少网友都关注的接下来由PHP小编为大家…

    2026年9月24日
    200
  • 如何通过BIOS调整CPU电压实现节能?

    答案:CPU降压通过BIOS调整Vcore电压,采用Offset模式在保证稳定前提下降低功耗与温度,提升能效;需结合HWiNFO64等工具监控温度、功耗,并用Prime95等压力测试验证稳定性,避免蓝屏或崩溃,合理设置可使CPU在更低温度下维持更高睿频,实现节能且不牺牲性能。 通过BIOS调整CPU…

    2026年9月24日
    700
  • 为什么GPU显存带宽比容量更重要?

    显存带宽比容量更重要,因其直接决定数据传输速度,影响GPU计算单元的利用率。在AI训练和高分辨率渲染中,高带宽可避免“数据饥饿”,确保海量数据高效流转,而HBM技术凭借3D堆叠和宽接口提供远超GDDR的带宽,成为高性能计算的关键。 GPU显存带宽比容量更重要,核心在于现代GPU的工作模式和其处理的数…

    2026年9月24日
    100
  • VSCode如何实现代码热重载 VSCode实时预览开发的高效配置方案

    使用live server扩展实现静态文件的实时预览,保存后浏览器自动刷新;2. 利用现代前端框架(如react、vue)内置的开发服务器(如vite、webpack dev server)实现hmr热模块替换,修改代码后仅更新变动模块而不刷新页面;3. 结合browsersync等工具实现多设备同…

    2026年9月24日
    000
  • mysql临时表如何使用_PHP中操作mysql临时表的具体步骤

    MySQL临时表仅在当前会话可见,连接关闭后自动删除,适合中间数据处理。使用PHP操作时,先通过mysqli或PDO建立数据库连接,再执行CREATE TEMPORARY TABLE语句创建临时表,随后可像普通表一样进行INSERT、SELECT及JOIN等操作。临时表可与永久表同名且优先被使用,支…

    2026年9月24日
    000
  • Java语法基础中static关键字可以修饰哪些内容

    static关键字用于定义类成员,包括静态变量(如计数器)、静态方法(如工具方法)、静态代码块(类加载时执行)和静态内部类(不依赖外部类实例),均属于类而非对象,通过类名访问,提升成员至类级别实现共享与提前使用。 static 关键字在 Java 中主要用于定义与类相关而非与对象实例相关的成员。它不…

    2026年9月24日
    100
  • mysql中*是什么意思 mysql星号通配符解析

    在 mysql 中,星号()最常用于 select 语句中代表所有列,但应谨慎使用。1)它方便查看所有数据,但可能返回不必要的数据,影响性能。2)使用可能降低代码可维护性,建议明确列出所需列。3)在like操作符中,不是通配符,需用regexp。4)在视图中使用可能导致定义失效。5)可结合limit…

    2026年9月24日
    000
  • 苹果过时产品名单更新,M5 iPad Pro 开箱视频流出

    苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出苹果过时产品名单更新,M5 iPad Pro 开箱视频流出

    日前,苹果已将 iphone 11 pro max 和 apple watch series 3 的所有型号列入“过时产品”(vintage product)行列。 根据苹果的规定,一款产品在停止销售满 5 年后,可能会被归为“过时产品”。不过,这一分类并不会显著影响售后服务——苹果仍会继续为这些设…

    2026年9月24日 用户投稿
    600
  • VSCode如何实现AI版本迁移辅助 VSCode跨版本升级的智能建议

    vscode的“ai版本迁移辅助”并非独立功能,而是通过扩展兼容性检查、设置同步、lsp/dap协议支持及社区资源等生态能力协同实现;2. 升级后扩展无法工作时,应检查更新日志、尝试降级或重新安装扩展、禁用冲突扩展、查看控制台错误信息并向作者报告问题;3. 备份设置和扩展列表可通过启用设置同步、手动…

    2026年9月24日
    1000
  • Java语法基础中如何导入其他包中的类

    使用import关键字可导入其他包中的类,如import java.util.ArrayList;2. 通过import java.util.*可导入整个包;3. 不导入时可用全限定名访问类,但不推荐;4. 类名冲突时需使用全限定名区分,如java.sql.Date。 在Java中使用其他包中的类,…

    2026年9月24日
    1100
  • MAC系统怎么开启防火墙_MAC开启防火墙教程

    1、建议在Mac系统中开启防火墙以提升网络安全,可通过“系统设置”中的“网络-防火墙”选项启用;2、高级用户可使用终端命令sudo /usr/libexec/ApplicationFirewall/socketfilterfw –setglobalstate on开启服务;3、启用后可在…

    2026年9月24日
    100
  • 如何在mysql中升级高可用集群

    先确认版本兼容性、应用依赖及备份完整性,再按架构选择升级路径。对Group Replication或InnoDB Cluster采用滚动升级,先升从节点最后升主节点;MHA/Orchestrator架构先升备库再切换主库;PXC需停集群全量升级。替换二进制后启动实例并运行mysql_upgrade,…

    2026年9月24日
    000
  • Java Map.entrySet遍历性能优化

    使用增强for循环遍历Map.entrySet()更高效,避免显式声明Iterator;提前缓存key和value减少重复调用;优先选用HashMap提升性能;大数据量可考虑parallelStream并行处理,但需权衡开销。 在Java中,Map.entrySet() 是遍历键值对最常用的方式之一…

    2026年9月24日
    100
  • 绝美后背! 日本妹子cos《寂静岭f》深水雏子

    绝美后背! 日本妹子cos《寂静岭f》深水雏子绝美后背! 日本妹子cos《寂静岭f》深水雏子绝美后背! 日本妹子cos《寂静岭f》深水雏子绝美后背! 日本妹子cos《寂静岭f》深水雏子

    《寂静岭f》女主角深水雏子近日在社交平台上引发热议,看似是普通的日本高中女生,实则性格果决、战斗力爆表。手持铁管正面硬刚女鬼的场面令人印象深刻,干脆利落的战斗风格让她迅速被玩家封神,成为《寂静岭》系列中最具冲击力的新角色之一。拥有30万粉丝的人气coser月海つくね(@XaiabP)也忍不住致敬这位…

    2026年9月24日 用户投稿
    100
  • 减少PHP与MySQL数据库通信的延迟

    减少php与mysql数据库通信的延迟可以通过以下策略:1. 优化数据库查询,使用索引提升查询速度;2. 减少数据库连接次数,使用连接池管理连接;3. 查询优化,使用explain分析查询计划;4. 使用缓存,如redis,减少数据库查询次数。这些方法能显著提升应用性能,但需权衡利弊,确保系统稳定性…

    2026年9月24日
    000
  • 讯维解决KVM鼠标不同步

    讯维解决KVM鼠标不同步讯维解决KVM鼠标不同步讯维解决KVM鼠标不同步讯维解决KVM鼠标不同步

    使用网络kvm时,常遇到本地鼠标与远程界面光标位置不一致的问题,即鼠标不同步现象,严重影响操作流畅性。可通过优化鼠标同步设置、更新驱动程序或选用兼容性更强的设备来有效改善。 1、配置运行Windows 2000操作系统的服务器环境 2、调整鼠标相关参数 3、点击开始菜单,进入控制面板,选择“鼠标”进…

    2026年9月24日 用户投稿
    900

发表回复

登录后才能评论
关注微信