我很难理解为什么在基于类的组件与功能组件中,相同的步骤会产生不同的结果。下面我有一个例子来说明这种差异。
class Test extends Component {
handleSubmit = e => {
e.preventDefault();
this.props.form.validateFields(async (err, values) => {
await this.props.saveUserDetailsAction(values);
const { error } = this.props; // expected modified prop
if (!error.status) {
this.props.router.push("/route");
}
});
};
}
const mapStateToProps = ({ app }) => ({
error: app.error
});
const mapDispatchToProps = {
saveUserDetailsAction,
};
export default compose(
withRouter,
connect(
mapStateToProps,
mapDispatchToProps
)
)(Test);
类组件中的当前错误属性反映了异步函数saveUserDetailsAction完成后 redux 存储中的更改,在这种情况下,如果请求失败,则会调度一个操作。
在saveUserDetailsAction函数显示更新后的道具后访问错误道具。
编写为功能组件的相同代码不会产生相同的结果。在saveUserDetailsAction函数完成后访问 error属性并不能反映 store 中的更改。
const Test = (props) => {
const handleSubmit = e => {
e.preventDefault();
props.form.validateFields(async (err, values) => {
await props.saveUserDetailsAction(values);
const { error } = props; // unchanged prop when accessed here
if (!error.status) {
props.router.push("/route");
}
});
};
}
const mapStateToProps = ({ app }) => ({
error: app.error
});
const mapDispatchToProps = {
saveUserDetailsAction,
};
export default compose(
withRouter,
connect(
mapStateToProps,
mapDispatchToProps
)
)(Test);