【问题标题】:Maximum update depth exceeded with recompose重构超出了最大更新深度
【发布时间】:2020-02-29 16:52:59
【问题描述】:

我看到几个话题都在谈论这个常见的错误,但我没有发现任何与使用 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();
    },
  }),

这是一个简单的验证,当我选择了所有的值时,bookingValidation 的状态将在true 上发生变化,您将能够单击一个按钮。

问题

当你输入这个 if if (allFormValuesSelected) setBookingValidation(); 时,由于函数 setBookingValidation() 而超出了最大更新深度

问题 我怎样才能避免这种行为? 有没有办法保持这个功能?

【问题讨论】:

  • 你的代码没问题,只要确保setBookingValidation() 没有在无限循环中被调用。最简单的解决方案是拥有另一个状态标志,并在第一次调用 setBookingValidation() 之后和在 componentWillReceiveProps() 再次调用它之前更新它,您可以验证是否是第一次执行。

标签: javascript reactjs recompose


【解决方案1】:

这是因为setBookingValidation() 更改了属性值并调用了componentWillReceiveProps。你得到了一个无限循环的调用。

如果您想执行表单验证,您应该将该功能移至单独的withHandlers() 方法并调用onChange 事件。

【讨论】:

  • 你能给我举个例子吗?我试图按照您的建议编写一些代码,但我收到了同样的错误。如果你愿意,我可以更新问题
猜你喜欢
  • 1970-01-01
  • 2021-06-30
  • 2022-01-17
  • 1970-01-01
  • 2020-07-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多