javascript - 重构超出了最大更新深度
问题描述
我看到几个话题都在谈论这个常见错误,但我没有发现任何与使用 recompose 相关的内容。
语境
我有这个withStateHandler
withStateHandlers(
{
bookingValidation: false,
},
{
setBookingValidation: ({ bookingValidation }) => () => ({
bookingValidation: !bookingValidation,
}),
},
),
我有这个lifeCycle
lifecycle({
componentDidMount() {
const { getFamily } = this.props;
getFamily();
},
componentWillReceiveProps(prevProps) {
const { formValues } = prevProps;
const { setBookingValidation } = this.props;
const {
locationId,
specialityId,
serviceId,
cancellationDetails,
personId,
date,
} = formValues;
const allFormValuesSelected = !!(
locationId &&
specialityId &&
serviceId &&
cancellationDetails &&
personId &&
date
);
if (allFormValuesSelected) setBookingValidation();
},
}),
这是一个简单的验证,当我拥有所有 selectedValues 时,bookingValidation 的状态将更改true
,您将能够单击一个按钮。
问题
if (allFormValuesSelected) setBookingValidation();
如果由于该功能而超过最大更新深度,则当您输入此内容时setBookingValidation()
问题 我怎样才能避免这种行为?有没有办法保持这个功能?
解决方案
发生这种情况是因为setBookingValidation()
更改了属性值并调用了componentWillReceiveProps
. 你得到了一个无限循环的调用。
如果要执行表单验证,则应将该功能移至单独的withHandlers()方法并调用onChange
事件。
推荐阅读
- sql-server - 为什么从自连接临时表更新真实表不起作用但使用真实表时它可以工作?
- python - 如何使用 bash 在文件更改时设置脚本 RELOAD/RESTART?
- python - tf.saved_model.simple_save 中的输入和输出是什么?
- amazon-web-services - 如何在 cloudformation yaml 文件中指定使用参数值,否则通过 FindInMap 使用默认值
- html - 将按钮上方的图片居中到不同的网页
- mysql - Alter 语句在 MySQl 中工作但在 MAriaDB 中不工作?
- python - Django 不在用户模型中存储密码字段
- r - 在圆环图中排序图例不起作用ggplot2 R
- python - 有没有类似于 Python 中的“查找”命令的东西?
- sql - PowerQuery 条件最大值