JQXTree加载500条数据速度过慢,如何优化绑定耗时?
解决JQXTree加载500条数据速度缓慢的方案
当前代码通过dataAdapter.getRecordsHierarchy转换数据再绑定的方式,在数据量较大时会产生额外开销,导致加载耗时过长。以下是几种优化方案:
1. 跳过dataAdapter,手动构建树形结构
jqxTree支持直接传入符合格式的JSON数据,无需通过dataAdapter做中间转换。手动遍历原始数据构建树形结构,减少冗余处理步骤:
// 自定义树形结构构建函数 function buildTree(data, idField, parentIdField, labelField, valueField) { const nodeMap = {}; const treeData = []; // 先将所有节点存入映射表 data.forEach(node => { nodeMap[node[idField]] = { label: node[labelField], value: node[valueField], ClassName: node.ClassName, items: [] }; }); // 建立父子节点关联 data.forEach(node => { const parentNode = nodeMap[node[parentIdField]]; if (parentNode) { parentNode.items.push(nodeMap[node[idField]]); } else { treeData.push(nodeMap[node[idField]]); } }); return treeData; } // 生成树形数据并初始化组件 const treeRecords = buildTree(dataSource, "ClassRid", "ParentClassRid", "ClassLabel", "ClassRid"); $("#treeId").jqxTree({ checkboxes: true, source: treeRecords, width: '100%', height: 220 });
2. 启用懒加载(延迟加载)
如果树形结构有层级区分,只初始化根节点,用户展开节点时再加载对应子节点,避免一次性加载所有数据:
// 仅加载根节点(假设根节点ParentClassRid为0) const rootNodes = dataSource.filter(node => node.ParentClassRid === 0); const rootTreeData = buildTree(rootNodes, "ClassRid", "ParentClassRid", "ClassLabel", "ClassRid"); $("#treeId").jqxTree({ checkboxes: true, source: rootTreeData, width: '100%', height: 220, expand: function(event) { const targetItem = event.args.element; const itemValue = $("#treeId").jqxTree('getItem', targetItem).value; // 筛选当前节点的子节点 const childNodes = dataSource.filter(node => node.ParentClassRid === itemValue); const childTreeData = buildTree(childNodes, "ClassRid", "ParentClassRid", "ClassLabel", "ClassRid"); // 添加子节点到目标节点 $("#treeId").jqxTree('addTo', childTreeData, targetItem); } });
3. 简化配置,减少冗余处理
如果仍需要使用dataAdapter,移除对本地数据无效的配置项,减少不必要的逻辑处理:
var source = { datatype: "json", datafields: [{ name: "ClassRid", type: "int" }, { name: "ParentClassRid", type: "int" }, { name: "ClassName", type: "string" }, { name: "ClassLabel", type: "string" }], id: "ClassRid", localdata: dataSource }; var dataAdapter = new $.jqx.dataAdapter(source); dataAdapter.dataBind(); var records = dataAdapter.getRecordsHierarchy("ClassRid", "ParentClassRid", "items", [{ name: "ClassLabel", map: "label" }, { name: "ClassRid", map: "value" }, { name: "ClassName", map: "ClassName" }]); $("#treeId").jqxTree({ checkboxes: true, source: records, width: '100%', height: 220 });
优先尝试手动构建树形结构的方案,这能直接减少中间转换的性能开销,最快提升加载速度。
内容的提问来源于stack exchange,提问作者Robin089
相关产品推荐
相关产品推荐

