我有一个组件可以创建一个反应表,当只涉及一个页面时,它可以按预期工作:
const ReactTable = (props) => {
const {data, columns, viewState, updateViewState} = props;
const defaultColumn = React.useMemo(() => ({
Filter: DefaultColumnFilter,
updateFiltering: (column, newValue) => updateFiltering(viewState, updateViewState, column, newValue),
filter: 'standard',
canResize: true}),[]);
const {filters, filterable, groupBy, expanded, page} = viewState;
const tableInstance = useTable(
{
columns,
data,
defaultColumn,
autoResetExpanded: false,
groupByFn: (rows, columnId) => {
const getKey = value => value.label ? value.label: value;
return rows.reduce((prev, row) => {
const resKey = `${getKey(row.values[columnId])}`;
prev[resKey] = Array.isArray(prev[resKey]) ? prev[resKey] : [];
prev[resKey].push(row);
return prev}, {})},
filterTypes: {'standard': applyFilter},
pageSize: page.size,
initialState: {filters, groupBy, expanded, pageIndex: page.index}},
useFilters,
useGroupBy,
useExpanded,
usePagination,
useRowSelect,
addSelectColumn);
const {getTableProps, getTableBodyProps, setGroupBy} = tableInstance;
React.useEffect(
() => updateViewStateFromTable(viewState, tableInstance, updateViewState));
if (!isEqual(groupBy, tableInstance.state.groupBy)) setGroupBy(groupBy);
const headerRows = getHeaderRows(tableInstance, viewState, updateViewState);
const dataRows = getDataRows(tableInstance);
const filterRow = getFilterRow(tableInstance, viewState);
console.log('ReactTable', {props, tableInstance})
return (
<div>
<table className="ReactTable -highlight rt-table"
{...getTableProps()}>
<thead className="rt-thead -header">
{headerRows}
</thead>
<tbody className="rt-tbody" {...getTableBodyProps()}>
{(filterable)? filterRow:null}
{dataRows}
</tbody>
<PaginationFoot {...{viewState, tableInstance}} />
</table>
<h2>viewState:</h2>
<pre>
<code>
{JSON.stringify({viewState}, null, 4)}
</code>
</pre>
</div>)};
export default ReactTable;
不幸的是,如果我更改一页上的页面索引或大小,它也会影响所有其他页面。
“viewState”是我的构造,用于跟踪和保持过滤器、分页、扩展、列选择、分组和排序(并允许用户创建自己的自定义命名视图状态)。
似乎表的内部状态正在被破坏性修改,因为 viewState 副本显示了正确的分页数据(但在渲染后更新为不正确的共享值)。
我尝试使用 useControlledState 直接进入/退出 viewState 但这会导致错误,因为它试图在渲染操作期间更新状态。