templet函数中调用layui.device()需确保device模块已加载,推荐在layui.use(['table','device'],callback)内使用;若为函数模板可直接调用,字符串模板不支持;优先采用服务端透传is_mobile字段,或用window.innerwidth判断视口更可靠。

templet 函数里直接调用 layui.device() 会报错
因为 templet 是字符串模板或函数,但 layui.device() 必须在 layui 模块加载完成后才能使用。如果表格初始化时 layui.device 还没就绪(比如模块未加载、或在 layui.use 外调用),就会报 Cannot read property 'device' of undefined。
实操建议:
- 确保整个逻辑包裹在
layui.use(['table', 'device'], function(){...})中,device是独立模块,必须显式引入 -
templet若为函数,可直接调用layui.device();若为字符串模板(如"{{# if(layui.device().mobile){ }}..."),不推荐 —— 模板引擎不支持跨作用域执行函数调用 - 常见错误:只引入
table,漏掉device,导致运行时报layui.device is not a function
templet 函数中判断移动端并渲染不同内容
这是最稳妥的做法:把设备检测逻辑放进 templet 对应的函数体里,此时 layui 全局对象和 device 模块均已可用。
示例(简化版):
templet: function(d) {
var isMobile = layui.device().mobile;
if (isMobile) {
return '<span class="mobile-only">' + d.title + '</span>';
}
return '<div class="desktop-only">' + d.title + '|' + d.author + '</div>';
}
注意点:
-
d是当前行数据对象,别误写成data或row - 不要在
templet函数里重复调用layui.use—— 会破坏执行时序,且无效 - 频繁调用
layui.device()不影响性能,它只是读取一次 UA 并缓存结果
服务端已知设备类型时,避免前端重复判断
如果后端接口能返回 is_mobile: true 这类字段,就别在 templet 里再跑 layui.device() —— 前后端判断可能不一致(比如 UA 被伪造、或桌面浏览器开启响应式调试模式)。
更可靠的做法:
- 后端根据请求头
User-Agent判断设备,并把结果作为字段透传到表格数据中 -
templet直接读d.is_mobile,省去 JS 判断开销,也规避了客户端环境差异 - 特别注意:微信内置浏览器、QQ 浏览器等常被
layui.device().mobile误判为false,而服务端 UA 解析更可控
兼容性与移动端渲染的隐藏坑
layui.device().mobile 实际依赖的是正则匹配 UA 字符串,对新出的设备或浏览器版本容易失效(比如 Chrome 120+ 某些安卓 WebView 可能不带 Mobile 关键字)。
如果业务对“是否移动端”要求严格(例如要适配折叠屏、横竖屏切换),建议:
- 用
window.innerWidth 代替 UA 判断,更贴近真实渲染场景 - 或监听
resize动态更新一个全局标记,templet函数里读这个标记而非反复调用device() - 不要在
templet里操作 DOM(如$('.xxx').show()),表格重绘时会重复执行,易引发内存泄漏或样式错乱
设备判断这事,靠 UA 不如靠视口,靠前端不如靠后端 —— 尤其当你的表格要支持 PWA 或混合 App 时,layui.device() 的边界情况会突然冒出来。











