十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

不用重写滚动逻辑!用 react-native-table-component 3 步搞定 App 里的数据表格

不用重写滚动逻辑!用 react-native-table-component 3 步搞定 App 里的数据表格 不用重写滚动逻辑用 react-native-table-component 3 步搞定 App 里的数据表格【免费下载链接】react-native-table-componentBuild table for react native项目地址: https://gitcode.com/gh_mirrors/re/react-native-table-component核心速览react-native-table-component 是一个为 React Native 量身打造的表格组件库整个库只有 4 个组件文件、1 个工具函数却能覆盖从简单数据列表到固定表头横屏滚动表格再到合并单元格复杂报表的几乎所有场景。本文从真实业务痛点出发带你用最短路径跑通、拆解设计思路最后给出可直接复制的完整示例与避坑清单。一、先说说那个让人想砸键盘的下午你在做一款移动端报表 App需求很朴素把接口返回的几十行数据像 Excel 一样规规矩矩地展示出来。然后你发现React Native 官方并没有提供Table组件。于是你开始手写外层View加flexDirection: row内层再套View一个格子一个格子地摆表头要固定、内容区要滚动于是ScrollView里套ScrollView坐标还对不齐想加边框Android 和 iOS 的边框渲染差异让你抓狂数据一变行高列宽全部塌掉你只能手动重算。如果你也有过类似的经历那么react-native-table-component就是来救场的。它的思路很干脆把表格这件事抽象成几个极简组件你只负责给数据布局和边框交给组件内部处理。二、3 分钟跑通第一个表格先安装npm 和 yarn 任选npm install react-native-table-component --save # 或 yarn add react-native-table-component然后在任意页面里写入下面这段最小示例import React, { Component } from react; import { StyleSheet, View } from react-native; import { Table, Row, Rows } from react-native-table-component; export default class Demo extends Component { render() { return ( View style{styles.container} Table borderStyle{{ borderWidth: 2, borderColor: #c8e1ff }} Row data{[姓名, 年龄, 城市]} style{styles.head} textStyle{styles.text} / Rows data{[ [小明, 25, 北京], [小红, 22, 上海], [小刚, 30, 广州], ]} textStyle{styles.text} / /Table /View ); } } const styles StyleSheet.create({ container: { flex: 1, padding: 16, paddingTop: 30, backgroundColor: #fff }, head: { height: 40, backgroundColor: #f1f8ff }, text: { margin: 6 }, });到这里你已经得到一张带边框、带表头的完整表格。整个过程只用到 3 个概念Table 是容器Row 是表头行Rows 一次性渲染多行数据。你可能会问为什么要分Row和Rows两个组件往下看就明白了。三、核心设计同一个表格三种切分视角这个库最聪明的地方是它没有把表格当成一个黑盒组件而是拆成了三套互相独立、又能自由组合的积木。理解这一点后面所有高级玩法都能顺手拈来。视角一按行切分Row / Rows——最常见的数据表格Row渲染单行适合表头、汇总行这种需要单独定制样式的场景Rows接收二维数组一次渲染多行适合纯数据区。Rows内部其实就是循环调用Row所以两者的属性完全兼容data传数组widthArr控制每列宽度flexArr控制每列 flex 占比heightArr逐行指定高度。源码里Rows对data逐条 map 出Row本质是批量和单个的关系这也是为什么头部分离着写、数据区整块传代码既清晰又省事。视角二按列切分Col / Cols——给表格做侧边栏当你的表格需要一个固定左侧标题列、或者需要列与列之间差异化布局时行视角就不够用了。这时用Col垂直渲染一列数据用Cols批量渲染多列。典型场景是左列标题 右侧数据的经典报表结构左侧一列用Col放行标题右侧用Rows放数据中间再用一个TableWrapper把两者并排包起来天然实现首列固定的效果。视角三单元格视角Cell / TableWrapper——完全自由的手工模式如果表头要合并、单元格里要塞按钮、某个格子要跨行——以上两种数据驱动的方式都办不到。这时请直接上Cell它接受任意data而且支持传入 React 元素。Cell data{TouchableOpacity onPress{handleClick}Text操作/Text/TouchableOpacity} /配合TableWrapper一个不带任何样式的纯容器专门用来自由组合行与列你可以像拼乐高一样手工搭出任意结构。v1.1.1 版本起data支持自定义组件这是表格从展示走向可交互的关键特性。四、实战落地一个可运行的销售报表把三种视角组合起来做一个带固定表头、可横屏滚动、含斑马纹的销售报表。数据量一多横屏滚动就躲不掉了这个例子演示了如何让表头与内容区对齐、滚动方向一致。import React, { Component } from react; import { StyleSheet, View, ScrollView } from react-native; import { Table, Row, Rows } from react-native-table-component; export default class SalesReport extends Component { constructor(props) { super(props); const head [产品, 一月, 二月, 三月, 四月, 五月, 六月]; const widthArr [80, 70, 70, 70, 70, 70, 70]; const data []; for (let i 1; i 20; i) { data.push([ 产品${i}, (i * 137).toString(), (i * 96).toString(), (i * 128).toString(), (i * 77).toString(), (i * 89).toString(), (i * 162).toString(), ]); } this.state { head, widthArr, data }; } render() { const { head, widthArr, data } this.state; return ( View style{styles.container} ScrollView horizontal{true} View Table borderStyle{{ borderWidth: 1, borderColor: #C1C0B9 }} Row data{head} widthArr{widthArr} style{styles.header} textStyle{styles.headerText} / /Table ScrollView style{styles.body} Table borderStyle{{ borderWidth: 1, borderColor: #C1C0B9 }} {data.map((row, index) ( Row key{index} data{row} widthArr{widthArr} style{[styles.row, index % 2 { backgroundColor: #F7F6E7 }]} textStyle{styles.text} / ))} /Table /ScrollView /View /ScrollView /View ); } } const styles StyleSheet.create({ container: { flex: 1, padding: 16, paddingTop: 30, backgroundColor: #fff }, header: { height: 50, backgroundColor: #537791 }, headerText: { textAlign: center, color: #fff, fontWeight: bold }, body: { marginTop: -1 }, row: { height: 40, backgroundColor: #E7E6E1 }, text: { textAlign: center }, });要点讲解表头和内容区分别放在两个Table中共用同一个widthArr这是保证两区列宽对齐的唯一关键外层ScrollView负责横向滚动内层负责纵向滚动互不干扰用index % 2实现斑马纹视觉上一目了然两个 Table 之间marginTop: -1消除双边框造成的缝隙。五、避坑指南官方文档没明说的 5 个细节这几个坑我基本都踩过提前知道能省一下午Col / Cols 里的单元格不支持自适应高度。heightArr必须显式给出行高否则文字溢出或布局错乱。这是官方 Notice 里明确写的限制。调整内边距请用textStyle里的margin不要用padding。组件内部对 Text 的样式处理方式是围绕margin设计的用padding会出现意外的间距偏差。borderWidth 默认值是 0不是 1。这是 v1.2.1 的破坏性变更。很多人升级后表格边框突然不见了就是这个原因。想要边框务必显式传borderStyle{{ borderWidth: 1 }}。父元素不是 Table 时必须手动补borderStyle。比如把TableWrapper或Cols直接放进ScrollView边框不会自动继承需要像这样显式声明ScrollView horizontal{true} TableWrapper borderStyle{{ borderWidth: 2, borderColor: blue }} Cols data{data} / /TableWrapper /ScrollViewCell 未指定 width / flex / height / style 时会自动补flex: 1。这是源码里的兜底逻辑想让单元格按内容自然撑开反而要主动给宽度或 flex 值。六、进阶延伸往交互和性能方向走当你掌握了三种视角的组合这个库能玩出的花样远超表格本身交互单元格给Cell的data传入TouchableOpacity、Switch、TextInput一张静态表格立刻变成可点击、可编辑的录入界面合并与复杂表头Table内部可以放任意嵌套结构参考源码components/table.js的_renderChildren它会自动向子组件透传borderStyle用TableWrapper分层嵌套即可实现跨列、跨行的复杂布局冻结首列用Table的style{{ flexDirection: row }}配合左右两个TableWrapper左侧放Col右侧放Cols就能做出横屏滚动时首列固定不动的效果组件演进方向原项目作者因精力原因已停止维护后续版本API 初期兼容本库转向基于 Reanimated 的高性能表格实现如果你已经熟悉本库的 API将来迁移新版本几乎没有学习成本。值得一提的是整个库的源码非常小核心逻辑集中在components/目录下的 4 个文件和utils/index.js里的一个sum函数。遇到奇怪的布局问题直接翻开源码读一遍几分钟就能定位——这本身就是学习 React Native 布局思想的好教材。七、总结与下一步回顾一下我们用 react-native-table-component 解决了三个层面的问题快TableRowRows三件套分钟级产出基础表格活行 / 列 / 单元格三种视角自由组合覆盖从数据展示到手工复杂布局稳只要记住widthArr对齐、margin调间距、borderWidth默认 0 这三个习惯基本不会踩坑。下一步建议现在就打开你的项目装一个试试先跑一遍文中的销售报表示例然后试着把其中一列替换成按钮感受一下Cell传入 React 元素的灵活性。等你能熟练组合三种视角再回头去看源码components/rows.js和components/cols.js你会发现自己对 React Native 的 flex 布局理解又上了一个台阶。动手吧你的第一张能滚动的表格离你只有 3 分钟。【免费下载链接】react-native-table-componentBuild table for react native项目地址: https://gitcode.com/gh_mirrors/re/react-native-table-component创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表