因此,我重写了我的代码,以使用状态,而不是修改道具,因为这不是我应该做的。现在发生的问题是,当componentDidMount运行时,道具仍然没有从后端获取,因此函数中的if语句始终是假的。
componentDidMount() {
this.props.getTypes('sport');
this.props.getSchema();
this.props.getDomainForm();
if(Object.keys(this.props.schema).length) {
this.setState({schema: this.props.schema})
}
if(Object.keys(this.props.formData).length) {
this.setState({form: this.props.formData})
}
}
const mapStateToProps = (state) => {
return {
schema: state.admin.settings.Domains.schema.data || {},
formData: state.admin.settings.Domains.domain.data || {},
types: state.admin.settings.Domains.types.data || {},
}
};我已经完成了这段代码,看起来componentDidMount只运行过一次。既然componentWillRecieveProps不受欢迎,我不知道该怎么做才能解决这个问题,我希望你们能帮我解决这个问题。
PS。fetch操作没有问题,还原器工作得很好,我没有在那里做任何更改,redux调试器正在正确地显示结果。
发布于 2018-08-03 08:51:02
作为componentWillReceiveProps的替代品,引入了static getDerivedStateFromProps(props, state)方法,每当组件接收新的道具时,都会调用它,因此可能会对您有所帮助。这是文档。
发布于 2018-08-03 08:46:53
我认为问题在于您的fetch是异步的,完成任务只需一点时间,在完成提取之前,组件将安装在DOM上。
正如您注意到的,您可以看到数据是通过redux调试器接收的,并且您没有问题,所以我猜您将初始状态作为空对象或数组传递给了您的状态。因此,组件通过道具接收数据,而不是将状态更新为reRender组件,只要在收到新数据时,只需使用componentWillReceiveProps更新状态,只需检查当前道具是否与以前的道具相同,下面的代码如下:
componentWillReceiveProps = (nextProps) => {
if(this.props.yourPropsFromRedux != nextProps.yourPropsFromRedux ) {
this.setState({ yourState: nextProps.yourPropsFromRedux })
}
}发布于 2020-10-14 13:03:11
使用componentDidUpdate和componentDidMount更适合于这种情况。componentDidMount将为初始呈现设置状态,componentDidUpdate将为将来呈现设置状态。不要忘记用当前的道具测试componentDidUpdate方法的componentDidUpdate参数,以检查数据是否已经更改。在这里阅读文档
https://stackoverflow.com/questions/51668524
复制相似问题