React Tabulator 嵌套数据行号自定义:实现层级小数位编号


react tabulator 嵌套数据行号自定义:实现层级小数位编号

本教程旨在解决 React Tabulator 在处理嵌套数据(树形结构)时,默认行号格式化器无法实现子行小数位层级编号的问题。我们将通过在数据加载到 Tabulator 之前进行预处理,递归地为每个父行和子行生成自定义的带小数位层级编号,并将其作为独立字段渲染,从而实现如“1.1”、“1.2”、“2.1”等效果。

在构建具有嵌套数据(例如树形表格)的用户界面时,使用 React Tabulator 是一个常见的选择。然而,当需要为这些嵌套行生成具有层级结构(如“1”、“1.1”、“1.2”、“2”、“2.1”)的自定义行号时,Tabulator 内置的 rownum 格式化器可能无法满足复杂的需求,尤其是在处理子行的编号时,它通常会显示为 0 或简单的独立计数。为了实现这种小数位层级编号,我们需要一种更灵活的方法,即在数据绑定到 Tabulator 之前,对原始数据进行预处理。

解决方案概述

核心思想是在将数据传递给 Tabulator 之前,通过一个递归函数遍历整个数据集。在遍历过程中,为每个数据项(包括父项和子项)计算并添加一个自定义的 rowNum 字段。这个 rowNum 字段将包含我们期望的层级小数位编号。之后,Tabulator 只需要渲染这个预先计算好的 rowNum 字段即可。

实现步骤

1. 准备原始数据结构

首先,我们需要一个包含嵌套结构的原始数据。Tabulator 通过 _children 字段来识别子行。

const tableData = [
  { name: 'Oli Bob', location: 'United Kingdom', gender: 'male', dob: '14/04/1984', _children: [
      { name: 'Mary May', location: 'Germany', gender: 'female', dob: '14/05/1982' },
      { name: 'Christine Lobowski', location: 'France', gender: 'female', dob: '22/05/1982' },
      { name: 'Brendon Philips', location: 'USA', gender: 'male', dob: '01/08/1980', _children: [
          { name: 'Margret Marmajuke', location: 'Canada', gender: 'female', dob: '31/01/1999' },
          { name: 'Frank Harbours', location: 'Russia', gender: 'male', dob: '12/05/1966' }
        ]
      }
    ]
  },
  { name: 'Jamie Newhart', location: 'India', gender: 'male', dob: '14/05/1985' },
  { name: 'Gemma Jane', location: 'China', gender: 'female', dob: '22/05/1982', _children: [
    { name: 'Emily Sykes', location: 'South Korea', gender: 'female', dob: '11/11/1970' }] },
    { name: 'James Newman', location: 'Japan', gender: 'male', dob: '22/03/1998' }
];

2. 递归生成自定义行号

创建一个递归函数,该函数将遍历数据数组,为每个元素计算其层级编号并存储在 rowNum 字段中。

/**
 * 递归地为表格数据添加层级行号
 * @param {Array<Object>} data - 当前层级的数据数组
 * @param {string} parentRowNum - 父级行的行号(例如 "1", "1.1"),顶级调用时为空
 */
const numberRows = (data, parentRowNum = '') => {
  data.forEach((row, index) => {
    // 构建当前行的行号
    // 如果有父级行号,则以父级行号为前缀,加上 '.' 和当前索引+1
    // 否则,直接使用当前索引+1
    row.rowNum = (parentRowNum ? parentRowNum + '.' : '') + (index + 1);

    // 如果当前行有子行,则递归调用自身处理子行
    if (row._children) {
      numberRows(row._children, row.rowNum);
    }
  });
};

// 调用函数处理原始数据
numberRows(tableData);

这个 numberRows 函数接受两个参数:当前层级的数据数组 data 和可选的 parentRowNum。

芦笋演示 芦笋演示

一键出成片的录屏演示软件,专为制作产品演示、教学课程和使用教程而设计。

芦笋演示 227 查看详情 芦笋演示
  • parentRowNum 用于构建子行的前缀,确保层级关系。
  • forEach 循环遍历当前层级的所有行。
  • row.rowNum 的计算逻辑是关键:如果存在 parentRowNum,则当前行号是 parentRowNum 加上 . 和当前行的索引加一;否则,它只是当前行的索引加一。
  • 如果当前行有 _children,则递归调用 numberRows 函数,并将当前行的 rowNum 作为新的 parentRowNum 传递给子层级。

3. 配置 React Tabulator

在 React Tabulator 组件中,将预处理后的 tableData 传递给 data 属性,并为 rowNum 字段定义一个普通列。

