1. 认识jEasyUI树形网格组件
第一次接触jEasyUI的树形网格时,我被它优雅的数据展示方式所吸引。这个组件完美融合了树形结构的层次化特性和表格数据的结构化展示,特别适合需要展示层级关系的数据场景。比如电商后台的商品分类系统、企业组织架构管理、文件目录结构等。
树形网格的核心优势在于:
- 直观展示父子节点关系
- 支持无限级嵌套
- 每行可展示多列属性
- 内置展开/折叠功能
- 支持懒加载大数据集
在实际项目中,我经常用它来构建权限管理系统。比如一个典型的权限树可能包含模块→菜单→按钮的三级结构,同时每个节点又需要显示编号、名称、类型等属性,这正是树形网格的用武之地。
2. 环境准备与基础配置
2.1 引入必要资源
创建树形网格的第一步是引入jEasyUI库。我建议使用CDN方式引入,既方便又快速:
html复制<!-- 引入默认主题CSS -->
<link rel="stylesheet" href="https://www.jeasyui.com/easyui/themes/default/easyui.css">
<!-- 引入jQuery(jEasyUI依赖) -->
<script src="https://www.jeasyui.com/easyui/jquery.min.js"></script>
<!-- 引入jEasyUI核心库 -->
<script src="https://www.jeasyui.com/easyui/jquery.easyui.min.js"></script>
注意:生产环境建议下载这些文件到本地,避免CDN不可用导致页面异常。我曾经在一个政府项目中因为CDN访问不稳定吃过亏。
2.2 基础HTML结构
树形网格需要一个容器元素,通常使用div标签:
html复制<div id="treegrid" class="easyui-treegrid"
title="商品分类管理"
style="width:800px;height:500px"
data-options="
rownumbers: true,
animate: true,
lines: true">
</div>
这里有几个实用的data-options属性:
rownumbers: true显示行号animate: true展开/折叠动画效果lines: true显示树形连接线
3. 数据模型设计与加载
3.1 JSON数据结构规范
树形网格需要特定格式的JSON数据。核心字段包括:
id: 节点唯一标识(必须)text或自定义字段:节点显示文本children: 子节点数组(可选)- 其他自定义字段:将显示为表格列
一个完整的商品分类数据示例:
json复制[
{
"id": "electronics",
"name": "电子产品",
"desc": "电子设备分类",
"children": [
{
"id": "phone",
"name": "手机",
"price": "2999-5999",
"stock": 1200
},
{
"id": "laptop",
"name": "笔记本电脑",
"price": "3999-12999",
"stock": 800
}
]
},
{
"id": "furniture",
"name": "家具",
"desc": "家居用品",
"state": "closed", // 初始状态为折叠
"children": [...]
}
]
3.2 动态加载数据
实际项目中,我们通常通过AJAX动态加载数据:
javascript复制$('#treegrid').treegrid({
url: '/api/categories',
method: 'get',
idField: 'id',
treeField: 'name',
onBeforeLoad: function(row, param){
// 可以在加载前添加自定义参数
param.searchKey = $('#search').val();
},
onLoadSuccess: function(data){
console.log('数据加载完成', data);
}
});
经验分享:对于大数据量,建议实现分页加载。可以通过监听
onExpand事件实现懒加载:javascript复制onExpand: function(row){ $(this).treegrid('options').url = '/api/children/'+row.id; $(this).treegrid('reload'); }
4. 列配置与样式定制
4.1 基础列配置
columns配置是树形网格的核心之一。一个完整的配置示例:
javascript复制columns: [[
{field: 'name', title: '分类名称', width: 200, align: 'left'},
{field: 'price', title: '价格区间', width: 100, align: 'center'},
{field: 'stock', title: '库存量', width: 80, align: 'right'},
{field: 'desc', title: '描述', width: 250},
{
field: 'operate',
title: '操作',
width: 100,
formatter: function(value,row,index){
return `<a href="#" onclick="editItem('${row.id}')">编辑</a>`;
}
}
]]
4.2 高级列特性
列格式化
通过formatter函数可以自定义单元格显示:
javascript复制{field: 'stock', title: '库存', formatter: function(value){
if(value < 100){
return `<span style="color:red">${value}(需补货)</span>`;
}
return value;
}}
自定义列样式
使用styler函数动态设置行样式:
javascript复制{field: 'price', styler: function(value,row,index){
if(value > 10000){
return 'background-color:#FFF2CC;font-weight:bold';
}
}}
5. 事件处理与交互增强
5.1 常用事件绑定
树形网格提供了丰富的事件API:
javascript复制$('#treegrid').treegrid({
onClickRow: function(row){
console.log('点击行', row);
},
onDblClickRow: function(row){
openEditDialog(row.id);
},
onContextMenu: function(e, row){
e.preventDefault();
showContextMenu(row);
}
});
5.2 右键菜单实现
结合jEasyUI的menu组件实现右键菜单:
javascript复制function showContextMenu(row){
$('#mm').menu({
onClick: function(item){
handleMenuClick(item.id, row.id);
}
}).menu('show', {
left: e.pageX,
top: e.pageY
});
}
// HTML部分
<div id="mm" class="easyui-menu">
<div id="add" iconCls="icon-add">新增子类</div>
<div id="edit" iconCls="icon-edit">编辑</div>
<div id="remove" iconCls="icon-remove">删除</div>
</div>
6. 实用技巧与性能优化
6.1 大数据量优化
当数据量超过500条时,建议:
- 启用分页:
javascript复制$('#treegrid').treegrid({
pagination: true,
pageSize: 50,
pageList: [10, 20, 50, 100]
});
- 实现懒加载:
javascript复制onBeforeExpand: function(row){
if(!row.children || row.children.length == 0){
loadChildrenAsync(row.id);
return false; // 阻止默认展开
}
}
6.2 常用方法封装
封装几个常用操作:
javascript复制// 获取选中节点
function getSelected(){
return $('#treegrid').treegrid('getSelected');
}
// 刷新指定节点
function refreshNode(id){
$('#treegrid').treegrid('reload', id);
}
// 展开所有节点
function expandAll(){
$('#treegrid').treegrid('expandAll');
}
7. 常见问题排查
7.1 节点不显示问题
现象:数据加载了但树形结构不显示
- 检查
idField和treeField配置是否正确 - 确认JSON数据包含
children字段 - 查看浏览器控制台是否有JS错误
7.2 样式异常处理
现象:表格样式错乱
- 确认引入了easyui.css
- 检查是否有自定义CSS冲突
- 尝试清除浏览器缓存
7.3 性能问题
现象:加载大量数据时卡顿
- 实现分页或懒加载
- 减少不必要的列
- 避免复杂的formatter函数
8. 实际项目经验分享
在最近的一个ERP系统中,我使用树形网格实现了多级BOM(物料清单)展示。遇到几个典型场景:
- 动态图标:根据物料类型显示不同图标
javascript复制formatter: function(value,row){
const icon = row.type === 'raw' ? 'icon-material' : 'icon-product';
return `<span class="easyui-icon ${icon}"></span> ${value}`;
}
- 行编辑功能:
javascript复制onClickCell: function(field,row){
if(field === 'quantity'){
$(this).treegrid('beginEdit', row.id);
}
}
- 跨树拖拽:实现物料在不同BOM间的拖拽调整
javascript复制onDrop: function(targetRow,sourceRow,point){
updateBOMRelation(sourceRow.id, targetRow.id, point);
}
这些实战经验让我深刻体会到,掌握好树形网格的各种配置和API,能极大提升开发效率和用户体验。特别是在处理复杂业务数据时,合理的树形展示往往比平面表格更直观易懂。