templet 中不能直接调用 layui.progress(),因返回纯 html 字符串、dom 未挂载;须在 done 回调中用 class+data-* 定位元素并传原生 dom 调用,环形进度条需手写 svg,更新时须用 data-id 精准定位。

templet 里不能直接调用 layui.progress()
因为 templet 返回的是纯字符串 HTML,此时 DOM 还没挂载,layui.progress() 需要真实 DOM 元素和模块初始化环境,直接写 layui.progress(elem, {...}) 会报错或静默失败。你看到的“空白单元格”或控制台报 Cannot read property 'progress' of undefined,基本就是这个原因。
必须把渲染逻辑拆开:模板只负责输出带数据标记的容器,初始化交给 done 回调。
-
templet返回类似<div class="progress-cell" data-percent="75" data-color="#5FB878"></div>的结构 - 确保
data-percent是数字(非null/undefined),建议 fallback:parseInt(d.rate) || 0 - 避免用
id,分页重载后会重复;优先用class+data-*传参
done 回调里怎么安全初始化 layui.progress()
done 是表格完成渲染、所有单元格 DOM 已就位的唯一可靠时机。这里要遍历、读参、逐个调用,且每次触发都要重新执行(因为分页/重载会重建 DOM)。
- 用
layui.$('.progress-cell[data-percent]')或原生document.querySelectorAll('.progress-cell[data-percent]')获取元素 -
layui.progress()第一个参数必须是原生 DOM 元素,不是 jQuery 对象 → 写成elem[0]或elem.get(0) - 读取参数示例:
const percent = parseInt(elem.attr('data-percent')) || 0;,const color = elem.attr('data-color') || '#009688'; - 调用:
layui.progress(elem[0], { percent, barColor: color, text: percent + '%' })
需要环形进度条?别碰 element.progress 的 type: 'circle'
Layui 的环形进度条不支持嵌入表格单元格:它依赖主动 render(),且不支持更新已有实例。表格翻页后 DOM 销毁,环形状态丢失,重复调用会警告或错乱。
真要环形,得手写 SVG:
- 在
templet中返回固定尺寸的<svg></svg>,例如<svg width="32" height="32" viewbox="0 0 32 32"></svg> - 背景圆用
<circle r="14" stroke="#e6e6e6"></circle>,进度弧用另一个<circle></circle>,靠stroke-dasharray和stroke-dashoffset控制长度 - 计算公式:
dashOffset = 87.96 * (1 - Math.min(Math.max(percent, 0), 100) / 100)(87.96 是周长) - 不依赖 JS 初始化,纯 CSS + 数据驱动,分页重载完全无感
实时更新进度值时,DOM 定位不能靠索引
如果进度值来自 WebSocket 或轮询,后续更新需精准匹配数据行和对应 DOM。表格排序、分页、搜索会打乱行顺序,用 tr:eq(2) 或数组下标定位必然出错。
- 给每行数据加唯一标识,比如
d.id或d.sn -
templet中写:<div class="progress-cell" data-id="' + d.id + '" data-percent="' + d.rate + '"></div> - 更新时用
document.querySelector('.progress-cell[data-id="123"]')找到目标,再改style.width或重新调layui.progress() - 若用
layui.progress()更新,注意它不支持“刷新”,只能先移除旧节点再重建 —— 更推荐纯 CSS 方案:elem.style.width = d.rate + '%'
表格单元格内嵌进度条最易忽略的点:模板不转义、DOM 时机错、环形硬套官方组件、更新时用索引定位。这四个坑踩中任意一个,都会导致进度条不显示、错位、卡死或翻页后消失。











