如何基于行数据修改MUI DataGridPro TreeGrid节点图标?
解决MUI DataGridPro TreeGrid基于行数据动态修改节点图标问题
直接通过slots设置树节点图标确实无法获取行数据上下文,要实现基于行内容自定义图标,你需要在树列的配置中使用renderExpandIcon属性,这个属性会提供包含当前行数据和展开状态的参数,具体步骤如下:
核心方案
在设置treeDataColumn: true的列(即树结构的主列)中,配置renderExpandIcon函数,通过函数参数拿到当前行row和展开状态isExpanded,根据行数据的字段动态返回对应图标。
完整示例代码
import { DataGridPro, HierarchyFolderIcon, DescriptionIcon } from '@mui/x-data-grid-pro'; // 模拟带图标类型字段的树形数据 const rows = [ { id: 1, name: '项目文档', iconType: 'folder', parentId: null }, { id: 2, name: '需求说明书.pdf', iconType: 'file', parentId: 1 }, { id: 3, name: '开发代码', iconType: 'folder', parentId: null }, { id: 4, name: 'utils.js', iconType: 'file', parentId: 3 }, { id: 5, name: '组件库', iconType: 'folder', parentId: 3 }, ]; const columns = [ { field: 'name', headerName: '名称', width: 350, // 标记此列为树结构主列 treeDataColumn: true, // 自定义展开/折叠图标渲染逻辑 renderExpandIcon: (params) => { const { row, isExpanded } = params; // 根据行数据的iconType字段切换图标 if (row.iconType === 'file') { // 文件类型直接显示文件图标(无展开折叠功能) return <DescriptionIcon sx={{ mr: 1 }} />; } // 文件夹类型根据展开状态显示对应图标 return <HierarchyFolderIcon collapsed={!isExpanded} sx={{ mr: 1 }} />; }, }, { field: 'iconType', headerName: '类型', width: 100 }, ]; export default function DynamicTreeIconGrid() { return ( <div style={{ height: 400, width: '100%' }}> <DataGridPro treeData rows={rows} columns={columns} getTreeDataPath={(row) => row.parentId} /> </div> ); }
关键说明
renderExpandIcon参数:该函数接收的params对象包含row(当前行完整数据)、isExpanded(当前节点的展开状态)、apiRef等核心信息,完全满足基于行数据自定义图标的需求。- 叶子节点处理:如果是没有子节点的叶子节点(比如示例中的文件),可以直接返回对应图标,无需处理展开状态。
- 替代全局slots:使用此方法后,不需要再通过
slots设置treeDataCollapseIcon和treeDataExpandIcon,避免全局图标覆盖。
内容的提问来源于stack exchange,提问作者Shubham A.
相关产品推荐
相关产品推荐

