无法在 Formik 的 onSubmit 中调用 setState 函数
Can't call setState function in onSubmit of Formik
我试图在每次提交表单时添加提醒。我试图将我的状态作为道具传递给我的组件,但这似乎不起作用。
这是我的 class 状态:
this.state = {
alert_variant: '',
alert_heading: '',
alert_body: '',
alert_show: false
};
以下是我呈现警报的方式:
<ReactAlert
show={this.state.alert_show}
variant={this.state.alert_variant}
heading={this.state.alert_heading}
body={this.state.alert_body}
/>
这是我在 Formik 中的提交处理程序的一部分,它将值发送到 API:
onSubmit={(
values,
{
setSubmitting,
resetForm
}) =>{
fetch("url.com", {
method: 'POST',
mode: 'cors',
body: JSON.stringify(values, null, 2)
}
)
.then(res => res.json())
.then(
(result) => {
console.log(result)
setSubmitting(false)
resetForm(values)
this.setState({
alert_show: true,
alert_variant: 'success',
alert_heading: 'Sample Header',
alert_body: 'Sample body.'
});
},
(error, result) => {
this.setState({
error
});
console.log(this.state.error);
setSubmitting(false);
}
)
这是我的警报组件:
function ReactAlert(props){
const [show, setShow] = useState(false);
if (show) {
return(
<Bs.Alert variant={props.variant} onClose={() => setShow(false)} dismissible>
<Bs.Alert.Heading>{props.heading}</Bs.Alert.Heading>
<p>
{props.body}
</p>
</Bs.Alert>
);
}
return null;
}
现在如何在 Formik 的提交处理程序中更改我的状态变量?这可能吗?我试图创建一个单独的提交处理程序函数,但也没有用。
您没有 instance of the Current Class inside the fecth
,因为它会创建一个作用域直到结束的新对象。
因此,如果您想在另一个 class 中调用 setState
,方法如下:
onSubmit={(
values,
{
setSubmitting,
resetForm
}) => {
// GET THE CURRENT CLASS INSTANCE:
const that = this;
fetch("url.com", {
method: 'POST',
mode: 'cors',
body: JSON.stringify(values, null, 2)
}
)
.then(res => res.json())
.then(
(result) => {
console.log(result)
setSubmitting(false)
resetForm(values)
//CALL SETSTATE ON THAT
that.setState({
alert_show: true,
alert_variant: 'success',
alert_heading: 'Sample Header',
alert_body: 'Sample body.'
});
},
(error, result) => {
//CALL SETSTATE ON THAT
that.setState({
error
});
console.log(that.state.error);
setSubmitting(false);
}
)
}
更新:
对于警报 ONE
function ReactAlert(props){
const [show, setShow] = useState(false);
if (props.show || props.alert_show) {
return(
<Bs.Alert variant={props.variant} onClose={() => setShow(false)} dismissible>
<Bs.Alert.Heading>{props.heading}</Bs.Alert.Heading>
<p>
{props.body}
</p>
</Bs.Alert>
);
}
return null;
}
我找到了解决问题的方法。如果有任何初学者遇到同样的问题,我会分享这个。
我创建了一个变量来存储 class 的 this
实例,就像@Harish Sonis 在他的回答中所说的那样。我添加了一个函数,每次关闭警报时都会调用它。
我的函数:
alertClose(){
this.setState({
alert_show: false
});
}
新的警报渲染,我添加了 onClose 道具:
<ReactAlert
display={this.state.alert_show}
variant={this.state.alert_variant}
heading={this.state.alert_heading}
body={this.state.alert_body}
onClose={this.alertClose}
/>
我在组件渲染中调用了 onClose 属性
function ReactAlert(props){
if (props.display) {
return(
<Bs.Alert variant="success" onClose={() => props.onClose()} dismissible>
<Bs.Alert.Heading>hehe</Bs.Alert.Heading>
<p>
hehe
</p>
</Bs.Alert>
);
}
return null;
}
感谢@Harish Soni 对我的帮助。
我试图在每次提交表单时添加提醒。我试图将我的状态作为道具传递给我的组件,但这似乎不起作用。
这是我的 class 状态:
this.state = {
alert_variant: '',
alert_heading: '',
alert_body: '',
alert_show: false
};
以下是我呈现警报的方式:
<ReactAlert
show={this.state.alert_show}
variant={this.state.alert_variant}
heading={this.state.alert_heading}
body={this.state.alert_body}
/>
这是我在 Formik 中的提交处理程序的一部分,它将值发送到 API:
onSubmit={(
values,
{
setSubmitting,
resetForm
}) =>{
fetch("url.com", {
method: 'POST',
mode: 'cors',
body: JSON.stringify(values, null, 2)
}
)
.then(res => res.json())
.then(
(result) => {
console.log(result)
setSubmitting(false)
resetForm(values)
this.setState({
alert_show: true,
alert_variant: 'success',
alert_heading: 'Sample Header',
alert_body: 'Sample body.'
});
},
(error, result) => {
this.setState({
error
});
console.log(this.state.error);
setSubmitting(false);
}
)
这是我的警报组件:
function ReactAlert(props){
const [show, setShow] = useState(false);
if (show) {
return(
<Bs.Alert variant={props.variant} onClose={() => setShow(false)} dismissible>
<Bs.Alert.Heading>{props.heading}</Bs.Alert.Heading>
<p>
{props.body}
</p>
</Bs.Alert>
);
}
return null;
}
现在如何在 Formik 的提交处理程序中更改我的状态变量?这可能吗?我试图创建一个单独的提交处理程序函数,但也没有用。
您没有 instance of the Current Class inside the fecth
,因为它会创建一个作用域直到结束的新对象。
因此,如果您想在另一个 class 中调用 setState
,方法如下:
onSubmit={(
values,
{
setSubmitting,
resetForm
}) => {
// GET THE CURRENT CLASS INSTANCE:
const that = this;
fetch("url.com", {
method: 'POST',
mode: 'cors',
body: JSON.stringify(values, null, 2)
}
)
.then(res => res.json())
.then(
(result) => {
console.log(result)
setSubmitting(false)
resetForm(values)
//CALL SETSTATE ON THAT
that.setState({
alert_show: true,
alert_variant: 'success',
alert_heading: 'Sample Header',
alert_body: 'Sample body.'
});
},
(error, result) => {
//CALL SETSTATE ON THAT
that.setState({
error
});
console.log(that.state.error);
setSubmitting(false);
}
)
}
更新: 对于警报 ONE
function ReactAlert(props){
const [show, setShow] = useState(false);
if (props.show || props.alert_show) {
return(
<Bs.Alert variant={props.variant} onClose={() => setShow(false)} dismissible>
<Bs.Alert.Heading>{props.heading}</Bs.Alert.Heading>
<p>
{props.body}
</p>
</Bs.Alert>
);
}
return null;
}
我找到了解决问题的方法。如果有任何初学者遇到同样的问题,我会分享这个。
我创建了一个变量来存储 class 的 this
实例,就像@Harish Sonis 在他的回答中所说的那样。我添加了一个函数,每次关闭警报时都会调用它。
我的函数:
alertClose(){
this.setState({
alert_show: false
});
}
新的警报渲染,我添加了 onClose 道具:
<ReactAlert
display={this.state.alert_show}
variant={this.state.alert_variant}
heading={this.state.alert_heading}
body={this.state.alert_body}
onClose={this.alertClose}
/>
我在组件渲染中调用了 onClose 属性
function ReactAlert(props){
if (props.display) {
return(
<Bs.Alert variant="success" onClose={() => props.onClose()} dismissible>
<Bs.Alert.Heading>hehe</Bs.Alert.Heading>
<p>
hehe
</p>
</Bs.Alert>
);
}
return null;
}
感谢@Harish Soni 对我的帮助。