【问题标题】:SetState Is Not A Function and the "bind" has been madeSetState 不是函数,并且已进行“绑定”
【发布时间】:2019-11-19 13:05:32
【问题描述】:

我有一个具有 onChange 的输入。它位于登录,它有一个密码输入和一个提交按钮。很简单,而且效果很好(我在控制台中跟踪过)。代码如下:

...

constructor(props) {
    super(props)
    this.state = { 
      loginMode: true, 
      error: this.props.loginU.errorEmailMsg == null 
     }
    this.handleEmailError = this.handleEmailError.bind(this);
  }

...

<Field
    component={Input}
    type="email"
    name="email"
    required={true}
    onChange={this.handleEmailError}
    errorState={ this.state.error == true && this.props.loginU.errorEmailMsg != null || this.props.loginU.errorMsg != null ? true : false }
        />

我提交时出现问题,给我TypeError: this.setState is not a function的错误。并且该错误针对一个名为 onSubmit 的函数,它不需要绑定,我认为这对问题并不重要,因为当我删除“handleEmailError”时它一切正常。也许这是生命周期的问题或类似的问题,我真的不明白。当我有错误时,你能告诉我吗? 以下是我调用 onSubmit 的方式:

    if (showLogin) {  

      form = <form onSubmit={handleSubmit(v => this.onSubmit(v))}>
          <Field
              component={Input}
              type="email"
              name="email"
              required={true}
              onChange={this.handleEmailError}
              errorState={ this.state.error == true && this.props.loginU.errorEmailMsg != null || this.props.loginU.errorMsg != null ? true : false }
            />

...

【问题讨论】:

  • 需要更多信息,能否将您的代码放在 stackblitz 上。如果没有,那么共享整个组件?

标签: reactjs


【解决方案1】:

问题是因为handleSubmit返回一个函数,你没有显式设置返回函数的上下文,因此它在DOM组件的上下文中被调用,即form

举个例子,以下应该可以工作

 onSubmit={e => handleSubmit(v => this.onSubmit(v))(e)}

那是因为我们使用箭头函数来切换handler上下文,内部箭头函数继承了这个上下文。

如果您将handleSubmit 声明为类字段,您会自动绑定到组件的上下文,并且您的代码应该按原样运行

handleSubmit = func => {
  ...
}

鉴于您现在已确认 handleSubmit 作为道具传入,那么这里最简单的方法是在分配处理程序之前绑定它,例如

constructor(props) {
  super(props);
  this.submitHandler = this.props.handleSubmit.bind(this);
}
...
<form onSubmit={this.submitHandler(v => this.onSubmit(v))}>

【讨论】:

  • 嗨@James,谢谢你的回答......但我无法得到足够的答案。我理解了解释的第一部分,但没有理解第二部分。即便如此,我已经尝试了代码。错误不再出现...但我无法提交。
  • @PedroRelvas 你需要调试你的代码,如果问题消失了,那么问题就解决了。如果现在有其他东西被破坏了,那么你需要分享一个小例子来展示这个问题,如果没有看到代码/问题,我现在无能为力。
  • @PedroRelvas 在第一个示例中我忘记调用handleSubmit 返回的函数,抱歉(我已更新)。但是,如后面部分所述,如果您利用类字段,您的原始代码应该可以正常工作。
  • 我的 handleSubmit 是一个 const... const { handleSubmit } = this.props ... 而不是一个函数。顺便说一句,我是一个初学者,所以那是因为我无法 100% 获得它:
  • @PedroRelvas 没问题,感谢您的确认。请看更新
猜你喜欢
  • 1970-01-01
  • 2018-02-26
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多