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