React Tabulator 嵌套数据自定义层级行号教程


React Tabulator 嵌套数据自定义层级行号教程

本教程旨在解决react tabulator中嵌套数据(数据树)自定义层级行号显示的问题。当默认的行号格式化器无法满足“1.1”、“1.2”等小数点层级编号需求时,我们将通过在数据加载到tabulator之前进行预处理,递归地为每个父子行添加自定义的`rownum`字段,从而实现灵活且准确的层级行号显示。

解决 React Tabulator 嵌套数据自定义层级行号问题

在使用 React Tabulator 构建数据树(Nested data)时,我们经常需要为父行和子行显示具有层级关系的行号,例如“1”、“1.1”、“1.2”、“2”、“2.1”等。Tabulator 默认的 rownum 格式化器通常只提供简单的递增序号,并且在处理子行时可能会显示为“0”或无法满足复杂的层级编号需求。本教程将介绍一种通过数据预处理的方式,在将数据加载到 Tabulator 之前,为数据添加自定义的层级行号字段,从而实现灵活的层级编号显示。

问题场景描述

假设我们有一个包含父子关系的数据集,并希望在 Tabulator 中以树形结构展示,同时为每一行(包括子行)分配一个具有层级感的行号。例如:

  1. 父项 1
    • 1.1. 子项 1
    • 1.2. 子项 2
  2. 父项 2
    • 2.1. 子项 1

Tabulator 的内置功能可能难以直接实现这种带有小数点分隔的层级编号。

解决方案:数据预处理

由于 Tabulator 内部的格式化器可能无法直接处理这种复杂的层级编号逻辑,一个有效的替代方案是在数据加载到 Tabulator 之前,对原始数据进行递归处理,为每个数据项添加一个包含正确层级行号的自定义字段。

步骤一:准备原始数据

首先,定义您的原始数据集。这个数据集应该包含一个用于表示子项的特殊字段(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' }
];
步骤二:实现递归行号生成函数

创建一个递归函数,遍历数据集,并为每个父项和子项生成一个名为 rowNum 的新字段,该字段将存储我们所需的层级行号。

// 添加行号的递归函数
const numberRows = (data, parentRowNum = '') => {
  data.forEach((row, index) => {
    // 构建当前行的行号
    // 如果有父级行号,则以“父级行号.”开头,否则直接是当前层级的序号
    row.rowNum = (parentRowNum ? parentRowNum + '.' : '') + (index + 1);

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

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

代码解析:

6pen Art 6pen Art

AI绘画生成

6pen Art 213 查看详情 6pen Art
  • numberRows(data, parentRowNum = ''): 函数接收两个参数,data 是当前需要处理的数据数组,parentRowNum 是可选的父级行号字符串,默认为空,表示处理顶级数据。
  • data.forEach((row, index) => { ... }): 遍历当前层级的所有行。
  • row.rowNum = (parentRowNum ? parentRowNum + '.' : '') + (index + 1);: 这是核心逻辑。
    • parentRowNum ? parentRowNum + '.' : '': 检查 parentRowNum 是否存在。如果存在(即不是顶级行),则在其后添加一个点 .。如果不存在,则为空字符串。
    • (index + 1): 获取当前行在当前层级中的索引(从1开始)。
    • 将这两部分拼接起来,形成最终的 rowNum,例如 "1"、"1.1"、"1.2.1" 等。
  • if (row._children) { numberRows(row._children, row.rowNum); }: 如果当前行有 _children 属性,说明它有子项,则以当前行的 rowNum 作为新的 parentRowNum,递归调用 numberRows 函数处理子项。
步骤三:在 Tabulator 中配置列

在 Tabulator 的列定义中,添加一个新列来显示我们刚刚生成的 rowNum 字段。

// 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 }
  ]
});

配置要点:

  • data: tableData: 确保将经过 numberRows 函数处理后的 tableData 传递给 Tabulator。
  • dataTree: true: 必须启用数据树功能才能正确显示嵌套数据。
  • dataTreeStartExpanded: true: (可选)如果希望表格默认展开所有层级,可以设置此项。
  • { title: '', field: 'rowNum', width: 100, headerSort: false }: 定义一个新列,其 field 属性指向我们自定义的 rowNum 字段。title 可以为空字符串,或者根据需要设置。headerSort: false 可以防止用户对行号列进行排序,因为这可能会打乱层级结构。
步骤四:HTML 结构和 Tabulator 引入

确保您的 HTML 文件中包含 Tabulator 的 CSS 和 J*aScript 引用,以及一个用于渲染表格的 div 元素。

<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>

<div id="table"></div>

请注意,tabulator-tables 的版本号可能需要根据实际情况调整。

