#javascript #reactjs #datagrid #material-ui #state
Вопрос:
// Method for deleting orders in batches. function DeleteBulkOrders(selectedRows){ const selectedIDs = new Set(selectedRows); const selectedRowUpdate = data.filter((row) =gt; selectedIDs.has(row.id), ) console.log(selectedRowUpdate) var deletedData = data.filter(function(id){ return !selectedRowUpdate.includes(id); }); setData(deletedData); handleClose(); }
У меня есть что-то в этом роде для MUI datagrid pro. По сути, когда я выбрал строку с помощью OnSelected, она возвращает мне идентификатор выбранных элементов в массиве. Затем я анализирую и фильтрую этот массив идентификаторов в исходных данных и устанавливаю новые данные.
Это работает, к сожалению, я считаю, что данные, которые я использую, не обновляются при изменении / редактировании ячейки. Он по-прежнему показывает старые значения и не отражает отредактированные. Все это хорошо для метода удаления пакетов, так как я все равно удаляю их, однако он не так хорошо работает для отправки всех, которые должны отражать отредактированные продажи, чтобы отправить полезную нагрузку в API для хранения.
// Deletes individual items within the row, not selected / bulk item delete. function DeleteIndividualItem(params){ console.log(params); const newArray = data .filter(function(row) { return row.id !== params.id; }); setData(newArray); }
У меня также есть отдельное удаление, которое фактически отправляет параметры и точно отражает изменения, внесенные в ячейку, и все равно удаляет ее.
Я предполагаю, что это связано с состоянием и тем, как я не обновляю состояние своих данных при изменении. Это заняло у меня некоторое время, но я нашел этот встроенный метод apiRef.current.getSelectedRows()
^На самом деле он выплевывает сопоставленный массив с обновленными полями, я пытаюсь выяснить, есть ли встроенный метод в базе данных MUI, который обновляет строки, передавая apiRef.current.getSelectedRows().
Я думал о том, чтобы уничтожить карту, а затем использовать setData(api.Ref.current.getSelectedRows())
и т. Д. Тем не менее, я чувствую, что должен быть более чистый способ сделать это.
var [data, setData] = useState(apiDataArray); // Rows is the data array that is populated and fed back into the table. var apiDataArray = [...Array(25)].map((_, index) =gt; ({ id: mockData.id(index), client: mockData.name.fullName(index), email: mockData.email(index), lastLogin: mockData.time(index), performance: mockData.number.percent(index), status: sample(['Accepted', 'Pending', 'Declined']), }));