You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于行数据修改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>
  );
}

关键说明

  1. renderExpandIcon参数:该函数接收的params对象包含row(当前行完整数据)、isExpanded(当前节点的展开状态)、apiRef等核心信息,完全满足基于行数据自定义图标的需求。
  2. 叶子节点处理:如果是没有子节点的叶子节点(比如示例中的文件),可以直接返回对应图标,无需处理展开状态。
  3. 替代全局slots:使用此方法后,不需要再通过slots设置treeDataCollapseIcon和treeDataExpandIcon,避免全局图标覆盖。

内容的提问来源于stack exchange,提问作者Shubham A.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:15:25