在数据表格里,用一个小小的圆点指示灯来直观展示库存状态,比如绿色代表有货、红色代表缺货,这种设计既简洁又高效。但如果你用的是Layui框架,会发现它并没有内置这个“画圆点”的功能。别担心,实现起来并不复杂,核心就是利用好表格的 templet 列模板功能。 使用 templet 渲染自定义单元格内容
Layui表格单元格内显示圆形库存状态指示灯
时间:2026-06-03
浏览:182
文章目录
在数据表格里,用一个小小的圆点指示灯来直观展示库存状态,比如绿色代表有货、红色代表缺货,这种设计既简洁又高效。但如果你用的是Layui框架,会发现它并没有内置这个“画圆点”的功能。别担心,实现起来并不复杂,核心就是利用好表格的 templet 列模板功能。

使用 templet 渲染自定义单元格内容
Layui表格的列配置中,templet 选项是你的“画笔”。它允许你传入一个函数,该函数会接收到当前行的数据对象,你返回什么字符串,单元格就渲染什么。所以,画圆点的本质,就是在这个函数里拼接出一段包含 和内联样式的HTML代码。
这里有三个关键点需要注意:
- 不要用
field直接存储HTML:如果试图在数据源的field字段里直接写上标签,Layui默认会进行转义,最终页面上显示的是原始的字符串文本,而不是一个圆点。 - 正确获取数据:
templet函数的参数(通常命名为data)就是当前行的数据。假设你的库存数字字段叫stock,那么用data.stock就能获取到值进行判断。 - 内联样式是关键:为确保样式只作用于这个圆点,避免被全局CSS干扰,推荐使用内联样式。其中,
display: inline-block是必须的,否则你设置的width和height不会生效。
一个基础的实现代码示例如下:
templet: function(data) {
let color = data.stock > 0 '#5FB878' : '#FF5722';
return '';
}
库存状态颜色逻辑写在哪里?避免硬编码进 templet
上面的例子为了清晰,把颜色判断逻辑直接写在了 templet 函数里。这在demo中没问题,但在实际项目中却存在隐患。想象一下,库存状态可能不止“有/无”两种,未来可能会增加“库存紧张”、“预售中”、“已停售”等多种状态,一旦颜色逻辑需要修改,所有用到这个 templet 的地方都得改一遍。
更优雅的做法是:
- 抽离为独立函数:定义一个如
getStockStatusColor(value)的工具函数,专门负责根据输入值返回对应的颜色码。这样,业务逻辑和视图渲染就解耦了。 - 使用映射表,避免硬编码:如果后端返回的是状态码(例如
status: 1),不要在前端写死if (data.status === 1)。应维护一个状态码到颜色(甚至到提示文案)的映射对象,例如{1: '#5FB878', 2: '#FF5722', 3: '#FFB800'}。这极大提高了可维护性和支持多语言的潜力。 - 处理边界情况:务必考虑
null、undefined、空字符串等异常值。如果没有兜底处理,可能导致颜色计算错误,圆点显示为默认背景色(通常是白色或透明),从而“消失”在表格中。
为什么使用 border-radius: 50% 有时不是正圆?
明明代码写了 border-radius: 50%,但渲染出来的却是椭圆,或者位置有些偏移?这通常由两个原因造成:
- 宽高不等:这是最常见的原因。
border-radius: 50%是基于元素自身的宽高来绘制圆角的。你必须显式地设置width和height为相同的像素值,例如都是12px,只设置一个是不行的。 - 行内对齐干扰:Layui的表格单元格是
元素,它本身有默认的垂直对齐方式(通常是 baseline)。这可能导致你的圆点在行内布局中上下偏移。解决方法是在圆点的样式中加入vertical-align: middle。如果希望整个圆点在单元格内水平居中,可以再额外包裹一个设置了text-align: center的。- 单位选择:尽量避免使用
em或百分比这类相对单位来定义圆点大小。当表格字体缩放或进行响应式布局时,相对单位可能导致圆点大小失控、变形。固定像素值(px)在大多数场景下更可控。- 移动端适配:在高DPI的移动设备屏幕上,
12px的圆点可能显得过小,不易辨认。可以考虑将基础尺寸适当放大,例如从14px起步。渲染性能:大量行时避免在
templet中做复杂计算templet函数在表格初始化、滚动、排序、筛选时会被频繁调用。如果函数内部执行了复杂的计算,比如多层循环、正则匹配、DOM查询或者繁重的数据格式化,当数据量很大时,就会明显感觉到页面卡顿。如何优化?
- 保持
templet轻量:像上面判断库存颜色这种简单的映射操作,开销很小,可以放在这里。但如果颜色的判断需要综合stock(库存)、preOrder(预售)、lockQty(锁定数量)等多个字段进行复杂计算,更好的做法是在数据层面预先处理好。可以利用Layui的parseData回调,在数据加载后立即计算出一个新的状态字段,或者直接请求后端返回一个计算好的状态码。 - 避免渲染重型组件:切忌在
templet中直接调用laydate.render()、layer.open()这类会初始化复杂DOM组件的API。这会导致每个单元格都初始化一个独立实例,造成巨大的性能开销和内存占用。 - 性能测试方法:如果怀疑性能问题出在
templet上,可以打开浏览器的开发者工具(如Chrome DevTools),进入“Performance”面板,录制一个滚动表格的操作。然后查看火焰图中是否密集出现了你的templet函数调用,这能帮你快速定位瓶颈。
最后,分享一个实践中容易被忽略但至关重要的点:状态映射的健壮性。后端接口的字段名可能会调整,多语言环境下返回的可能是文本而非数字,甚至某个字段可能偶尔缺失。如果
templet中的逻辑没有兜底,圆点就可能显示异常或消失。与其在函数里堆砌一堆||和三元运算符嵌套,不如在颜色映射函数中设置一个默认的“未知状态”颜色(如灰色),并加入console.warn在开发阶段给出友好提示,这样既能保证UI不崩坏,也便于快速定位数据问题。 - 单位选择:尽量避免使用
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。