【发布时间】:2020-07-11 02:56:27
【问题描述】:
我正在构建一个应用程序,该应用程序将从 API 请求数据并将其显示在可编辑的表格中,用户可以在其中编辑和更新数据库。我正在将 React 与 material-ui 和 material-table 一起使用。
我会在父组件的状态下初始化数据,并将其作为props传递给渲染表格的子组件。出于测试目的,我将状态中的数据进行初始化,以模拟以后的 props 实现。表格正确呈现,但是当我编辑时,值不会改变。
export default function Table(props){
const [gridData, setGridData] = useState({
data: [
{ param: "Admin", val: "0.03" },
{ param: "Margin", val: "0.4" },
{ param: "Price", val: "5080" },
],
resolve: () => {}
});
useEffect(() => {
gridData.resolve();
}, [gridData]);
const onRowUpdate = (newData, oldData) =>
new Promise((resolve, reject) => {
const { data } = gridData;
const index = data.indexOf(oldData);
data[index] = newData;
setGridData({ ...gridData, data, resolve });
});
const { data } = gridData;
return (
<div>
<MaterialTable
columns={props.col}
data={data}
editable={{
isEditable: rowData => true,
isDeletable: rowData => true,
onRowUpdate: onRowUpdate
}}
/>
</div>
);
}
现在,当我将 columns={props.col} 行替换为以下内容时,我发现该表可以正常工作:
columns={[
{ title: 'Parameters', field: 'param', editable: 'never' },
{ title: 'Value', field: 'val', editable: 'onUpdate' }
]}
所以看来我的问题在于列而不是数据。
任何帮助将不胜感激!
注意: 代码基于来自 github 的回复:https://github.com/mbrn/material-table/issues/1325
编辑: 列是从父组件传递的,如下所示:
const comonscol = [
{ title: 'Parameters', field: 'param', editable: 'never' },
{ title: 'Value', field: 'val', editable: 'onUpdate' }
];
export default function ParamsSection(props) {
...
return (
<div>
...
<Table col={comonscol} data={dummy2} />
...
</div>
);
}
【问题讨论】:
-
如果问题出在
props.cols,你应该告诉我们你是如何传递这个属性的。 -
是的,对不起。我将代码添加到问题中。
-
我正在测试你的代码,它对我有用吗?我将数据和列添加为
props,并添加了缺少的onRowUpdate, onRowDelete,它似乎工作正常。这是codesandbox -
谢谢@awran5。我测试了沙箱代码,如果您按下编辑按钮,然后更改一个值并接受,该字段将恢复为原始值。但是,如果您声明
const comoscol = [...]并使用它而不是道具,它将正常工作。我不明白为什么 -
@Danf 是的,我明白了问题所在。请在下面查看我的答案。