templet函数默认只接收d(当前行数据),2.6.0+支持第二参数obj(含field、title、index等列上下文信息);可调用全局函数但须提前定义;返回html需用模板语法或确保版本兼容;访问他列用d.otherfield,交互通过事件委托实现。

templet函数参数怎么传、d和obj有什么区别
templet 函数默认只接收一个参数 d,即当前行的完整数据对象(如 {id: 1, name: '张三', status: 1})。Layui 2.6.0+ 版本开始支持第二个参数 obj,它包含列上下文信息:obj.field(当前字段名)、obj.title(列标题)、obj.index(行索引,从 0 开始)、obj.data(等同于 d)。
常见错误是只写 templet: function(d) { return d.name } 却想取列名做判断——这时必须显式声明两个参数:templet: function(d, obj) { return obj.field === 'status' ? getStatusText(d.status) : d[obj.field] }。
注意:obj.index 是渲染时的行号,不是原始数据下标(分页后会变),别拿它当唯一标识用。
templet里能直接调用全局函数或变量吗
可以,但必须确保函数/变量在 table.render() 执行前已定义且作用域可达。比如你写了 const statusMap = {1: '启用', 0: '禁用'},在 templet 里就能直接用 statusMap[d.status]。
如果函数定义在 layui.use 块内(如依赖 laytpl 或 layer),templet 里不能直接调用——因为 templet 是同步执行的,而模块加载是异步的。此时应提前把所需逻辑抽到外部作用域,或改用模板字符串 templet: '{{# if(d.status==1){ }}启用{{# } else { }}禁用{{# } }}'(需引入 laytpl 模块)。
另外,templet 函数里不能写 this,它不绑定 table 实例;也不建议在其中发请求或操作 DOM,容易引发重复渲染或内存泄漏。
templet返回值被转义或显示为纯文本怎么办
Layui 默认会对 templet 返回的字符串做 HTML 转义(防止 XSS),所以如果你返回 '<span class="red">' + d.name + '</span>',页面上会看到原样字符串而非红色文字。
解决方法只有两个:
• 改用模板字符串语法:templet: '<span class="red">{{d.name}}</span>'(Layui 内部会自动解析)
• 或确保你用的是函数形式且返回的是合法 HTML 字符串(Layui 2.5.6+ 已修复多数转义问题,但低版本仍需检查)
另一个常见坑:返回值里带换行或多余空格,会导致单元格高度异常。建议压缩返回字符串,例如:return '<div class="cell">' + (d.desc || '-') + '</div>'.replace(/\s+/g, ' ').trim()。
templet里怎么访问其他列的数据或触发表格方法
templet 函数的 d 参数就是整行数据,所以你可以直接读 d.otherField,无需额外获取。但注意:如果该字段不在当前接口返回的字段列表中(比如后端没传 fullName),d.fullName 就是 undefined,别忘了做空值判断。
想在点击单元格时调用 table.reload() 或打开 layer 弹窗?不要在 templet 里写 onclick="table.reload()"——Layui 会过滤内联 JS。正确做法是:
• templet 返回带 class 的标签,如 return '@#@#@#@#@#@#@#@#@#@0'
• 在 table.render() 外部用事件委托监听:$(document).on('click', '.view-detail', function(){ var id = $(this).data('id'); layer.open({content: '详情ID:' + id}); });
特别注意:如果表格启用了 rowClick,记得在事件处理里加 e.stopPropagation(),否则会先触发单元格点击再触发整行点击。











