【发布时间】:2022-06-13 11:53:56
【问题描述】:
我正在尝试更新包含嵌套值的反应状态。我想更新 3 级深度的数据。
这是保存数据的状态:
const [companies, setCompanies] = useState(companies)
这是第一家公司的数据(公司数组包含许多公司):
const companies = [
{
companyId: 100,
transactions: [
{
id: "10421A",
amount: "850",
}
{
id: "1893B",
amount: "357",
}
}
]
表格组件的代码如下:
function DataTable({ editCell, vendors, accounts }) {
const columns = useMemo(() => table.columns, [table]);
const data = useMemo(() => table.rows, [table]);
const tableInstance = useTable({ columns, data, initialState: { pageIndex: 0 } }, useGlobalFilter, useSortBy, usePagination);
const {
getTableProps,
getTableBodyProps,
headerGroups,
prepareRow,
rows,
page,
state: { pageIndex, pageSize, globalFilter },
} = tableInstance;
return (
<Table {...getTableProps()}>
<MDBox component="thead">
{headerGroups.map((headerGroup) => (
<TableRow {...headerGroup.getHeaderGroupProps()}>
{headerGroup.headers.map((column) => (
<DataTableHeadCell
{...column.getHeaderProps(isSorted && column.getSortByToggleProps())}
width={column.width ? column.width : "auto"}
align={column.align ? column.align : "left"}
sorted={setSortedValue(column)}
>
{column.render("Header")}
</DataTableHeadCell>
))}
</TableRow>
))}
</MDBox>
<TableBody {...getTableBodyProps()}>
{page.map((row, key) => {
prepareRow(row);
return (
<TableRow {...row.getRowProps()}>
{row.cells.map((cell) => {
cell.itemsSelected = itemsSelected;
cell.editCell = editCell;
cell.vendors = vendors;
cell.accounts = accounts;
return (
<DataTableBodyCell
noBorder={noEndBorder && rows.length - 1 === key}
align={cell.column.align ? cell.column.align : "left"}
{...cell.getCellProps()}
>
{cell.render("Cell")}
</DataTableBodyCell>
);
})}
</TableRow>
);
})}
</TableBody>
</Table>
)
}
例如,我想更新 transactions 数组中第一个对象中的金额。我现在正在做的是更新整个 companies 数组,但是这样做会重新渲染整个表并产生问题。有没有办法我只能以仅重新呈现表中更新的字段而不重新呈现整个表的方式更新特定值?我见过其他答案,但他们假设所有值都是命名对象属性。
仅供参考,我没有使用任何状态管理,暂时不想使用。
【问题讨论】:
-
“这样做会重新渲染整个表格并产生问题”是什么意思?能详细点吗?
-
看起来您正在使用库“react-tables”,但没有提及这一点。您是否能够在不使用该库的情况下提供问题的最小表示?您的示例表格组件假定您熟悉该库,并且还包含许多与逻辑相关的不必要代码,用于样式化和组成与您的问题无关的表格。有没有办法简化?
-
您能解释一下“我看过其他答案,但他们认为所有值都被命名为对象属性”是什么意思吗?我按照您为公司数据提供的架构提供了对您问题的答案。
标签: javascript reactjs state