如何在 React Data Grid 中创建动态列

如何在 react data grid 中创建动态列

本教程详细介绍了如何在 React Data Grid 中处理嵌套数据结构,以实现动态列的创建和数据展示。通过将嵌套的设备信息转换为可渲染的表格列,并优化行数据结构,您将学会如何从原始数据中提取关键信息,并将其映射到 `react-data-grid` 组件所需的列定义和行数据格式,从而构建灵活且可扩展的数据表格。

在现代前端应用中,数据展示是核心功能之一。react-data-grid 是一个功能强大且性能优越的表格组件,但当遇到数据结构中包含嵌套数组,并且需要将这些嵌套数组的元素动态地转换为表格列时,就需要进行一些数据转换。本教程将指导您如何从一个包含设备列表的日志数据中,动态生成表格列并正确填充行数据。

数据结构概览

假设我们有如下的日志数据 dailyLogsData,其中每个日志条目都包含一个 devices 数组,每个 device 对象有 device_name 和 device_value:

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

我们的目标是将 devices 数组中的 device_name 作为表格的列标题,而 device_value 作为对应行的单元格内容。

动态列定义

react-data-grid 的 columns 属性需要一个包含 key 和 name 属性的对象数组。对于动态生成的列,我们可以从 dailyLogsData 的第一个条目中提取 devices 数组来生成这些列。为了确保 key 的唯一性和避免空格问题,我们通常会对 device_name 进行处理。

首先,定义固定列:

const fixedColumns = [  { key: "id", name: "ID" },  { key: "date_time", name: "DATE/TIME" },  { key: "usage_notes", name: "USAGE NOTES" },  { key: "maintenance_notes", name: "MAINTENANCE NOTES" },];

接着,从 dailyLogsData 的第一个条目(假设所有条目的设备列表结构一致)中提取设备信息,生成动态列:

