ToolJet 表格条件格式化实战:基于 cellValue 与 rowData 动态设置文本颜色和单元格背景色
【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 🚀项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet
条件格式化(Conditional Formatting)是 ToolJet Table 组件中增强数据可读性的核心能力,它允许你根据单元格取值或整行数据动态调整单元格的文本颜色与背景色,从而让异常值、达标数据、分类差异一眼可辨。本指南以 ToolJet 3.0.0-LTS 文档为基础,结合仓库源码(frontend/src/AppBuilder/Widgets/NewTable)带你从创建应用、接入 REST API 数据源开始,逐步实现基于cellValue与rowData的高级条件格式化,并理解其底层求值机制。
前置准备:创建应用并接入 REST API 数据源
本指南全程在 ToolJet 可视化应用构建器中操作,无需编写后端代码。示例数据使用公开的假商店商品接口https://fakestoreapi.com/products,它返回包含title、price、rating、category等字段的商品列表,非常适合演示基于数值区间与分类的条件着色。
- 创建一个新应用,从左侧组件面板将Table组件拖入画布。
- 展开画布底部的Query Panel(查询面板),点击+ Add按钮新建查询。
- 数据源选择REST API,请求方法(Method)设置为
GET。 - 在 URL 栏输入以下端点并回车确认:
https://fakestoreapi.com/products- 点击Preview按钮预览返回的数据结构,确认字段后点击Run执行查询,完成数据拉取。
数据就绪后,需要将查询结果绑定到 Table 组件的Data属性上:
- 收起查询面板,点击画布中的 Table 组件打开右侧属性面板。
- 在
Data属性中输入以下表达式(ToolJet 双花括号求值语法):
{{queries.restapi1.data}}queries.restapi1.data中restapi1是查询的默认标识名(id),data是该查询成功返回的响应体。Table 组件会读取该数组并自动生成与字段对应的列。这一步完成 Table 的数据绑定,后续所有条件格式化都建立在这份数据之上。
开启条件格式化:进入列属性面板
条件格式化的入口在 Table 组件的Columns属性中,按列粒度配置:
- 打开 Table 组件的
Columns属性,展开你要配置的列(例如category、rate、title)。 - 确认该列的Column type(列类型)为
Default或String——只有这两种类型下,Text color(文本颜色)与Cell background color(单元格背景色)两个条件格式化入口才可用。 - 在对应属性输入框中写入带
{{ }}的表达式即可启用条件格式化。
关键约束:条件格式化表达式中,只有cellValue和rowData两个标识符可供使用。cellValue代表当前单元格的值,rowData代表当前行完整数据对象(可通过rowData.字段名访问任意列)。其余 Table 相关的全局变量、查询引用在单元格级样式的求值上下文中不可用。
颜色值支持形式
Text color与Cell background color的求值结果均为 CSS 颜色值,可使用:
- CSS 颜色关键字:
red、green、orange、cyan、pink、lightgray等; - HEX 十六进制色值:如
#D9534F(红)、#5CB85C(绿)、#F0AD4E(黄)。
从源码看,单元格渲染时背景色经由 TableRow.jsx 中getResolvedValue(cell.column.columnDef?.meta?.cellBackgroundColor, { rowData: row.original, cellValue: cell.getValue() })求值后写入backgroundColor,文本颜色则由各数据类型的 adapter 通过 useTextColor.js 钩子读取列级textColor并传递给渲染器(如 TextRenderer.jsx 中的color: textColor || 'inherit')。也就是说,你写入的表达式会被求值为具体颜色字符串,再作为行内样式应用到该行单元格上——这正是条件格式化的底层机制。
基于 cellValue 的条件格式化
cellValue是最直接的条件来源。本小节以商品评分(1~5 分)为例,为Rate列配置文本色与背景色。
示例 1:按评分区间切换文本颜色
选中列类型为Default/String的Rate列,在Text color属性中输入:
{{cellValue < 2 ? 'red' : cellValue > 2 && cellValue < 3 ? 'Orange' : 'green'}}该三元表达式链的执行逻辑:
| 条件 | 结果色 | 语义 |
|---|---|---|
cellValue < 2 | red(红) | 低分警示 |
cellValue > 2 && cellValue < 3 | Orange(橙) | 中等提醒 |
其余(即>= 3) | green(绿) | 高分通过 |
注意边界处理:该示例对cellValue === 2与cellValue === 3未显式匹配,实际会落入green分支。若需要严格按语义边界着色,应使用<=/>=等比较运算符显式覆盖每个区间。
示例 2:按评分区间切换单元格背景色
同样选中Rate列,在Cell background color属性中输入:
{{cellValue >= 4 ? 'lightgreen' : cellValue >= 3 ? 'lightyellow' : 'lightcoral'}}| 条件 | 结果色 | 语义 |
|---|---|---|
cellValue >= 4 | lightgreen(浅绿) | 高分突出 |
cellValue >= 3 | lightyellow(浅黄) | 中上提醒 |
其余(< 3) | lightcoral(浅珊瑚红) | 低分警示 |
背景色表达式与文本色表达式可以同时配置,二者互不影响——文本色作用于文字(渲染器中的color),背景色作用于单元格(td的backgroundColor),共同构成完整的视觉编码。
基于 rowData 的条件格式化
当条件需要跨列判断时,使用rowData访问整行数据。本小节以Title列为例,演示跨字段的条件着色。
示例 1:依据 price 与 rating 组合决定文本颜色
选中Title列,在Text color属性中输入:
{{rowData.price > 50 ? '#D9534F' : (rowData.rating.rate >= 4 ? '#5CB85C' : rowData.rating.rate >= 3 ? '#F0AD4E' : '#D9534F' )}}求值优先级由外层条件rowData.price > 50先行裁决:
price > 50→ 红色#D9534F;- 否则进入括号内嵌套判断
rowData.rating.rate:>= 4→ 绿色#5CB85C;>= 3→ 黄色#F0AD4E;- 其余 → 红色
#D9534F。
这里rowData.rating.rate展示了嵌套对象访问语法:fakestoreapi 的rating字段本身是一个对象,必须通过rowData.rating.rate取到具体评分。这也是rowData与cellValue的本质区别——前者拥有整行上下文,可以组合任意列构造复杂规则。
示例 2:依据商品分类决定背景色
继续选中Title列,在Cell background color属性中输入:
{{rowData.category === "electronics" ? 'cyan' : rowData.category === "jewelery" ? 'pink' : 'lightgray'}}| 条件 | 结果色 | 语义 |
|---|---|---|
rowData.category === "electronics" | cyan(青) | 电子产品 |
rowData.category === "jewelery" | pink(粉) | 珠宝饰品 |
| 其余分类 | lightgray(浅灰) | 其他 |
字符串比较使用严格相等===,需与数据中的实际取值完全一致(包括大小写)。若分类值可能包含前后空格或大小写变体,可先用rowData.category.trim()或toLowerCase()归一化后再比较。
求值机制与注意事项
底层求值链路
条件格式化的表达式在单元格渲染时按行求值。核心链路如下:
- TableRow.jsx 在渲染每个单元格时,通过
getResolvedValue(columnDef.meta.cellBackgroundColor, { rowData: row.original, cellValue: cell.getValue() })解析背景色,并把rowData与cellValue作为求值上下文注入——这与文档中“仅cellValue与rowData可用”的约束完全对应; - 文本颜色经 useTextColor.js 读取列级
textColor,在列级样式未显式配置或为默认值#11181C时回退到 Table 组件的全局文本色,最终交给 TextRenderer.jsx 以行内color样式生效; - 列属性面板中这两个入口定义在 StylesTabElements.jsx,对应
Text color(颜色/色板控件)与Cell background color。
实践建议
- 表达式必须用
{{ }}包裹,ToolJet 会将其作为 JavaScript 表达式求值,返回值即为颜色值; - 保持可读性:复杂规则可分层嵌套,注意括号配对(参考示例 1 中括号包裹的嵌套分支),必要时拆分为多个简单规则逐列配置;
- 优先使用语义化颜色:如
lightcoral/lightyellow这类浅色系对文字可读性更友好,深色文字配深色背景会难以辨识; - 区分数据类型:
cellValue比较时注意类型(数字与字符串),来自 REST API 的数值字段若被解析为字符串,cellValue < 2会退化为字符串比较,建议先用Number(cellValue)转换; - 组合使用:文本色与背景色可以同时作用于一列,形成“高对比 + 底色”的双重视觉编码,也可将多个列分别配置形成整行级联的配色方案。
总结
通过本指南,你已掌握 ToolJet Table 组件条件格式化的完整流程:从 REST API 数据接入、Table 数据绑定,到基于cellValue(单列取值)与rowData(整行上下文)在Text color与Cell background color属性中编写三元表达式规则,并了解了getResolvedValue求值机制与颜色回退逻辑。条件格式化的核心价值在于将原始数据转化为可扫描的视觉信号——你可以在此基础之上,针对业务场景自由组合不同条件与颜色组合,构建更具信息量的数据表格。
【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 🚀项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考