Formik驗證正在提交/isValiating未設置為True [英] Formik validation isSubmitting / isValidating not getting set to true
本文介紹了Formik驗證正在提交/isValiating未設置為True的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個我的用戶請求的表單,我清楚地表明該表單是無效的。因此,我計劃彈出一個sweetalert
對話框,讓他們知道他們需要再次檢查表單。我想我可以在驗證中這樣做,以便在提交嘗試失敗時向他們發出警報:
const validate = values => {
console.log(formik.isSubmitting); // always prints false
console.log(formik.isValidating); // always prints false
const errors = {};
if (!values.name) {
errors.name = 'Required';
}
if (Object.keys(errors).length > 0 && formik.isSubmitting) {
Swal.fire({
icon: 'error',
title: "Oops. . .",
text: "There are errors with the form. Please double check your options.",
footer: "<div>Problems: " + Object.keys(errors).join(', ') + "</div>"
})
}
return errors;
};
const formik = useFormik({
initialValues: {
name: item.name
},
enableReinitialize: true,
validate,
onSubmit: values => {
// also tried adding
formik.setSubmitting(true);
//do stuff
}
})
但isSubmitting / isValidating
始終為假。我是否需要向validate
函數傳遞其他道具才能訪問這些值?
https://codesandbox.io/s/nervous-wescoff-cf2y1?file=/src/App.js
推薦答案
我認為validate
方法不適合向用戶顯示對話框。
您的用例看起來像是Formik庫中的一個定制需求。分享他們在內部提交表單時所做的工作-https://formik.org/docs/guides/form-submission。
您可以添加用于提交的自定義方法。
因此, 我已將您的沙盒分叉并進行了更新-https://codesandbox.io/s/custom-form-submit-stackoverflow-8znzf讓我知道你的想法。
編輯:添加代碼,以便即使鏈接過期,您仍可以知道如何操作
import React, { useState } from "react";
import "./styles.css";
import { useFormik } from "formik";
import Swal from "sweetalert2";
import "bootstrap/dist/css/bootstrap.min.css";
export default function App() {
const [item, setItem] = useState({
name: "",
email: ""
});
const validate = (values) => {
console.log("values: ", values);
const errors = {};
if (!values.name) {
errors.name = "Required";
}
return errors;
};
const initialValues = {
name: item.name,
email: item.email
};
const formik = useFormik({
initialValues,
enableReinitialize: true,
validate,
onSubmit: (values) => {
console.log("inside onSubmit", values);
}
});
const customSubmitHandler = (event) => {
event.preventDefault();
const touched = Object.keys(initialValues).reduce((result, item) => {
result[item] = true;
return result;
}, {});
// Touch all fields without running validations
formik.setTouched(touched, false);
formik.setSubmitting(true);
formik
.validateForm()
.then((formErrors) => {
if (Object.keys(formErrors).length > 0) {
Swal.fire({
icon: "success",
title: "Yes. . .",
text: "This one should fire if everything is working right",
footer:
"<div>Problems: " + Object.keys(formErrors).join(", ") + "</div>"
});
} else {
formik.handleSubmit(event);
}
formik.setSubmitting(false);
})
.catch((err) => {
formik.setSubmitting(false);
});
};
return (
<form id="campaignForm" onSubmit={customSubmitHandler}>
<div className="form-group">
<label htmlFor="name">Name</label>
<input
id="name"
type="text"
onChange={formik.handleChange}
value={formik.values.name}
className="form-control"
placeholder="Enter name"
/>
{formik.errors.name ? (
<div className="text-danger">{formik.errors.name}</div>
) : null}
</div>
<div className="form-group">
<label htmlFor="name">Email</label>
<input
id="name"
type="email"
onChange={formik.handleChange}
value={formik.values.email}
className="form-control"
placeholder="Enter email"
/>
{formik.errors.email ? (
<div className="text-danger">{formik.errors.email}</div>
) : null}
</div>
<div className="form-group">
<button className="btn btn-info" type="submit">
Submit
</button>
</div>
</form>
);
}
這篇關于Formik驗證正在提交/isValiating未設置為True的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!
查看全文