const dynamicColumns = dailyLogsData[0].devices.map((item) => ({  key: item.device_name.replace(/ /g, ""), // 移除空格作为 key  name: item.device_name.toUpperCase(), // 大写作为列名}));

最后,将固定列和动态列合并:

const columns = [...fixedColumns, ...dynamicColumns];

行数据转换

这是实现动态列的关键步骤。react-data-grid 的 rows 属性需要一个对象数组,每个对象代表一行,其属性名(key)应与 columns 定义中的 key 相匹配,属性值即为单元格内容。

我们需要遍历 dailyLogsData 中的每个日志条目,并为每个条目构建一个行对象。在这个行对象中,除了 id、date_time 等固定属性外,还需要将 devices 数组中的每个设备转换为行对象的属性。

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) => {    // 使用与列 key 相同的逻辑生成属性名    row[device.device_name.replace(/ /g, "")] = device.device_value;  });  return row;});

在这个转换过程中,row[device.device_name.replace(/ /g, “”)] = device.device_value; 这一行至关重要。它动态地创建了新的属性,例如 PortEngine: “0125”, Generator: “0252”,这些属性名与我们之前在 dynamicColumns 中生成的 key 完全匹配。

集成到 React Data Grid

有了 columns 定义和 rows 数据,现在可以将其传递给 DataGrid 组件:

import DataGrid from 'react-data-grid';function MyDynamicGrid() {  // ... dailyLogsData 定义 ...  // ... columns 定义 ...  // ... rows 定义 ...  return (      );}

完整示例

将上述逻辑整合到一个 React 组件中,完整的实现如下:

import React from 'react';import DataGrid from 'react-data-grid';import 'react-data-grid/lib/styles.css'; // 导入样式function DynamicDataGridExample() {  const dailyLogsData = [    {      id: 1,      date_created: "01/15/2023",      time_updated: "15:53:05",      usage_notes: "sample notes 1",      maintenance_notes: "maintenance notes 1",      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 2",      maintenance_notes: "maintenance notes 2",      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 fixedColumns = [    { key: "id", name: "ID" },    { key: "date_time", name: "DATE/TIME" },    { key: "usage_notes", name: "USAGE NOTES" },    { key: "maintenance_notes", name: "MAINTENANCE NOTES" },  ];  // 2. 从第一个数据条目动态生成设备列  // 确保 dailyLogsData 至少有一个条目  const dynamicDeviceColumns = dailyLogsData.length > 0    ? dailyLogsData[0].devices.map((item) => ({        key: item.device_name.replace(/ /g, ""), // 移除空格作为 key        name: item.device_name.toUpperCase(), // 大写作为列名      }))    : [];  // 3. 合并所有列  const columns = [...fixedColumns, ...dynamicDeviceColumns];  // 4. 转换行数据  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 匹配      row[device.device_name.replace(/ /g, "")] = device.device_value;    });    return row;  });  return (    

动态列 React Data Grid 示例

);}export default DynamicDataGridExample;

注意事项与最佳实践

key 的一致性: 确保在生成列定义 (columns) 和行数据 (rows) 时,用于动态属性的 key 命名规则完全一致。例如,本例中使用了 device_name.replace(/ /g, “”)。数据完整性: 动态列的生成通常依赖于数据源的结构。如果 dailyLogsData 为空,或者 devices 数组为空,应添加适当的检查以避免运行时错误。例如,在生成 dynamicDeviceColumns 时,我们增加了 dailyLogsData.length > 0 的判断。性能优化: 对于非常大的数据集,频繁地进行 map 和 forEach 操作可能会影响性能。在这种情况下,可以考虑使用 useMemo 或 useCallback 钩子来缓存列和行数据的生成结果,避免不必要的重新计算。列排序/过滤/编辑: react-data-grid 支持列的排序、过滤和编辑。对于动态生成的列,这些功能同样适用,但可能需要自定义实现或配置。数据源一致性: 确保所有 dailyLogsData 条目中的 devices 数组具有相同的 device_name 集合,否则动态生成的列可能无法完全覆盖所有数据。如果 device_name 集合不一致,您可能需要更复杂的逻辑来收集所有唯一的 device_name 作为列。

总结

通过上述步骤,我们成功地将嵌套在对象数组中的数据转换为了 react-data-grid 可识别的动态列和行数据。这种方法不仅提高了表格的灵活性,使其能够适应不断变化的数据结构,也为处理复杂数据展示提供了可行的解决方案。理解数据转换的原理是有效利用 react-data-grid 等组件的关键。

以上就是如何在 React Data Grid 中创建动态列的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 00:54:11
下一篇 2025年12月21日 00:54:26

相关推荐

  • 解决React-DND拖拽后元素错位:理解key属性的重要性

    在使用react-dnd进行拖放操作时,当源列表中的元素被移除后,后续拖拽可能导致错误的元素被放置。这通常是由于react列表渲染中key属性的不当使用造成的。核心解决方案是为可拖拽组件的key属性提供一个稳定且唯一的标识符(如元素的id),而非其在列表中的索引,以确保react能够正确识别并更新组…

    2025年12月21日
    000
  • React Router中如何精准识别嵌套路由的解析路径

    在React Router应用中,当存在多个路由路径使用相同参数名(如`:token`)时,父级布局组件难以准确判断当前解析的是哪个具体路由。本文将介绍两种有效策略来解决此问题:一是通过为不同路由路径的参数赋予唯一名称来消除歧义;二是通过`useMatch`钩子显式匹配特定路由模式,从而在父组件中精…

    2025年12月21日
    000
  • 解决React DND中拖放元素错位问题:深入理解key属性的重要性

    在react dnd应用中,当拖放列表中的元素被移除或重新排序时,若组件的`key`属性基于数组索引而非稳定唯一标识符,可能导致拖放操作识别错误。本文将深入探讨这一常见问题,解释react `key`属性在列表渲染中的核心作用,并提供正确的解决方案,确保拖放行为的准确性和一致性。 深入理解React…

    2025年12月21日
    000
  • 在React应用中构建健壮的Fetch请求:深入理解与优化错误处理

    本文旨在解决react应用中使用`fetch` api时,请求未能按预期执行或错误处理不完善的问题。我们将探讨`fetch` api默认错误处理的局限性,并提供一个自定义的`fetcher`工具函数,以实现更全面、更一致的api响应和错误处理机制,从而提升应用的稳定性和可维护性。 引言:理解Fetc…

    2025年12月21日
    000
  • JavaScript动画性能优化

    使用requestAnimationFrame替代定时器,优先通过CSS transform和opacity实现动画,避免频繁读写DOM属性,合理利用will-change提示浏览器优化,减少重排重绘,提升动画流畅度。 JavaScript动画如果处理不当,很容易导致页面卡顿、掉帧甚至浏览器崩溃。优…

    2025年12月21日
    000
  • 在Matter.js中高效移动由约束连接的多个刚体

    本文探讨了在matter.js物理引擎中,如何正确移动由约束(constraint)连接的多个刚体。针对直接使用`setposition`可能导致的问题,文章推荐采用`translate`方法对所有相关刚体进行整体平移,并结合刚体标签(label)进行分组管理,从而在不破坏现有约束关系的前提下,实现…

    2025年12月21日
    000
  • JavaScript中的异步迭代器与for-await-of循环

    异步迭代器是返回Promise的next()方法的对象,用于处理异步数据流;通过[Symbol.asyncIterator]实现,配合for await…of在async函数中遍历异步序列,适用于分页请求、流数据处理等场景,代码简洁且内存友好。 JavaScript中的异步迭代器(Asy…

    2025年12月21日
    000
  • Blazor中JSInterop富文本编辑器OnClick事件问题的解决方案

    本文旨在解决在blazor应用中使用jsinterop构建富文本编辑器时遇到的`onclick`事件双击、重复触发及内容丢失等问题。核心解决方案包括优化jsinterop调用,避免重复注册事件监听器,并利用blazor组件的渲染控制机制来防止`contenteditable`区域的内容被意外重置。通…

    2025年12月21日
    000
  • JavaScript错误监控与上报实战_javascript技巧

    答案:前端项目需通过JavaScript错误监控与上报机制及时发现并定位线上问题。1. 使用 window.onerror 捕获全局同步错误,但无法获取 Promise 错误和跨域脚本详细信息;2. 通过 addEventListener(‘unhandledrejection&#821…

    2025年12月21日
    000
  • 解决React DND拖放元素错位问题:key属性的关键作用

    在使用react dnd实现拖放功能时,开发者常遇到元素拖放后错位的问题,尤其是在源列表内容发生变化时。这通常是由于react在渲染列表时,使用了不稳定的索引作为`key`属性。本文将深入探讨此问题的根源,并提供解决方案:通过为可拖拽组件分配一个稳定且唯一的`id`作为`key`属性,确保react…

    2025年12月21日
    000
  • JavaScript模板字符串的高级用法_javascript技巧

    模板字符串不仅用于拼接变量,还支持嵌套生成动态内容、标签函数自定义处理、内嵌表达式实现条件逻辑、以及天然多行字符串保留格式,广泛应用于HTML构建、XSS防护、国际化和SQL编写等场景。 模板字符串不只是用来拼接变量的工具,它的高级用法能让代码更简洁、更具表现力。ES6 引入的模板字符串(Templ…

    2025年12月21日
    000
  • Blazor富文本编辑器中JSInterop与OnClick事件处理的最佳实践

    本文旨在解决blazor应用中,使用jsinterop与contenteditable元素构建富文本编辑器时,常见的onclick事件触发异常、内容丢失及多次弹窗问题。通过优化jsinterop调用方式和精细控制blazor组件渲染,确保事件处理的准确性和用户体验的流畅性,为开发者提供一套可靠的解决…

    2025年12月21日
    000
  • JavaScript事件处理优化:避免多元素事件监听代码重复的通用模式

    本教程探讨如何在javascript中高效处理多个相似dom元素的事件,避免代码重复。通过使用`document.queryselectorall`结合逗号分隔的选择器,并遍历nodelist为每个元素绑定事件监听器,实现代码的精简和可维护性提升,从而构建更优雅的前端应用。 在前端开发中,为页面上多…

    2025年12月21日
    000
  • 解决React useEffect中Fetch请求不执行及错误处理的最佳实践

    本教程深入探讨了在react `useeffect`钩子中执行`fetch`请求时可能遇到的问题,特别是关于请求看似未执行或错误处理不当的情况。文章将介绍如何通过构建一个健壮的`fetcher`工具函数来统一api调用和错误处理逻辑,从而提高代码的可读性、可维护性及调试效率,确保异步数据请求的稳定性…

    2025年12月21日
    000
  • React useEffect中fetch请求的健壮错误处理与最佳实践

    本文深入探讨了在react `useeffect`中执行`fetch`请求时,默认错误处理机制可能存在的局限性。通过引入一个自定义的`fetcher`工具函数,我们展示了如何构建一个更健壮、可复用且易于调试的api调用层。该方法不仅能有效捕获网络错误,还能处理http状态码非2xx的服务器响应,从而…

    2025年12月21日
    000
  • 移动端JavaScript离线应用开发

    答案:实现移动端JavaScript离线应用需结合Service Worker、Cache API、IndexedDB和Web App Manifest。首先注册Service Worker以拦截网络请求,并在install事件中预缓存核心资源;通过fetch事件优先返回Cache API中存储的静…

    2025年12月21日
    000
  • 优化React useEffect中的Fetch请求与错误处理

    本文旨在解决react `useeffect`中`fetch`请求可能不执行或错误处理不当的问题。我们将探讨`fetch` api的默认行为,并提出一种健壮的解决方案:通过创建集中式的`fetcher`工具函数,统一处理api调用、响应状态及错误,从而简化组件逻辑,提高代码可维护性和调试效率,确保异…

    2025年12月21日
    000
  • 优化JavaScript表单密码验证:解决静态检查陷阱

    本文探讨了javascript表单密码验证中一个常见的逻辑错误:密码强度检查仅在页面加载时执行,而非用户提交时动态进行。通过将正则表达式测试逻辑移动到表单提交事件处理函数内部,可以确保密码强度和匹配性在每次提交时都得到正确验证,从而提升表单的健壮性和用户体验。 引言:前端密码验证的重要性 在Web开…

    2025年12月21日
    000
  • JavaScript文本自动换行与长词处理教程

    本教程详细阐述了如何在javascript中实现文本的自动换行功能,以确保每行文本的最大字符数不超过指定长度。文章着重介绍了如何利用正则表达式和`string.prototype.matchall`方法来高效处理文本,特别是当单个单词的长度超出最大行长时,能够对其进行截断处理,从而提供一个既能保持单…

    2025年12月21日
    000
  • JavaScript 文件操作:FileReader 读取本地文件内容

    FileReader是浏览器提供的用于读取本地文件内容的API,通过结合获取用户选择的文件后,使用readAsText、readAsDataURL等方法异步读取文本、图片预览或二进制数据,并在onload回调中处理结果,同时需监听onerror处理异常,适用于文本解析、图片预览等场景。 在前端开发中…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信