Изменение значения состояния не работает должным образом в react-table

#reactjs #react-table

#reactjs #react-table

Вопрос:

Я пытаюсь добавить кнопку «удалить» к каждой строке данных, используя react-table. Кнопка объединяет данные и удаляет эту строку из данных при нажатии. При первом нажатии кнопки «удалить» она работает правильно. Однако при втором нажатии ничего не происходит. По какой-то причине changeData данные не изменяются при втором запуске. Почему это происходит?

 function DataTable({columns, data_rows}) {
    const [data, changeData] = useState(data_rows);

    if (columns[0].Header !== "Action") {
        columns.unshift({
            Header: 'Action'
        });
    }
    columns[0]['columns'] = [{
        Header: ' ', Cell: ({row}) => (
            <ButtonGroup>
                <Button className="button-dark button-sm" onClick={() => {
                    const dataCopy = [...data];
                    dataCopy.splice(row.index, 1);
                    changeData(dataCopy);}}>
                    Remove
                </Button>
            </ButtonGroup>
        )
    }]
    const {
        getTableProps,
        getTableBodyProps,
        headerGroups,
        rows,
        prepareRow
    } = useTable({
        columns,
        data
    });


    return (
        <table {...getTableProps()}>
            <thead>
            {headerGroups.map(headerGroup => (
                <tr {...headerGroup.getHeaderGroupProps()}>
                    {headerGroup.headers.map(column => (
                        <th {...column.getHeaderProps()}>{column.render("Header")}</th>
                    ))}
                </tr>
            ))}
            </thead>
            <tbody {...getTableBodyProps()}>
            {rows.map((row, i) => {
                prepareRow(row);
                return (
                    <tr {...row.getRowProps()}>
                        {row.cells.map(cell => {
                            return <td {...cell.getCellProps()}>{cell.render("Cell")}</td>;
                        })}
                    </tr>
                );
            })}
            </tbody>
        </table>
    );
}
 

Комментарии:

1. вы пробовали что-то вроде changeData(preVal => preVal.splice(row.index, 1) ) в вашем onClick?

2. @antoineso Да. К сожалению, тот же результат.

3. Обновление: удалось решить проблему, слегка изменив комментарий @antoineso. Я скопировал массив из предыдущего состояния и склеил его: changeData((preVal) => { const dataCopy = [...preVal]; dataCopy.splice(row.index, 1); return dataCopy; });

4. Где находится row.index, поступающий изнутри onclick?