layui tree 加载慢_layui-tree如何实现懒加载以及动态局部渲染树节点

时间:2025-04-02 16:29:03
', function () {

h = i(['

', '
', '
', function () {

//TODO源码调整

//return ? l ? '' : '' : ''

return ? l ? '' : '' : ''

}(), function () {

return ? '' : ""

}(), function () {

//TODO修改源码显示title

//return && ? '' + ( || || ) + "" : '' + ( || || ) + ""

return && ? '' + ( || || ) + "" : '' + ( || || ) + ""

}(), "

", function () {

if (!) return "";

var e = {

add: '',

update: '',

del: ''

}, i = ['

'];

return === !0 && ( = ["update", "del"]), "object" == typeof ? ((, function (a, n) {

(e[n] || "")

}), ("") + "

") : void 0

}(), "

"].join(""));

l && ((o), (o, )), (h), ("." + s)[0] && ().children(".layui-tree-pack").addClass("layui-tree-showLine"), l || (".layui-tree-pack").addClass("layui-tree-lineExtend"), (h, r), && ( && (), (h, r)), && (h, r)

})

}

4:修改节点展开方法,修改后代码如下【备注://TODO 部分标识的是layui原始代码】

= function (e, a) {

var n = this, t = , r = ("." + p), l = ("." + f), c = ("." + o),

k = ("." + y), m = ? c : l, x = "";

("click", function (i) {

var ax = ("." + v),//TODO a冲突改成ax

//TODO修改源码

//n = (".layui-icon")[0] ? (".layui-icon") : (".layui-tree-icon").children(".layui-icon");

n = (".layui-icon")[0] ? (".layui-tree-iconClick").children(".layui-icon") : (".layui-tree-icon").children(".layui-icon");

if (ax[0]) {  //TODO a改为ax

//TODO展开节点

if (!(c) && !(C)) {

&& ({

elem: e,

state: > 0,

data: a

})

}

//TODO注释掉源码

/*if ((C)) (C), (200), (u).addClass(h); else if ((C), (200), (u).removeClass(h), ) {

var r = ("." + s);

(C), ("." + v).slideUp(200), (".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)

}*/

//TODO节点展开效果调整添加Begin

if ((C) && !$().hasClass("layui-tree-txt")) {

(C), (200)

//修改源码,调整无实线状态时三角图标有动画

if (!) {

('span .layui-icon').removeClass(aa).addClass(bb)

} else {

(u).addClass(h)

}

} else if ((C), (200), (u).removeClass(h), ) {

var r = ("." + s);

(C), ("." + v).slideUp(200), (".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)

} else if (!) {

('span .layui-icon').removeClass(bb).addClass(aa)

} //TODO节点展开效果调整添加End

} else x = "normal"

})

5: 方法修改中,有两处样式添加 aa 、bb:如下所示

需要在中顶部样式变量处添加。

c = "layui-hide", d = "layui-disabled", s = "layui-tree-set", o = "layui-tree-iconClick",

h = "layui-icon-addition", u = "layui-icon-subtraction", p = "layui-tree-entry", f = "layui-tree-main",

y = "layui-tree-txt", v = "layui-tree-pack", C = "layui-tree-spread", k = "layui-tree-setLineShort",

m = "layui-tree-showLine", x = "layui-tree-lineExtend" ,

aa = "layui-tree-active", bb = "layui-tree-iconArrow", //TODO添加aa、bb两个样式

步骤2:方案落地

解决问题1:异步加载子节点

下面是狐小E智慧办公 ()后台通讯录模块中,部门树渲染加载的业务逻辑,其核心逻辑就是通过父节点ID查询子节点数据,绑定tree组件的spread函数,捕捉节点的展开事件,用户点击树节点,根据当前节点ID查询下一级节点,如果children节点有数据,则调用tree的children函数动态地渲染子节点。

//获取部门树

function LoadDeptTree() {

$.ajax({

url: "${ctx}/dept/tree/one-level?parentId=0",

dataType: "json",

async: true,

type: "GET",

success: function (resp) {

if (resp && == 0) {

//无连接线风格

deptTree =({

elem: '#leftTreeArea'

,id:'leftTreeArea'

, data:

, showLine: false  //是否开启连接线

, click: editDept

, spread: function (obj) {

if (!) {

//懒加载子节点,异步获取data数据这里根据向后台请求当前节点数据

$.ajax({

url: "${ctx}/dept/tree/one-level?parentId="+,

dataType: "json",

async: true,

type: "GET",

success: function (resp) {

//当前节点展开,如果下一层有children,则调用树的children方法,动态渲染子节点

if (resp && == 0) {

//第一个参数是树绑定的页面元素ID

//第二个参数是当前展开节点的ID

//第三个参数是当前节点子节点的数据(数据格式参照layui的tree组件数据格式)

(, , );

}

}

});

}

}

});

} else {

alert("加载部门树失败")

}

},

error:function(XMLHttpRequest, textStatus, error){

if ( == 19) {

();

}else{

alert("加载部门树失败");

}

}

});

}

解决问题2:父部门添加子部门,局部动态更新视图

选中父部门,动态地为父部门添加一个子部门,添加成功将新增的子部门局部渲染到整体部门树中。下面是添加子部门后,js调用一下我自己的refreshTreeNode函数,函数里有操作的局部更新视图的代码,如下:

//重新渲染树节点

function refreshTreeNode(treeNodeId,treeNodeName) {

$.ajax({

url: "${ctx}/dept/tree/one-level?parentId="+treeNodeId,

dataType: "json",

async: true,

type: "GET",

success: function (resp) {

if (resp && == 0) {

(, treeNodeId, );

if (treeNodeName) {

//修改节点名称

$("div[data-id='"+treeNodeId+"']").find(".layui-tree-txt").eq(0).html(treeNodeName).attr("title",treeNodeName);

}

//光标重新定位到当前节点

$("div[data-id='"+treeNodeId+"']").find(".layui-tree-entry").eq(0).addClass("layui-table-click");

}

}

});

}

如果想下载我们修改后的代码,请点击:

作者介绍:小文文,狐小E智慧办公 ()开发工程师,专注移动办公软件的SaaS平台建设以及轻应用开发