新闻中心
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.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', loc
ation: '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);代码解析:
Health AI健康云开放平台
专注于健康医疗垂直领域的AI技术开放平台
113
查看详情
- 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 的版本号可能需要根据实际情况调整。
注意事项与总结
- 数据不可变性(React 环境): 如果您在 React 或其他前端框架中使用此方法,请注意数据不可变性。直接修改原始 tableData 可能不是最佳实践。在实际应用中,您可能需要先创建一个原始数据的深拷贝,然后对拷贝进行处理,或者在 useEffect 钩子中处理数据并更新 useState。
- 性能考虑: 对于包含数万甚至数十万行的超大型数据集,递归处理可能会有轻微的性能开销。但在大多数常见的业务场景中,这种预处理方式的性能影响可以忽略不计。
- 灵活性: 这种预处理方法非常灵活,您可以根据需要修改 numberRows 函数的逻辑,例如添加字母编号、罗马数字编号或其他复杂的编号方案。
- 排序: 默认情况下,Tabulator 可能会尝试对行号列进行字符串排序。如果您的行号是“1”、“1.1”、“1.10”、“1.2”,字符串排序可能会导致“1.10”排在“1.2”之前。为了避免这种情况,建议将 headerSort 设置为 false,或者实现一个自定义的 sorter 函数来处理层级行号的正确排序逻辑。
通过上述数据预处理的方法,我们可以有效地解决 React Tabulator 中嵌套数据自定义层级行号的显示问题,实现更具可读性和专业性的数据表格展示。
以上就是React Tabulator 嵌套数据自定义层级行号教程的详细内容,更多请关注其它相关文章!
# 或其他
# 白帽seo与黑帽seo
# 迪庆推广网站如何设计
# 简述网站建设介绍的内容
# 怎么学习seo网站优化
# 购物网站如何推广工作
# 济南网站优化体验
# 福建好的seo排名
# 陕州网站建设哪家便宜
# 睡衣市场营销推广方案
# 快手推广上热门网站
# 可选
# 请注意
# 加载
# css
# 遍历
# 原始数据
# 您的
# 自定义
# 递归
# 行号
# 递归函数
# 前端
# js
# html
# java
# javascript
# react
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
126邮箱网页版官方入口 126邮箱账号在线登录平台
在J*a项目里如何构建对象之间的契约_接口约束的实际落地
《燕云十六声》两周内达九百万玩家!位居畅销榜第五
Python:递归比较文件夹内容并找出特定类型文件的差异
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题
QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址
微信商城在哪里打开【步骤】
理解J*aScript Promise的微任务队列与执行顺序
漫蛙Manwa2官网入口地址分享 漫蛙漫画PC版永久访问通道
Flexbox布局实践:实现粘性导航栏与底部固定页脚
抖音怎么赚钱_抖音创作者变现方法与途径指南
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
Pygame教程:解决用户输入与游戏状态更新不同步问题
Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】
C++ explicit关键字防止隐式转换_C++构造函数安全规范
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践
PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程
《刺客信条:影》PS5 Pro和Switch 2画面对比
在Qt QML中通过Python字典动态更新TextEdit内容的教程
文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】
J*aScript中如何高效提取对象指定属性
React/Next.js中实现列表项的动态选择与移动
Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】
lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法
痛风发作了怎么办? 快速止痛和后期饮食调理
高德地图沿途添加点失败如何解决 高德多点规划方法
mcjs网页版在线存档 mcjs云存档登录入口
如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题
Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析
J*a里如何使用forEach遍历Map_Map遍历方法说明
汽水音乐网页版使用入口_汽水音乐电脑版播放指南
C++如何实现一个智能指针_手动实现C++ shared_ptr的引用计数功能
Python中高效访问嵌套字典与列表中的键值对
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】
蛙漫画网页版全站入口 蛙漫热门作品免费浏览
PHP中SSG-WSG API的AES加密实践:正确使用初始化向量
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
魅族20怎样在浏览器开无图省流_iPhone魅族20浏览器开无图省流【流量节省】
J*a应用集成GitHub CLI与API认证指南
c++如何实现单例设计模式_c++线程安全的单例模式写法
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
UC浏览器网页版登录入口官网 电脑版网址入口
天猫2025双十一0点秒杀攻略 天猫爆款抢购时间
淘宝支付提示失败如何解决 淘宝支付流程优化方法
网易大神怎么保存别人动态的图片_网易大神动态图片保存方法
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
微博网页版直接访问 微博网页版账号管理快速入口


2025-12-04
浏览次数:次
返回列表
ation: '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' }
];