import React, { useRef, useEffect } from 'react';
import { ReactTabulator } from 'react-tabulator';
import 'react-tabulator/lib/styles.css'; // 导入样式
import 'tabulator-tables/dist/css/tabulator.min.css'; // 导入 Tabulator 基础样式

// ... (tableData 和 numberRows 函数定义如上)

// 假设 numberRows(tableData) 已经执行,tableData 已经被添加了 rowNum 字段

const columns = [
  { title: '', field: 'rowNum', width: 100, headerSort: false }, // 渲染自定义的 rowNum 字段
  { title: 'Name', field: 'name', width: 150 },
  { title: 'Location', field: 'location', width: 140 },
  { title: 'Gender', field: 'gender', width: 100 },
  { title: 'Date Of Birth', field: 'dob', width: 140 }
];

const TabulatorComponent = () => {
  const ref = useRef(null);

  const options = {
    height: '300px',
    data: tableData, // 使用已经预处理过的 tableData
    dataTree: true, // 启用数据树功能
    dataTreeStartExpanded: true, // 默认展开所有节点
    columns: columns,
  };

  return (
    <ReactTabulator
      ref={ref}
      options={options}
      data={tableData} // 再次传入 data,确保组件接收到更新后的数据
      columns={columns}
    />
  );
};

export default TabulatorComponent;

注意: 尽管示例代码中使用了 vanilla JS 的 Tabulator 实例化方式 (new Tabulator(...)),但在 React 环境中,您应该使用 react-tabulator 组件,并通过其 options 属性来传递配置。核心的数据结构和列定义逻辑是相同的。

完整示例代码 (Vanilla JS Tabulator)

为了方便测试和理解,这里提供一个完整的 HTML 和 J*aScript 示例,可以直接在浏览器中运行:

<!DOCTYPE html>
<html>
<head>
  <title>React Tabulator 自定义层级行号</title>
  <link href="https://unpkg.com/tabulator-tables@5.6.0/dist/css/tabulator.min.css" rel="stylesheet">
  <script type="text/j*ascript" src="https://unpkg.com/tabulator-tables@5.6.0/dist/js/tabulator.min.js"></script>
  <style>
    body { font-family: sans-serif; margin: 20px; }
    #table { margin-top: 20px; }
  </style>
</head>
<body>
  <h1>Tabulator 嵌套数据自定义行号示例</h1>
  <div id="table"></div>

  <script type="text/j*ascript">
    const tableData = [
      { name: 'Oli Bob', location: 'United Kingdom', gender: 'male', dob: '14/04/1984', _children: [
          { name: 'Mary May', location: 'Germany', gender: 'female', dob: '14/05/1982' },
          { name: 'Christine Lobowski', location: 'France', gender: 'female', dob: '22/05/1982' },
          { name: 'Brendon Philips', location: 'USA', gender: 'male', dob: '01/08/1980', _children: [
              { name: 'Margret Marmajuke', location: 'Canada', gender: 'female', dob: '31/01/1999' },
              { name: 'Frank Harbours', location: 'Russia', gender: 'male', dob: '12/05/1966' }
            ]
          }
        ]
      },
      { name: 'Jamie Newhart', location: 'India', gender: 'male', dob: '14/05/1985' },
      { name: 'Gemma Jane', location: 'China', gender: 'female', dob: '22/05/1982', _children: [
        { name: 'Emily Sykes', location: 'South Korea', gender: 'female', dob: '11/11/1970' }] },
        { name: 'James Newman', location: 'Japan', gender: 'male', dob: '22/03/1998' }
    ];

    // 添加行号的递归函数
    const numberRows = (data, parentRowNum = '') => {
      data.forEach((row, index) => {
        row.rowNum = (parentRowNum ? parentRowNum + '.' : '') + (index + 1);

        if (row._children) {
          numberRows(row._children, row.rowNum);
        }
      });
    };

    // 执行行号预处理
    numberRows(tableData);

    // Tabulator 表格实例化
    const table = new Tabulator('#table', {
      height: '300px',
      data: tableData, // 使用已经处理过的带行号的数据
      dataTree: true, // 启用数据树功能
      dataTreeStartExpanded: true, // 默认展开所有节点
      columns: [
        { title: '', field: 'rowNum', width: 100, headerSort: false }, // 渲染自定义的 rowNum 字段
        { title: 'Name', field: 'name', width: 150 },
        { title: 'Location', field: 'location', width: 140 },
        { title: 'Gender', field: 'gender', width: 100 },
        { title: 'Date Of Birth', field: 'dob', width: 140 }
      ]
    });
  </script>
</body>
</html>