注意事项与总结

  1. 数据不可变性(React 环境): 如果您在 React 或其他前端框架中使用此方法,请注意数据不可变性。直接修改原始 tableData 可能不是最佳实践。在实际应用中,您可能需要先创建一个原始数据的深拷贝,然后对拷贝进行处理,或者在 useEffect 钩子中处理数据并更新 useState。
  2. 性能考虑: 对于包含数万甚至数十万行的超大型数据集,递归处理可能会有轻微的性能开销。但在大多数常见的业务场景中,这种预处理方式的性能影响可以忽略不计。
  3. 灵活性: 这种预处理方法非常灵活,您可以根据需要修改 numberRows 函数的逻辑,例如添加字母编号、罗马数字编号或其他复杂的编号方案。
  4. 排序: 默认情况下,Tabulator 可能会尝试对行号列进行字符串排序。如果您的行号是“1”、“1.1”、“1.10”、“1.2”,字符串排序可能会导致“1.10”排在“1.2”之前。为了避免这种情况,建议将 headerSort 设置为 false,或者实现一个自定义的 sorter 函数来处理层级行号的正确排序逻辑。

通过上述数据预处理的方法,我们可以有效地解决 React Tabulator 中嵌套数据自定义层级行号的显示问题,实现更具可读性和专业性的数据表格展示。

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


# 或其他  # 个人网站建设郑州  # 国外活动推广网站  # 京东423营销推广方案  # 琼中互联网营销推广  # 南宁网站推广维欣LS15227  # 网站推广优化案例怎么写  # 仪征律师网站推广公司  # 正规网站优化预算  # 企业站seo sit  # 从化网站推广多少钱  # 可选  # 请注意  # 加载  # css  # 遍历  # 原始数据  # 您的  # 自定义  # 递归  # 行号  # 递归函数  # 前端  # js  # html  # java  # javascript  # react 


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


相关推荐: 《友玩*》创建群聊方法  键盘测试软件哪个好_键盘故障检测工具推荐  Python高效统计字典嵌套列表值在目标列表中的出现次数  抖音评论无法发送如何修复 抖音评论功能操作指南  KFC邀请码怎么使用领额外优惠_KFC邀请码输入方式与额外优惠代码获取方法  J*aScript大数运算_BigInt使用指南  冬季去寒冷地区旅游,以下哪种做法有助于缓解冻伤  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程  PHP使用DOMDocument与XPath精准追加XML元素教程  微信客户端怎么查看二维码_微信客户端个人二维码查看方法  sf漫画官网登录入口直达_sf漫画官方正版网址  Win11怎么开启HDR_Windows 11显示器画质增强设置  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  掌握Go App Engine项目结构与GOPATH:包管理与导入实践  优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南  sublime怎么在文件中显示代码结构大纲_sublime符号列表功能  晓晓优选app支付宝绑定方法  poki官网最新入口 poki小游戏大全入口  Three.js中动态更换3D模型纹理的教程  电脑桌面图标怎么变大变小_Windows个性化设置第一课【新手入门】  PySimpleGUI中实现键盘按键与按钮事件绑定教程  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  mysql导入sql文件能分批导入吗_mysql分批次导入大sql文件的实用技巧  苹果如何下载nanobanana  邮政快递寄件查询入口 邮政快递收件查询入口  b站怎么查看视频的码率_b站视频码率查看方法  解决SQLAlchemy模型跨文件关联的Linter兼容性指南  PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略  抖音赚钱快速入门_新手必看的抖音赚钱步骤  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  win11怎么更改账户类型 Win11标准用户和管理员权限切换【教程】  海棠书屋官方在线书籍入口 海棠书屋文学作品浏览官网链接  实现可重用自定义Python Range类  Coolpad5890 ROM刷机包  学习通网页版课程打不开_课程无法访问时的解决方法  Linux如何自动分析系统异常日志_Linux日志智能检测  mysql如何回滚事务_mysql ROLLBACK事务回滚方法  oppo手机如何通过下拉通知栏截图_oppo手机通知栏快捷截图方法  OTT月报 | 2025年9月智能电视大数据报告  鲨鱼剧场app金币获取方法  HTML中多图片上传与预览:解决ID冲突的专业指南  如何使用 composer 和 aop-php 实现 AOP 编程?  Google Cloud Functions 时区处理指南:理解与最佳实践  Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】  word页码灰色不能用如何解决  纯CSS实现自适应宽度与响应式布局的水平按钮组  国际经济与贸易就业方向解析  稻壳阅读器官方直达网址链接 稻壳阅读器文档阅读平台主页资源入口  TikTok网页版入口快速访问 TikTok官网账号登录方法 

 2025-12-04

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

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

点击免费数据支持

提交您的需求,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.