【发布时间】:2019-09-02 09:05:37
【问题描述】:
我读到你的组件应该通过 props (mapStateToProps) 接收你的 API 响应,在它到达你的组件之前由 reducer 处理。
我的问题是那些道具没有被清除 - 搞砸了我的状态和渲染。
示例:我收到一条验证错误消息“validationErrorMsg”,我将状态设置为并呈现该状态。当用户触发另一个验证调用时,我会重置状态,但是当调用进行时,状态会再次填充包含旧的validationErrorMsg 的道具,该道具再次错误地更新状态。
我为解决这个问题所做的就是在我的 api 响应中调度 2 个事件。一个带有响应,另一个用于清除响应 - 这就是为什么要清除属性以使下一个正在运行的调用不会获取脏数据。
所以我的问题是,我做错了还是 API 响应不应该通过 props 系统来?
validate() {
const { validateApiCall, formValues } = this.props;
let serial = formValues.serial;
this.setState({
validationError: undefined
});
validateApiCall({serialred});
}
下面的这个函数在按键、其他事件等上被调用。我刚刚重置了我的状态,但这将使用旧数据再次设置我的状态(通过 componentWillReceiveProps(nextProps) 是的,我知道不推荐使用)
function mapStateToProps( { upgrades} ) {
let props = {
propValidationError: (upgrades && upgrades.validationError ? upgrades.validationError : undefined)
};
return props;
}
该死的,我又把旧东西拿回来了。
componentWillReceiveProps(nextProps) {
if (nextProps.propValidationError) {
this.setState({validationError: nextProps.tradeinValidationError});
}
}
我目前对它的修复(感觉就像是因为糟糕的框架而被破解)。我通过调度另一个将清除道具的事件来清除道具。
try {
const res = await axios.post(url, {formValues});
dispatch({ type: FETCH_UPGRADES_TRADEIN_VALIDATE_DEVICE, payload: res.data });
} catch (e) {
const { data, status } = e.response;
if (status >= 400 && status < 500) {
dispatch({type: FETCH_UPGRADES_TRADEIN_VALIDATE_ERROR_RESPONSE, tradeinValidationError: data.message});
dispatch({type: FETCH_UPGRADES_TRADEIN_VALIDATE_ERROR_RESPONSE_DONE, tradeinValidationError: data.message});
}
【问题讨论】:
-
在 yup 中验证,从 redux 接收一些 props,使用这个 props 设置 yup 验证