【发布时间】:2020-04-29 15:11:42
【问题描述】:
现在我有一个使用 redux 的 react 应用程序。我创建了一个组件,它作为一个表单来创建客户。像这样:
import { createCustomer } from "../../actions";
class CustomerCreate extends React.Component {
state = {
submitting: false
}
componentWillReceiveProps(nextProps) {
this.setState({ submitting: false });
}
submitData = (data) => {
this.setState({ submitting: true });
this.props.createCustomer(data);
};
render() {
return (
<React.Fragment>
{this.state.submitting ? <LoadingScreen /> : null}
{this.props.error ? <ErrorMessage message={this.props.error}/> : null}
<FormContainer
...
/>
</React.Fragment>
);
}
}
const mapStateToProps = ({ customerData }) => {
return {
error: customerData.error
};
};
export default connect(mapStateToProps, { createCustomer })(
CustomerCreate
);
这“很好”。基本上 componentWillReceiveProps 将在每次发生某些事情时被调用(错误,好的),所以我会知道何时删除 LoadingScreen。问题是 componentWillReceiveProps 正在引发警告(说不应该使用),并且根据 redux 文档,这被标记为反模式。
我知道一种解决方案可能不是在这里使用 redux。使用 axions 调用更改 submitData 并将 setState 放在那里。但我这样使用它是因为错误消息之一可能是:SESSION EXPIRED 或 INVALID JWT TOKEN 所以我需要将网页重新发送到登录屏幕。
我能想到的另一种方法是在操作中调用调度以设置 isSubmitting 状态。像这样的:
export const createCustomer = (data) => {
/* IS THIS VALID? */
dispatch({ type: CUSTOMER_SUBMITTING });
return async function (dispatch) {
try {
const response = await services.post("/api/customer", data, buildHeader());
dispatch({ type: CUSTOMER_CREATED, payload: response.data });
} catch (err) {
dispatch({ type: CUSTOMER_ERROR, payload: err });
}
};
};
我将使用 props.isSubmitting,而不是使用 state.isSubmitting。但我不确定这样调用两个dispath是否有效/正确。
所以,我的问题是:如何实现在提交时设置为 true 并在 axios 调用完成时设置为 false 的状态/道具(由于某些错误或刚刚好)。
【问题讨论】:
-
我建议你看看
redux-saga。 -
componentDidUpdate(prevState, prevProps, snapshot)不能为您工作?当来自 redux 的 prop 更新时,您可以将其与之前的 prop 值进行比较,并将您的提交状态设置为 false。 -
根据我的经验,我通常会应用您提到的第二种解决方案-将
isSubmitting添加到redux。我相信在 redux 中处理所有请求状态(isFecting、isError、data...)更容易管理。大量的 redux 包可以帮助你用更少的代码做到这一点。
标签: reactjs react-redux