注意事项与总结

  1. 数据预处理时机: 这种方法的核心在于在数据加载到 Tabulator 之前完成行号的生成。这意味着如果您在 Tabulator 中动态添加、删除或重新排序行,您需要重新运行 numberRows 函数来更新所有行号,然后刷新 Tabulator 的数据。
  2. 性能考量: 对于非常庞大且深度嵌套的数据集,递归处理可能会有轻微的性能开销。但在大多数常见场景下,这种开销是可接受的。
  3. 灵活性: 这种方法非常灵活。您可以根据需要修改 numberRows 函数,以生成不同格式的行号,例如罗马数字、字母序列或其他自定义编号方案。
  4. 解耦: 将行号生成逻辑从 Tabulator 的渲染机制中解耦出来,使得代码更易于维护和测试。Tabulator 只需要渲染一个普通的字段,而无需关心其复杂的生成逻辑。
  5. 替代方案: 理论上,Tabulator 的 formatter 属性可以用来定义复杂的渲染逻辑。但对于层级行号这种需要访问父级上下文才能确定自身编号的情况,直接在 formatter 中实现会非常复杂,甚至不可行,因为它通常只接收当前行的数据。因此,数据预处理是更推荐和简洁的方案。

通过上述方法,您可以轻松地在 React Tabulator 的嵌套数据中实现自定义的、具有小数位层级结构的行号显示,从而提升表格的可读性和用户体验。

以上就是React Tabulator 嵌套数据行号自定义:实现层级小数位编号的详细内容,更多请关注其它相关文章!


# 但在  # 东莞seo软件很棒乐云seo专家  # 北京企业网站建设程序  # 广西 网站建设  # 晋中关键词排名哪家便宜  # 镇海网站建设网站  # seo分析课程  # 潜江seo视频  # 游戏推广平台网站有哪些  # 网站平台推广怎么做的快  # 健康菜谱网站排名优化  # 原始数据  # 只需要  # 您可以  # css  # 是在  # 数据结构  # 遍历  # 自定义  # 递归  # 行号  # 递归函数  # 浏览器  # js  # html  # java  # javascript  # react 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《淘票票》添加到苹果钱包教程  在Peewee中处理PostgreSQL记录重复:一站式数据摄取教程  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  Microsoft Edge网页字体太淡看不清怎么办_Microsoft Edge字体渲染优化技巧  《单词速记宝》设置学习计划方法  mysql数据库索引类型有哪些_mysql索引类型解析  mysql触发器如何编写_mysql触发器编写规范与代码示例讲解  steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明  《书耽》更换手机号方法  HTML与J*aScript实现下拉菜单驱动的动态表格:构建交互式维修表单  B站怎么开|直播| B站|直播|申请需要什么条件【新手必看】  构建可配置的J*aScript加权点击计数器与共享总计功能  《万兴喵影》导出视频方法  192.168.1.1路由器后台入口 192.168.1.1默认登录入口  深入理解J*aScript异步操作:setTimeout与调用栈的真相  如何在mysql中使用索引提示_mysql索引提示优化方法  PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】  《我的恋爱逃生攻略》中文名字输入方法  4399正版网页版入口高清直达链接  Python中安全地将环境变量转换为整数的类型注解指南  《暗黑破坏神4》国服回归送狂欢礼包 价值6916元  VS Code如何设置默认配置  汽水音乐网页端访问 汽水音乐官方网页直达  《火花chat》搜索好友方法  HTML中多图片上传与预览:解决ID冲突的专业指南  小米civi如何设置锁屏时间  研招网官方网站招生平台入口_中国研究生招生信息网官网登录  大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日  铁路12306官网登录入口 铁路12306在线购票官方平台  《红果免费短剧》下载观看方法  J*aScript 数值去小数位处理:多种方法与实践  OpenWeatherMap API:通过城市名称获取天气预报数据指南  Bootstrap 5导航栏折叠功能失效:数据属性迁移指南  照片整理的黄金法则是怎样的? 理解“收集-筛选-归档-备份”四步流程  J*aScript模拟悬停与点击:自动化网页动态元素交互指南  WPS长文档分栏排版不乱方法_WPS分栏+分节符报纸排版教程  《随手记》备份数据方法  《微信》视频号原创声明开启方法  Golang中的rune与byte类型区别是什么_Golang字符与字节处理详解  126邮箱网页在线登录2025_126邮箱网页版入口官方地址  如何测试您的网站全球打开速度-网站海外测速工  AO3中文入口稳定分享_AO3官网HTTPS看文详解  《tt语音》超级玩家开通方法  PHP odbc_fetch_array 返回值处理:如何正确访问嵌套数组元素  米侠浏览器插件无法启用怎么办 米侠浏览器扩展兼容性修复  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入  传统曲艺莲花落的表演形式是  Win11怎么设置分辨率 Win11显示设置调整分辨率及刷新率修改  c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践 

 2025-12-05

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.