<p>Layui模板中需用{{# if() { }}语法而非原生JavaScript的if语句,因artTemplate引擎仅解析其自定义语法;条件逻辑须置于{{# }}内,访问数据对象d,不可声明函数,HTML片段需用{{# }}包裹防转义。</p>
templet 里不能直接写 if,得用 Layui 的模板语法
在 templet 字段里写原生 javascript 的 if 会报错或不生效,因为 layui 模板引擎(基于 arttemplate)不解析普通 js 语句,只认它的自定义语法,比如 {{# if(...) { }} 这种。
常见错误现象:写成 if(d.status === 1) { return '启用'; },结果表格单元格空白、控制台没报错但逻辑不执行。
- 必须用
{{# if(...) { }}/{{# } else { }}/{{# } }}包裹条件分支 - 模板内只能访问当前行数据对象
d,不能访问外部变量(除非通过lay-data或全局变量传入) - 所有 JS 表达式要写在
{{# ... }}内,且结尾不加;(语法要求)
写三元表达式最简,但复杂逻辑必须用 if 块
简单状态映射用三元足够,比如状态码转文字;但涉及多个判断、嵌套或需要执行多行操作时,就得上 {{# if}} 块。
使用场景:后台返回数字状态(0/1/2),需渲染为「未开始」「进行中」「已结束」;或根据权限字段决定是否显示操作按钮。
- 三元示例:
templet: '<div>{{ d.status == 1 ? "启用" : "禁用" }}</div>' - if 块示例:
templet: '<div>{{# if(d.status == 0) { }}未开始{{# } else if(d.status == 1) { }}进行中{{# } else { }}已结束{{# } }}' - 注意:
{{# }}是 Layui 模板的 JS 执行标记,不是 HTML 标签,别漏掉#
字符串拼接和 HTML 转义容易出错
模板里直接拼 HTML 是常规操作,但 Layui 默认会对 {{ d.xxx }} 中的内容做 HTML 转义(防止 XSS),而 {{# }} 块里的字符串默认不转义 —— 这点非常关键,也最容易踩坑。
比如你想渲染一个带 class 的 badge:<span class="layui-badge">启用</span>,如果写成 {{ d.status == 1 ? '<span class="layui-badge">启用</span>' : '禁用' }},尖括号会被转义成 <span>,页面就显示源码了。
- 解决办法:用
{{# d.status == 1 ? '<span class="layui-badge">启用</span>' : '禁用' }}(用{{# }}包裹整个表达式) - 或者更稳妥:统一用
{{# if}}块,里面直接写 HTML 片段,不走变量插值 - 性能影响小,但兼容性要注意:Layui 2.8+ 对模板解析更严格,旧版可能容忍不规范写法,新版会静默失败
函数调用要提前定义,templet 里不能声明函数
有人想在 templet 里写 function getStatusText(s) { ... } 再调用,这不行。模板字符串里只允许表达式和语句块,不支持函数声明。
正确做法是把工具函数挂到 window 下,或在 table.render() 外提前定义,再在模板里调用。
- 例如:
window.getStatusText = function(s) { return {0:'停用',1:'启用'}[s] || '-'; }; - 然后 templet 写:
{{# window.getStatusText(d.status) }} - 注意:函数名、参数名、返回值都必须是确定的,不能在模板里动态构造函数名(如
window[d.fn]会报 undefined) - 这种写法调试起来稍麻烦,建议优先用内联
{{# if}},除非逻辑确实复用频繁
Layui 模板语法不是 JS,也不是 HTML,它是个中间层,边界感很明确 —— 所有动态逻辑必须落在 {{# }} 里,所有静态结构写在外面,混着写基本就废。


















