Reactjs 如何避免;只能更新已安装或正在安装的部件”;警告

Reactjs 如何避免;只能更新已安装或正在安装的部件”;警告,reactjs,Reactjs,在尝试更新注册组件中的setState时,我不断遇到以下错误: 警告:设置状态(…):只能更新已安装或正在安装的 组成部分。这通常意味着您在未安装的服务器上调用了setState() 组成部分。这是禁止注册的。请检查注册代码 组成部分 当用户注册后调用this.setState({signedUp:true})时,该错误就会发生在open方法中。为什么这个在这个特殊的时刻是“未安装”的,我怎样才能避免这个问题 export default class Signup extends Compon

在尝试更新注册组件中的setState时,我不断遇到以下错误:

警告:设置状态(…):只能更新已安装或正在安装的 组成部分。这通常意味着您在未安装的服务器上调用了setState() 组成部分。这是禁止注册的。请检查注册代码 组成部分

当用户注册后调用
this.setState({signedUp:true})时,该错误就会发生在open方法中。为什么
这个
在这个特殊的时刻是“未安装”的,我怎样才能避免这个问题

 export default class Signup extends Component {
       constructor(props) {
          super(props);

          this.state = {
            isLoading: false,
            email: "",
            password: "",
            signedUp: false,
            isVerified: false
          };

       this.open = this.open.bind(this)
    }

    open() {
      if (this.state.signedUp===false)  {
        this.setState({ signedUp: true });
      }
    }

    close() {
      console.log('in close')
    }

    handleChange = event => {
      this.setState({
        [event.target.id]: event.target.value
      });
    }

    handleSubmit = async event => {
      event.preventDefault();
      this.signup(this.state.email, this.state.password).then((user) => {
        this.open()
      }, (error) => {
        alert(error)
      });
    }

    signup(email, password) {
      return new Promise(function (resolve, reject) {
        firebase.auth().createUserWithEmailAndPassword(email, password).then(function onSuccess(user) {
          if (user) {
            user.updateProfile({
              displayName: (firstName.charAt(0).toUpperCase() + firstName.slice(1) + ' ' + lastName)
            }).then(function() {
              resolve(user);
            }, function(error) {
              alert(error)
            });
          } else {
              reject('User not signed up');
          } 
        })
      });
    }

    render() {
      return (
        <div className="Signup">
          <Grid>
            <Row>
              <Col sm={8} smOffset={2} md={6} mdOffset={3} lg={4} lgOffset={4}>
              <h1 className="text-center font-size-l">Sign up</h1>
              <Panel>
                <form onSubmit={this.handleSubmit}>

                  <FormGroup controlId="email" bsSize="large">
                    <ControlLabel>Email</ControlLabel>
                    <FormControl
                      type="email"
                      placeholder="you@company.com" 
                      value={this.state.email}
                      onChange={this.handleChange}
                    />
                  </FormGroup>

                  <FormGroup controlId="password" bsSize="large">
                    <ControlLabel>Password</ControlLabel>
                    <FormControl
                      value={this.state.password}
                      placeholder="Enter a secure password" 
                      onChange={this.handleChange}
                      type="password"
                    />
                  </FormGroup>

                  <LoaderButton
                    block
                    className="btn-primary"
                    bsSize="large"
                    type="submit"
                    isLoading={this.state.isLoading}
                    text="Next"
                    loadingText="Signing up…"
                  />
                </form>
              </Panel>
            </Col>
          </Row>
        </Grid>

        <Modal show={this.state.signedUp} onHide={this.close} >
          <Modal.Body>
          <p>Check your inbox for further instructions.</p>
          <LoaderButton
            className="btn-primary"
            bsSize="large"
            type="submit"
            text="Resend email"
          />
          </Modal.Body>
        </Modal>
       </div>
       );
       }
    }
导出默认类注册扩展组件{
建造师(道具){
超级(道具);
此.state={
孤岛加载:false,
电邮:“,
密码:“”,
签名:假,
已验证:错误
};
this.open=this.open.bind(this)
}
开(){
if(this.state.signedUp==false){
this.setState({signedUp:true});
}
}
关闭(){
console.log('in close')
}
handleChange=事件=>{
这是我的国家({
[event.target.id]:event.target.value
});
}
handleSubmit=异步事件=>{
event.preventDefault();
this.signup(this.state.email,this.state.password)。然后((用户)=>{
这个,开()
},(错误)=>{
警报(错误)
});
}
注册(电子邮件、密码){
返回新承诺(功能(解决、拒绝){
firebase.auth().createUserWithEmailAndPassword(电子邮件,密码)。然后(函数onSuccess(用户){
如果(用户){
user.updateProfile({
displayName:(firstName.charAt(0.toUpperCase()+firstName.slice(1)+''+lastName)
}).然后(函数(){
解析(用户);
},函数(错误){
警报(错误)
});
}否则{
拒绝(“用户未注册”);
} 
})
});
}
render(){
返回(
注册
电子邮件
密码
查看您的收件箱以了解更多说明

); } }
添加
组件WillUnmount
事件处理程序,并通过添加日志调用或
调试器
断点查看是否命中,可能是您正在更新未安装组件的状态。另请注意,
submit
将刷新页面,您确定要使用submit,也许可以使用
fetch
发送提交调用instead@Icepickle刚刚尝试过,组件在提交注册表单时确实会卸载。因此,问题的措辞有点不同:如何避免包括表单在内的组件在提交后卸载?不要使用
submit
,而是使用
onClick
事件,或者使用
this.handleSubmit
方法中的
return false
(然而,由于它被标记为
async
,我怀疑它是否会起作用,因为异步方法会发回一个承诺,我很好奇为什么它被标记为
async
,但是,从您向我们展示的代码中,我看不出任何原因)老实说,我甚至不明白为什么你需要使用
submit
事件,你正在通过firebase处理所有事情,你确定你也要提交数据吗?添加
组件将卸载
事件处理程序,并通过添加日志调用或
调试器
断点查看它是否命中,可能是您正在更新未安装组件的状态。另外请注意,
submit
将刷新页面,是否确实要使用submit,或者您可以使用
fetch
发送提交调用instead@Icepickle刚刚尝试过,当提交注册表单时,组件确实会卸载简单地说:如何避免包括表单在内的组件在提交后卸载?不要使用
submit
,而是使用
onClick
事件,或者使用
this.handleSubmit
方法中的
return false
(然而,由于它被标记为
async
,我怀疑它是否会起作用,因为异步方法会发回一个承诺,我很好奇为什么它被标记为
async
,但是,从您向我们展示的代码中,我看不出任何原因)老实说,我甚至不明白为什么您需要使用
submit
事件,您正在通过firebase处理所有事情,您确定也要提交数据吗?