У меня есть веб-приложение MUI, которое я создаю для отслеживания некоторых личных данных.
Я использую MUI datagrid pro для отображения данных, и, как мы знаем, он имеет довольно обширные фильтры в компоненте datagrid.
Я хотел бы отображать суммарные итоги отображаемых в настоящее время отфильтрованных столбцов, а не запрашивать базу данных для получения этих конкретных значений. Кажется, что это должно быть довольно просто, но я не уверен, как получить к нему доступ.
API datagridpro находится здесь: https://mui.com/x/api/data-grid/data-grid-pro/
Мой компонент datagrid построен так:
const fetchData = useCallback(
async (IDs: string[]) => {
response = await fetch("/api/data")
data = response.json()
...
...
...
transformedData = transformData(data)
return { data: transformedData }, };
[dispatch] );
Это передается через стандартный useEffect для установки состояния с данными.
И метод transformData похож на это:
const transformedData = (data: any) => {
return data.map((item: any, index: any) => {
const timestamp = new Date(item.timestamp)
return {
id: item.id
value_1: item.value_1
value_2: item.value_2
date: timestamp
value_3: item.value_3
};
});
};
Это текущий код, отображающий компонент DataGridPro:
<DataGridPro
rows = {transformedDataFromFunction}
sx = {{
".MuiDataGrid-row:hover": {
backgroundColor: "#C2C2C2",
},
}}
columns = {columns}
editMode = "row"
rowModesModel = {rowModesModel}
onRowModesModelChange = {(newModel: typeof rowModesModel) =>
setRowModesModel(newModel)
}
onRowEditStart = {handleRowEditStart}
onRowEditStop = {handleRowEditStop}
processRowUpdate = {processRowUpdate}
componentsProps = {{
toolbar: { setRowModesModel },
}}
slots = {{ toolbar: GridToolbar }}
// leaving this in here on off chance we don't need MUI
// experimentalFeatures = {{ newEditingApi: true }}
/>
Опять же, я по существу хочу отобразить суммарные итоги указанных столбцов в отдельном div в верхней части страницы в виде:
Всего Значение 1: сумма (значение_1) | Всего Значение 2: сумма (значение_2) | Всего #: сумма (индекс)
[вставьте сюда данные таблицы]
Опять же, когда я фильтрую на основе сетки данных MUI, я хотел бы отобразить суммарные итоги этих отображаемых столбцов.
Предположим, что value_1 имеет всего 4 строки со значениями, отображаемыми ниже.
value_1
| 3
| 4
| 1
| 2
Допустим, я хочу отфильтровать по значениям >2.
В компоненте datagridpro это будет отфильтровано и отображено следующим образом:
value_1
| 3
| 4
Я хочу показать count отображаемых столбцов, что будет 2, а сумма строк будет 7.
Какие реквизиты API следует использовать для доступа к этому?
Спасибо



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать gridFilteredSortedRowIdsSelector из MUI DataGridPro API, чтобы получить суммарные итоги столбцов. Этот селектор возвращает массив идентификаторов строк, которые в настоящее время отфильтрованы и отсортированы в сетке. Вы можете использовать этот массив для доступа к данным строк и вычисления итоговых сумм по нужным вам столбцам. Например, вы можете сделать что-то вроде этого:
const SummatedTotals = () => {
const apiRef = useGridApiContext();
const filteredSortedRowIds = gridFilteredSortedRowIdsSelector(apiRef);
const filteredSortedRows = filteredSortedRowIds.map((id) =>
apiRef.current.getRow(id)
);
const totalUnitPrice = filteredSortedRows.reduce(
(sum, row) => sum + row.unitPrice,
0
);
const totalFeeRate = filteredSortedRows.reduce(
(sum, row) => sum + row.feeRate,
0
);
const totalCount = filteredSortedRows.length;
return (
<div>
{`Total Unit Price: ${
Math.round(totalUnitPrice * 100) / 100
} | Total Fee Rate: ${
Math.round(totalFeeRate * 100) / 100
} | Total #: ${totalCount}`}
</div>
);
};
А потом
<DataGridPro
/* { ...restProps } */
slots = {{ footer: SummatedTotals }}
/>
Вы можете увидеть весь пример здесь: codeandbox.io
Чтобы узнать больше, см. разделы Селекторы фильтрации , Объект API и Доступ к состоянию.
Из любопытства, как вы нашли эти функции? Я не могу найти их нигде в документации. @ Виктор Л.
Я рад, что это работает для вас. Чтобы ознакомиться с документацией, см. mui.com/x/react-data-grid/filtering/#selectors
Я обновил свой ответ ссылками на документацию. Пожалуйста, проверь это. :)
Это именно то, что я искал, большое спасибо!