必须在 layer.open 的 success 回调中、layui.use 内执行 tree.render(),且 content 中需预置带唯一 ID 的空容器;禁止手动插入 DOM、禁用缓存并动态生成 ID、监听关闭事件清理资源。

要在 layui layer 弹窗中正确渲染 tree 组件,必须确保 DOM 容器在弹窗打开后才真实存在,否则 tree.render() 会找不到 elem 而静默失败。
创建 layer 弹窗并注入树容器
调用 layer.open() 时,在 content 中传入一个带唯一 id 的空 div,比如 <div id="tree-in-layer"></div>;不要用 template 字符串拼接或 innerHTML 动态写入,layer 会自动将 content 内容插入到弹层 body 中。
这一步不能省略:必须等 layer 的 success 回调触发后再初始化 tree,因为只有此时 DOM 才挂载完成。
在 success 回调中渲染 tree
layer.open 的 success 配置项是唯一安全的初始化时机:
success: function(layero, index) {
layui.use('tree', function(){
var tree = layui.tree;
tree.render({
elem: '#tree-in-layer',
data: [
{ title: '一级节点', children: [{ title: '二级节点' }] }
],
click: function(obj){ console.log(obj.data.title); }
});
});
}
【关键前提】 必须把 tree.render() 放在 layui.use 内部执行,否则 tree 模块未加载完成就调用会报 undefined 错误。
避免常见错误的三种做法
方法一:不手动操作 DOM 插入容器
直接在 content 中写死容器标签,不要用 jQuery.append 或 document.createElement 向 layer 内部塞元素——layer 会接管整个生命周期,手动插入易被销毁或重复渲染。
方法二:禁用 layer 缓存
如果弹窗反复打开,tree 渲染后又关闭再打开,旧实例可能残留。加配置 area: ['300px', '400px'], maxmin: false, shadeClose: true,并确保每次打开都用新 id(如 '#tree-in-layer-' + Date.now())可规避冲突。
方法三:监听 layer 全局关闭事件清理资源
layer.on('dialog.close', function(data){ if(data.id === 'myTreeLayer') { /* 可选:调用 tree 实例 destroy 方法(需自行封装)*/ } });


















