从 v6 迁移到 v7
本指南描述了将 Data Grid 从 v6 迁移到 v7 所需的更改。
简介
这是将 @mui/x-data-grid 从 v6 升级到 v7 的参考指南。要了解有关新主要版本更改的更多信息,请查看关于 MUI X v7 发布的博文。
开始使用新版本
在 package.json 中,将 Data Grid 包的版本更改为 ^7.0.0。
-"@mui/x-data-grid": "^6.0.0",
+"@mui/x-data-grid": "^7.0.0",
-"@mui/x-data-grid-pro": "^6.0.0",
+"@mui/x-data-grid-pro": "^7.0.0",
-"@mui/x-data-grid-premium": "^6.0.0",
+"@mui/x-data-grid-premium": "^7.0.0",
由于 v7 是一个主要版本,它包含影响公共 API 的更改。这些更改是为了保持一致性、提高稳定性和为新功能腾出空间而进行的。下面描述的是从 v6 迁移到 v7 所需的步骤。
更新 @mui/material 包
为了可以选择使用来自 @mui/material 的最新 API,包的对等依赖版本已更新为 ^5.15.14。这只是次要版本更改,因此不应导致任何重大更改。请将您的 @mui/material 包更新到此版本或更高版本。
更新许可证包
如果您使用的是 Data Grid 的商业版本(Pro 和 Premium 计划),则需要更新导入路径
-import { LicenseInfo } from '@mui/x-license-pro';
+import { LicenseInfo } from '@mui/x-license';
如果您的 package.json 的 dependencies 部分中有 @mui/x-license-pro,请重命名许可证包并更新到最新版本
-"@mui/x-license-pro": "^6.0.0",
+"@mui/x-license": "^7.0.0",
运行 codemod
preset-safe codemod 将自动调整您的大部分代码,以应对 v7 中的重大更改。您可以运行 v7.0.0/data-grid/preset-safe 仅针对 Data Grid,或运行 v7.0.0/preset-safe 以针对其他 MUI X 组件,如 Date and Time pickers。
当选择 <path> 参数时,您可以对特定文件、文件夹或整个代码库运行它。
// Data Grid specific
npx @mui/x-codemod@latest v7.0.0/data-grid/preset-safe <path>
// Target other MUI X components as well
npx @mui/x-codemod@latest v7.0.0/preset-safe <path>
由 preset-safe codemod 处理的重大更改在屏幕右侧的目录中或在由其处理的特定点旁边用 ✅ emoji 表示。
如果您已经应用了 v7.0.0/data-grid/preset-safe(或 v7.0.0/preset-safe)codemod,那么您应该不需要对这些项目采取任何进一步的操作。如果重大更改的特定部分不属于 codemod 或需要一些手动工作,它将在每个部分的末尾列出。
所有其他更改都必须手动处理。
重大更改
由于 v7 是一个主要版本,因此它包含一些影响公共 API 的更改。这些更改是为了保持一致性、提高稳定性和为新功能腾出空间而进行的。下面描述了从 v6 迁移到 v7 所需的步骤。
删除旧版 bundle
所有 MUI X 包都已删除对 IE 11 的支持。不再包含用于支持 IE 11 等旧版浏览器的 legacy bundle。
删除 Webpack 4 支持
删除对旧版浏览器的支持也意味着我们不再转换现代浏览器原生支持的一些功能 – 例如 Nullish Coalescing 和 Optional Chaining。
Webpack 4 不支持这些功能,因此如果您使用的是 Webpack 4,您将需要自己转换这些功能或升级到 Webpack 5。
这是一个示例,说明如何在 Webpack 4 上使用 @babel/preset-env preset 转换这些功能
// webpack.config.js
module.exports = (env) => ({
// ...
module: {
rules: [
{
test: /\.[jt]sx?$/,
- exclude: /node_modules/,
+ exclude: [
+ {
+ test: path.resolve(__dirname, 'node_modules'),
+ exclude: [
+ // Covers @mui/x-data-grid, @mui/x-data-grid-pro, and @mui/x-data-grid-premium
+ path.resolve(__dirname, 'node_modules/@mui/x-data-grid'),
+ path.resolve(__dirname, 'node_modules/@mui/x-license'),
+ ],
+ },
+ ],
},
],
},
});
DOM 更改
Data Grid 的布局已进行重大更改,以使用 CSS sticky 定位元素。因此,进行了以下更改
- 主元素现在对应于虚拟滚动器元素。
- 标题现在包含在虚拟滚动器中。
- 固定的行和列部分现在包含在虚拟滚动器中。
- 单元格内部包装器
.MuiDataGrid-cellContent已删除。
重命名的 props
- props
rowBuffer和columnBuffer已重命名为rowBufferPx和columnBufferPx。它们的值现在是像素值,而不是项目数。它们的默认值现在为150。
删除的 props
✅ 已删除已弃用的 props
components和componentsProps。请改用slots和slotProps。有关更多详细信息,请参阅组件部分。已删除
slots.preferencesPanelslot 和slotProps.preferencesPanelprop。请改用slots.panel和slotProps.panel。已从以下组件中删除
getOptionValue和getOptionLabelpropsGridEditSingleSelectCellGridFilterInputSingleSelectGridFilterInputMultipleSingleSelect
请改为在
singleSelect列定义上使用getOptionValue和getOptionLabel属性const column: GridColDef = { type: 'singleSelect', field: 'country', valueOptions: [ { code: 'BR', name: 'Brazil' }, { code: 'FR', name: 'France' }, ], getOptionValue: (value: any) => value.code, getOptionLabel: (value: any) => value.name, };已删除 props
rowThreshold和columnThreshold。如果您已将rowThresholdprop 设置为0以强制更频繁地渲染新行 – 这不再是必需的。✅ 已从
experimentalFeaturesprop 中删除一些功能标志。这些功能现在已稳定并默认启用
行为更改
现在可以使用 initialState、相应的受控模型或 API 对象 以编程方式控制禁用的列特定功能,如 hiding、sorting、filtering、pinning、row grouping 等。
以下是受影响的功能列表、禁用它们所需的列定义标志和 props,以及以编程方式控制它们的相关 props 和 API 方法。
状态访问
某些选择器现在需要传递 instanceId 作为第二个参数
-gridColumnFieldsSelector(apiRef.current.state);
+gridColumnFieldsSelector(apiRef.current.state, apiRef.current.instanceId);
但是,最好将 apiRef 作为第一个参数传递
gridColumnFieldsSelector(apiRef);
有关更多信息,请参阅直接状态访问页面。
列
GridColDef['type']的类型已缩小为仅接受内置列类型。TypeScript 用户在定义列时需要使用GridColDef接口// 🛑 `type` is inferred as `string` and is too wide const columns = [{ type: 'number', field: 'id' }]; <DataGrid columns={columns} />; // ✅ `type` is `'number'` const columns: GridColDef[] = [{ type: 'number', field: 'id' }]; <DataGrid columns={columns} />; // ✅ Alternalively, `as const` can be used to narrow down the type const columns = [{ type: 'number' as const, field: 'id' }]; <DataGrid columns={columns} />;类型
GridPinnedColumns已重命名为GridPinnedColumnFields。类型
GridPinnedPosition已重命名为GridPinnedColumnPosition。列分组 API 方法
getColumnGroupPath和getAllGroupDetails不再以unstable_为前缀。列分组选择器
gridFocusColumnGroupHeaderSelector和gridTabIndexColumnGroupHeaderSelector不再以unstable_为前缀。列管理组件已重新设计,并且该组件是从
ColumnsPanel中提取的,ColumnsPanel现在仅用作包装器,以在标题上方显示该组件作为面板。因此,引入了一个新的 slotcolumnsManagement和相应的 propslotProps.columnsManagement。先前传递给 propslotProps.columnsPanel的与列管理组件对应的 props 现在应传递给slotProps.columnsManagement。slotProps.columnsPanel仍可用于覆盖与ColumnsPanel中使用的Panel组件对应的 props,该组件在底层使用Popper组件。
<DataGrid
slotProps={{
- columnsPanel: {
+ columnsManagement: {
sort: 'asc',
autoFocusSearchField: false,
},
}}
/>
ColumnsPanel中的Show all和Hide all按钮已合并为一个新的列管理组件中的Show/Hide All复选框。相关的 propsdisableShowAllButton和disableHideAllButton已替换为新的 propdisableShowHideToggle。GridColDef['valueGetter']的签名已更改以提高性能-valueGetter: ({ value, row }) => value, +valueGetter: (value, row, column, apiRef) => value,GridValueGetterParams接口已删除-const customValueGetter = (params: GridValueGetterParams) => params.row.budget; +const customValueGetter: GridValueGetterFn = (value, row) => row.budget;GridColDef['valueFormatter']的签名已更改以提高性能-valueFormatter: ({ value }) => value, +valueFormatter: (value, row, column, apiRef) => value,GridValueFormatterParams接口已删除-const gridDateFormatter = ({ value, field, id }: GridValueFormatterParams<Date>) => value.toLocaleDateString(); +const gridDateFormatter: GridValueFormatter = (value: Date) => value.toLocaleDateString();GridColDef['valueSetter']的签名已更改以提高性能-valueSetter: (params) => { - const [firstName, lastName] = params.value!.toString().split(' '); - return { ...params.row, firstName, lastName }; -} +valueSetter: (value, row) => { + const [firstName, lastName] = value!.toString().split(' '); + return { ...row, firstName, lastName }; +}GridValueSetterParams接口已删除-const setFullName = (params: GridValueSetterParams) => { - const [firstName, lastName] = params.value!.toString().split(' '); - return { ...params.row, firstName, lastName }; -}; +const setFullName: GridValueSetter<Row> = (value, row) => { + const [firstName, lastName] = value!.toString().split(' '); + return { ...row, firstName, lastName }; +}GridColDef['valueParser']的签名已更改以提高性能-valueParser: (value, params: GridCellParams) => value.toLowerCase(), +valueParser: (value, row, column, apiRef) => value.toLowerCase(),GridColDef['colSpan']的签名已更改以提高性能-colSpan: ({ row, field, value }: GridCellParams) => (row.id === 'total' ? 2 : 1), +colSpan: (value, row, column, apiRef) => (row.id === 'total' ? 2 : 1),GridColDef['pastedValueParser']的签名已更改以提高性能-pastedValueParser: (value, params) => new Date(value), +pastedValueParser: (value, row, column, apiRef) => new Date(value),GridColDef['groupingValueGetter']的签名已更改以提高性能-groupingValueGetter: (params) => params.value.name, +groupingValueGetter: (value: { name: string }, row, column, apiRef) => value.name,
密度
density现在是一个受控 prop,如果您之前将densityprop 传递给 Data Grid,您需要执行以下操作之一
- 将其移动到
initialState.density以初始化它。
<DataGrid
- density="compact"
+ initialState={{ density: "compact" }}
/>
- 将其移动到状态并使用
onDensityChange回调相应地更新densityprop,使其按预期工作。
const [density, setDensity] = React.useState<GridDensity>('compact');
<DataGrid
- density="compact"
+ density={density}
+ onDensityChange={(newDensity) => setDensity(newDensity)}
/>
- 已删除选择器
gridDensityValueSelector,请改用gridDensitySelector。
剪贴板
- ✅ 与剪贴板相关的导出
ignoreValueFormatterDuringExport和splitClipboardPastedText不再以unstable_为前缀。
打印导出
- 如果存在任何选定的行,则打印导出现在只会打印选定的行。如果没有选定的行,它将打印所有行。这使得打印导出与其他导出保持一致。您可以使用
getRowsToExport函数自定义要导出的行。
选择
✅ 已从下面列出的单元格选择 props 中删除
unstable_前缀。旧名称 新名称 unstable_cellSelectioncellSelectionunstable_cellSelectionModelcellSelectionModelunstable_onCellSelectionModelChangeonCellSelectionModelChange已从下面列出的单元格选择 API 方法中删除
unstable_前缀。旧名称 新名称 unstable_getCellSelectionModelgetCellSelectionModelunstable_getSelectedCellsAsArraygetSelectedCellsAsArrayunstable_isCellSelectedisCellSelectedunstable_selectCellRangeselectCellRangeunstable_setCellSelectionModelsetCellSelectionModel
筛选
GridFilterOperator中的getApplyFilterFnV7已重命名为getApplyFilterFn。如果您直接使用getApplyFilterFnV7- 请将其重命名为getApplyFilterFn。getApplyFilterFn返回的函数的签名已更改以提高性能
const getApplyFilterFn: GetApplyFilterFn<any, unknown> = (filterItem) => {
if (!filterItem.value) {
return null;
}
const filterRegex = new RegExp(escapeRegExp(filterItem.value), 'i');
- return (cellParams) => {
- const { value } = cellParams;
+ return (value, row, colDef, apiRef) => {
return value != null ? filterRegex.test(String(value)) : false;
};
}
GridColDef中的getApplyQuickFilterFnV7已重命名为getApplyQuickFilterFn。如果您直接使用getApplyQuickFilterFnV7- 请将其重命名为getApplyQuickFilterFn。getApplyQuickFilterFn返回的函数的签名已更改以提高性能
const getGridStringQuickFilterFn: GetApplyQuickFilterFn<any, unknown> = (value) => {
if (!value) {
return null;
}
const filterRegex = new RegExp(escapeRegExp(value), 'i');
- return (cellParams) => {
- const { formattedValue } = cellParams;
+ return (value, row, column, apiRef) => {
+ let formattedValue = apiRef.current.getRowFormattedValue(row, column);
return formattedValue != null ? filterRegex.test(formattedValue.toString()) : false;
};
};
快速筛选现在默认忽略隐藏列。有关更多详细信息,请参阅包含隐藏列部分。
标头筛选器功能现在已稳定。已从 prop
headerFilters和以下导出中删除unstable_前缀。旧名称 新名称 unstable_gridFocusColumnHeaderFilterSelectorgridFocusColumnHeaderFilterSelectorunstable_gridHeaderFilteringEditFieldSelectorgridHeaderFilteringEditFieldSelectorunstable_gridHeaderFilteringMenuSelectorgridHeaderFilteringMenuSelectorunstable_gridHeaderFilteringStateSelectorgridHeaderFilteringStateSelectorunstable_gridTabIndexColumnHeaderFilterSelectorgridTabIndexColumnHeaderFilterSelector筛选器面板不再对所有组件使用原生版本的
Select组件。filterModel现在支持将Date对象作为date和dateTime列类型的值。filterModel仍然接受字符串作为date和dateTime列类型的值,但来自 UI 的所有filterModel更新(例如筛选器面板)都将值设置为Date对象。
辅助功能
✅ 已删除
ariaV7实验性标志,并且 Data Grid 现在默认使用改进的辅助功能实现。如果您正在使用ariaV7标志,则可以从experimentalFeaturesprop 中删除它-<DataGrid experimentalFeatures={{ ariaV7: true }} /> +<DataGrid />最值得注意的更改可能会影响您的应用程序或测试
role="grid"属性以及相关的 ARIA 属性现在应用于内部div元素,而不是根div元素-<div class="MuiDataGrid-root" role="grid" aria-colcount="5" aria-rowcount="101" aria-multiselectable="false"> +<div class="MuiDataGrid-root"> <div class="MuiDataGrid-toolbarContainer"></div> - <div class="MuiDataGrid-main"></div> + <div class="MuiDataGrid-main" role="grid" aria-colcount="5" aria-rowcount="101" aria-multiselectable="false"></div> <div class="MuiDataGrid-footerContainer"></div> </div>当使用树状数据功能时,网格角色现在是
role="treegrid"而不是role="grid"。Data Grid 单元格现在具有
role="gridcell"而不是role="cell"。
编辑
- 已删除
rowEditCommit事件和相关的 proponRowEditCommit。可以使用processRowUpdateprop 代替。
其他导出
locales 的导入路径已更改
-import { enUS } from '@mui/x-data-grid'; +import { enUS } from '@mui/x-data-grid/locales'; -import { enUS } from '@mui/x-data-grid-pro'; +import { enUS } from '@mui/x-data-grid-pro/locales'; -import { enUS } from '@mui/x-data-grid-premium'; +import { enUS } from '@mui/x-data-grid-premium/locales';已弃用的常量
SUBMIT_FILTER_STROKE_TIME和SUBMIT_FILTER_DATE_STROKE_TIME不再导出。使用filterDebounceMsprop 自定义筛选器防抖时间。GridPreferencesPanel组件不再导出,因为它不打算在 Data Grid 外部使用。工具栏可组合组件
GridToolbarColumnsButton、GridToolbarFilterButton、GridToolbarDensity和GridToolbarExport中的按钮现在用 tooltip 组件包装,并具有一致的接口。为了覆盖与工具栏按钮或其对应的 tooltips 相关的一些 props,您可以使用slotPropsprop。以下是一个示例差异。有关更多详细信息,请参阅工具栏部分。
function CustomToolbar() {
return (
<GridToolbarContainer>
<GridToolbarColumnsButton />
<GridToolbarFilterButton
- title="Custom filter" // 🛑 This was previously forwarded to the tooltip component
+ slotProps={{ tooltip: { title: 'Custom filter' } }} // ✅ This is the correct way now
/>
<GridToolbarDensitySelector
- variant="outlined" // 🛑 This was previously forwarded to the button component
+ slotProps={{ button: { variant: 'outlined' } }} // ✅ This is the correct way now
/>
</GridToolbarContainer>
);
}
CSS 类和样式
您现在可以使用
:hover而不是.Mui-hovered来设置行悬停状态的样式。已删除固定列的
.MuiDataGrid--pinnedColumns-(left\|right)类。已删除
.MuiDataGrid-cell--withRenderer类。单元格元素默认不是
display: flex。您可以在列定义中添加display: 'flex'以恢复该行为。注意:如果您使用的是动态行高,这也意味着单元格默认不再垂直居中,您可能需要为所有非动态列设置
display: 'flex'。这可能还会影响文本省略号,您可以通过添加自己的带有text-overflow: ellipsis的包装器来恢复它。{ display: 'flex', renderCell: ({ value }) => ( <div style={{ overflow: 'hidden', textOverflow: 'ellipsis' }}> {value} </div> ), },columnHeader--showColumnBorder类已替换为columnHeader--withLeftBorder和columnHeader--withRightBorder。由于在我们简化 DOM 结构并提高辅助功能的努力中删除了内部包装器,因此已删除
columnHeadersInner、columnHeadersInner--scrollable和columnHeaderDropZone类。pinnedColumnHeaders、pinnedColumnHeaders--left和pinnedColumnHeaders--right类已随它们所应用的元素一起删除。固定列标题现在使用position: 'sticky',并在与常规列标题相同的行元素中呈现。列标题和固定部分现在需要显式颜色。默认情况下,将使用 MUI
theme.palette.background.default颜色。要自定义它,请参阅 https://mui.org.cn/material-ui/customization/palette/#customization 我们将向调色板添加新的颜色名称以进行额外自定义,请阅读 #12443 了解更多详细信息。
对公共 API 的更改
- 方法
getRootDimensions()现在返回非空值。 - 字段
mainElementRef现在始终为非空。 - 字段
rootElementRef现在始终为非空。 - 字段
virtualScrollerRef现在始终为非空。 - 事件
renderedRowsIntervalChange参数从GridRenderedRowsIntervalChangeParams更改为GridRenderContext,并且已删除前者。
对 slots 的更改
- slot
columnHeaders已删除以下 props:columnPositions、densityFactor、minColumnIndex。 - slot
row已删除以下 props:containerWidth、position。 - slot
row现在具有类型化的 props。 - slot
headerFilterCell已删除以下 props:filterOperators。 - 所有 slots 现在都是强类型的,以前是
React.JSXElementConstructor<any>。