![](/img/trans.png)
[英]How to dynamically update the attributes of the footer class of a modal dialog in antd
[英]Antd Modal how to update the value in it
我正在使用 Antd Modal 通过将道具传递给 TableDetail 组件来显示订单信息。 问题是当我尝试按照我使用 setState 的顺序删除项目时,模态不会更新其数据。
https://codesandbox.io/s/antd-reproduction-template-forked-vu3ez上面提供了一个简单的复制版本。
在此处输入图像描述单击删除按钮后,项目保持不变,但当我关闭并打开模态时,它会更新。 在此处输入图片说明
我该怎么做才能改变它? 我试过 forceUpdate() 但它不起作用。
这是 TableDetail 组件。
export default class TableDetail extends Component {
constructor(props) {
super(props);
this.state = {
tableOrder: props.tableOrder,
column: []
};
}
tableInitializer = () => {
const column = [
{
title: "name",
render: (item) => {
return <span>{item.name}</span>;
}
},
{
title: "price",
render: (item) => {
return item.price;
}
},
{
title: "amount",
render: (item) => {
return <span>{item.amount}</span>;
}
},
{
title: "removeButton",
render: (item) => {
return (
<Button
type="link"
style={{ color: "red" }}
onClick={() => this.props.removeItem(item)}
>
Remove
</Button>
);
}
}
];
this.setState({
column
});
};
UNSAFE_componentWillMount() {
this.tableInitializer();
}
render() {
return (
<Modal
visible={true}
title={
<span style={{ fontSize: "1.5rem", fontWeight: "bold" }}>
Table: {this.state.tableName}
</span>
}
cancelText="Cancel"
okText="OK"
onCancel={this.props.hideModal}
>
<Table
columns={this.state.column}
dataSource={this.state.tableOrder}
rowKey="name"
/>
</Modal>
);
}
}
TableDetail.propTypes = {
tableOrder: PropTypes.array.isRequired,
tableName: PropTypes.string.isRequired,
hideModal: PropTypes.func.isRequired,
removeItem: PropTypes.func.isRequired
};
您代码中的问题出在removeItem
。 您正在尝试改变 tableOrder。 根据反应文档:
永远不要直接改变 this.state,因为之后调用 setState() 可能会替换你所做的改变。 将 this.state 视为不可变的
setState() 不会立即改变 this.state 而是创建一个挂起的状态转换。 调用此方法后访问 this.state 可能会返回现有值。
所以这就是为什么它有点异步并且您看不到更新的更改。 你需要这样做:
removeItem = (item) => {
const { tableOrder } = this.state;
const newTable = [...tableOrder]; <- Create new variable and update variable
for (let i = 0; i < newTable.length; i++) {
if (item.name === newTable[i].name) {
console.log("Got it! " + newTable[i].name);
newTable.splice(i, 1);
console.log("new table: ", tableOrder);
break;
}
}
this.setState({
tableOrder: newTable <- update here
});
};
您不需要实际修改数组,您也可以简单地执行此操作:
this.setState(
{
tableOrder: this.state.tableOrder.filter(data => !(data.name===item.name))
}
)
//filter creates new array
这是演示: https : //codesandbox.io/s/antd-reproduction-template-forked-j4bfl?file=/tables.js
您可以在removeItem
函数中使用filter
方法
removeItem = (item) => {
const filtered = this.state.tableOrder.filter(
(order) => item.name !== order.name
);
console.log(item, filtered);
this.setState({
tableOrder: filtered
});
};
还有一件事你应该避免将你的道具分配给状态,比如
this.state = {
tableOrder: props.tableOrder,
};
而不是分配给状态直接使用它作为道具
<Table
dataSource={this.props.tableOrder}
/>
在大多数情况下,这是一种反模式。 不要“将道具复制到状态”。 它为您的数据创建了第二个真实来源,这通常会导致错误。 最好的真相来源之一。
改进的代码现场演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.