如何在使用此关键字的方法中设置 class 变量的状态
How do I set the status of a variable of a class in a method that using this keyword
我正在尝试在我的 Ionic React 应用程序中显示重置服务的结果。我无法使用 this.setState({resetSuccess})
因为我试图在一个方法中这样做,而 this
将引用该方法的范围。 (我在评论中也提到了这个问题)
请参考以下代码:
private async handleSubmit(e: React.FormEvent,
): Promise<any> {
e.preventDefault();
try {
console.log(`These are the reset params---->${JSON.stringify(Reset.resetParams)}`)
const resetService = new ResetService();
const resetResponse: ResetResponse = await resetService.reset(Reset.resetParams);
console.log(`This is the response from the API ----> ${JSON.stringify(resetResponse)}`)
if (resetResponse.status === 401) {
console.log("Authentication failed");
}
else if (resetResponse.status === 200) {
console.log("Password reset successfully");
const resetSuccess: boolean = true;
this.setState({ resetSuccess }) // ****How do I set this state? which is in the class's scope?
Reset.history.push('/login');
}
} catch (e) {
console.log(`Request failed: ${e}`);
const resetSuccess: boolean = false;
this.setState({ resetSuccess })
}
}
这是我的渲染函数:
public render() {
const { resetSuccess, errors } = this.state;
const context: FormContext = {
...this.state,
setValues: this.setValues,
validate: this.validate
};
return (
<IonPage id="login-registration-page">
<IonHeader>
<IonToolbar color="primary">
<IonTitle>Reset Password</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent>
<FormContext.Provider value={context}>
<form onSubmit={this.handleSubmit} className="login-registration-form ion-padding">
<div className="container">
{this.props.render()}
<div className="form-group">
<IonButton
type="submit"
disabled={!this.completeValidation}
expand="block"
>Submit</IonButton>
</div>
{resetSuccess === true && ( //*****This is what I am trying to display based on the outcome
<div className="alert alert-info" role="alert">
Password reset successfull. You will be redirected shortly to the login page
</div>
)}
{resetSuccess === false &&
(
<div className="alert alert-danger" role="alert">
Either the link that you have clicked on or the current password you provided is incorect. Please use the right verification link you received and input the correct password.
</div>
)}
</div>
</form>
</FormContext.Provider>
</IonContent>
</IonPage>
)
}
有几种方法可以做到这一点,但我建议使用 returns 您想要的 handleSubmit
函数并使用正确的 setState
处理程序的函数。通过使用 returns 函数的函数,您可以访问组件的范围以将所需的 setState
方法传递给 handleSubmit
函数。
private async handleSubmit():
(e: React.FormEvent) => Promise<any> {
const setState = this.setState; // Define local reference to setState
return (e: React.FormEvent) => {
e.preventDefault();
try {
console.log(`These are the reset params---->${JSON.stringify(Reset.resetParams)}`)
const resetService = new ResetService();
const resetResponse: ResetResponse = await resetService.reset(Reset.resetParams);
console.log(`This is the response from the API ----> ${JSON.stringify(resetResponse)}`)
if (resetResponse.status === 401) {
console.log("Authentication failed");
}
else if (resetResponse.status === 200) {
console.log("Password reset successfully");
const resetSuccess: boolean = true;
setState({ resetSuccess }) // Now referring to your local reference
Reset.history.push('/login');
}
} catch (e) {
console.log(`Request failed: ${e}`);
const resetSuccess: boolean = false;
setState({ resetSuccess }) // Now referring to your local reference
}
}
}
然后在您的渲染方法中,改为调用 handleSubmit
方法,因为它现在 returns 所需的处理程序:
<form onSubmit={this.handleSubmit()} className="login-registration-form ion-padding">
将 handleSubmit 方法绑定到构造函数中的 class。
constructor(props: any) {
super(props);
const errors: Errors = {};
const values: Values = {};
this.state = {
errors,
values
};
this.currentPasswordProvided = false;
this.passwordValidated = false;
this.completeValidation = false;
this.emailAddress = '';
Reset.history = this.props.history;
this.handleSubmit=this.handleSubmit.bind(this) //<------ Binding it to the class is required because when the submit is clicked, the handler gets unmounted, and this will not be defined in the handleSubmit.
}
我正在尝试在我的 Ionic React 应用程序中显示重置服务的结果。我无法使用 this.setState({resetSuccess})
因为我试图在一个方法中这样做,而 this
将引用该方法的范围。 (我在评论中也提到了这个问题)
请参考以下代码:
private async handleSubmit(e: React.FormEvent,
): Promise<any> {
e.preventDefault();
try {
console.log(`These are the reset params---->${JSON.stringify(Reset.resetParams)}`)
const resetService = new ResetService();
const resetResponse: ResetResponse = await resetService.reset(Reset.resetParams);
console.log(`This is the response from the API ----> ${JSON.stringify(resetResponse)}`)
if (resetResponse.status === 401) {
console.log("Authentication failed");
}
else if (resetResponse.status === 200) {
console.log("Password reset successfully");
const resetSuccess: boolean = true;
this.setState({ resetSuccess }) // ****How do I set this state? which is in the class's scope?
Reset.history.push('/login');
}
} catch (e) {
console.log(`Request failed: ${e}`);
const resetSuccess: boolean = false;
this.setState({ resetSuccess })
}
}
这是我的渲染函数:
public render() {
const { resetSuccess, errors } = this.state;
const context: FormContext = {
...this.state,
setValues: this.setValues,
validate: this.validate
};
return (
<IonPage id="login-registration-page">
<IonHeader>
<IonToolbar color="primary">
<IonTitle>Reset Password</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent>
<FormContext.Provider value={context}>
<form onSubmit={this.handleSubmit} className="login-registration-form ion-padding">
<div className="container">
{this.props.render()}
<div className="form-group">
<IonButton
type="submit"
disabled={!this.completeValidation}
expand="block"
>Submit</IonButton>
</div>
{resetSuccess === true && ( //*****This is what I am trying to display based on the outcome
<div className="alert alert-info" role="alert">
Password reset successfull. You will be redirected shortly to the login page
</div>
)}
{resetSuccess === false &&
(
<div className="alert alert-danger" role="alert">
Either the link that you have clicked on or the current password you provided is incorect. Please use the right verification link you received and input the correct password.
</div>
)}
</div>
</form>
</FormContext.Provider>
</IonContent>
</IonPage>
)
}
有几种方法可以做到这一点,但我建议使用 returns 您想要的 handleSubmit
函数并使用正确的 setState
处理程序的函数。通过使用 returns 函数的函数,您可以访问组件的范围以将所需的 setState
方法传递给 handleSubmit
函数。
private async handleSubmit():
(e: React.FormEvent) => Promise<any> {
const setState = this.setState; // Define local reference to setState
return (e: React.FormEvent) => {
e.preventDefault();
try {
console.log(`These are the reset params---->${JSON.stringify(Reset.resetParams)}`)
const resetService = new ResetService();
const resetResponse: ResetResponse = await resetService.reset(Reset.resetParams);
console.log(`This is the response from the API ----> ${JSON.stringify(resetResponse)}`)
if (resetResponse.status === 401) {
console.log("Authentication failed");
}
else if (resetResponse.status === 200) {
console.log("Password reset successfully");
const resetSuccess: boolean = true;
setState({ resetSuccess }) // Now referring to your local reference
Reset.history.push('/login');
}
} catch (e) {
console.log(`Request failed: ${e}`);
const resetSuccess: boolean = false;
setState({ resetSuccess }) // Now referring to your local reference
}
}
}
然后在您的渲染方法中,改为调用 handleSubmit
方法,因为它现在 returns 所需的处理程序:
<form onSubmit={this.handleSubmit()} className="login-registration-form ion-padding">
将 handleSubmit 方法绑定到构造函数中的 class。
constructor(props: any) {
super(props);
const errors: Errors = {};
const values: Values = {};
this.state = {
errors,
values
};
this.currentPasswordProvided = false;
this.passwordValidated = false;
this.completeValidation = false;
this.emailAddress = '';
Reset.history = this.props.history;
this.handleSubmit=this.handleSubmit.bind(this) //<------ Binding it to the class is required because when the submit is clicked, the handler gets unmounted, and this will not be defined in the handleSubmit.
}