【发布时间】:2019-11-27 03:57:19
【问题描述】:
我想使用 redux,但仍然通过我的本地状态控制在 bootstrap-react-table 中呈现的内容。因此,在 componentDidMount 中,我正在获取我的数据,当我尝试通过按钮进行过滤时,单击我将 setState 设置为名为“itemsToDisplay”的字段,然后我想将其用作表中的数据。但是点击只在第二次起作用,当我在 render/componentDidMount 中记录状态时,它是未定义的。
我尝试了不同的条件来呈现表格的数据字段道具中的项目,但没有成功。我也尝试在 componentWillMount 中设置状态。
class Deliveries extends Component {
constructor(props) {
super(props);
this.state = {
itemsToDisplay: this.props.deliveries,
};
}
componentDidMount() {
this.props.getDeliveries();
this.setState(prev => {
return {
...prev,
itemsToDisplay: this.props.deliveries,
}
})
}
filterUndelivered = () => {
this.props.filterUndelivered();
this.setState(prev => {
return {
...prev,
itemsToDisplay: this.props.undelivered_items,
}
})
};
getFilters = () => {
return (
<div>
<Button className="m-1" color="primary">By time</Button>
<Button className="m-1" color="primary" onClick={ this.filterUndelivered }>Not delivered</Button>
</div>
);
};
render() {
const { itemsToDisplay } = this.state;
const options = {
insertBtn: this.createCustomInsertButton,
searchField: this.createCustomSearchField,
};
return (
<div className="animated fadeIn">
<div className="d-flex justify-content-between">
<div className="font-weight-bold mt-2">Deliveries Monitor</div>
<div className="d-flex justify-content-end">
{this.getFilters()}
</div>
</div>
<BootstrapTable
data={ itemsToDisplay ? itemsToDisplay : this.props.deliveries }
version="4"
search
hover
pagination
bordered={false}
headerStyle={{ background: "#20a8d8" }}
bodyStyle={{ cursor: "pointer"}}
options={ options }
>
<TableHeaderColumn isKey dataField="delivery_id">Delivery#</TableHeaderColumn>
<TableHeaderColumn dataField="seller">Seller</TableHeaderColumn>
<TableHeaderColumn dataField="address">Address</TableHeaderColumn>
<TableHeaderColumn dataField="site">Site</TableHeaderColumn>
<TableHeaderColumn dataField="end_of_window">End of window</TableHeaderColumn>
<TableHeaderColumn dataField="due_date">Due date</TableHeaderColumn>
<TableHeaderColumn dataField="status">Status</TableHeaderColumn>
</BootstrapTable>
</div>
)
}
}
const mapStateToProps = state => {
return {
deliveries: state.deliveriesReducer.deliveries,
undelivered_items: state.deliveriesReducer.undelivered_items,
}
};
const mapDispatchToProps = (dispatch) => {
return bindActionCreators({ getDeliveries, filterUndelivered }, dispatch);
};
export default connect(mapStateToProps, mapDispatchToProps)(Deliveries);
当数据道具的条件正确时,预期的结果是能够在第一次点击时进行过滤。
【问题讨论】:
-
我过去也遇到过同样的问题。你检查过 Redux 的数据流吗?
-
我做到了。从操作到从减速器返回的所有过程中,数据看起来都很好,并且组件可以正确接收它。出于某种原因,第一次单击将“itemsToDisplay”保留为未定义,然后在第二次单击时正常工作。
-
有没有可能是同步问题?
-
尝试使用 componentWillReceiveProps(nextProps)
标签: reactjs redux jsx state-management react-bootstrap-table