我是react/next js和formik & Yup的新手。我想调用一些数据库的输入字段模糊的API,这将带来一些数据,检查数据库级别的验证,并为下一个输入字段带来相应的数据。但它不起作用。在改变输入字段的onblur事件时,不调用验证功能。它只是调用handleAcNameExists()函数。我使用了handleBlur('accName');调用以进行验证,但不起作用。
这是我代码。
import CustomerDTO from "@/types/CustomerDTO";
import CustomerService from "@/service/CustomerService";
import { useState } from "react";
import { toast } from 'react-toastify';
import 'react-toastify/dist/ReactToastify.css';
import { useFormik } from "formik";
import { CustomerSchema } from "@/schemas";
type AnotherComponentProps = {
onToggle: () => void;
};
const Edit = ({onToggle}:AnotherComponentProps) => {
const [customerData, setCustomerData] = useState<CustomerDTO>({
accId:0,
accName: '',
address: '',
gstNo: '',
mobNo: '',
oppBal: '',
balType: '',
eId: '',
panNo: '',
creditLimit: ''
});
const { values, errors, touched, handleBlur, handleChange, handleSubmit } =
useFormik({
initialValues : customerData,
validationSchema: CustomerSchema,
onSubmit: async (values, action) => {
console.log(
"values ",
values
);
console.log(
" customerData ",
customerData
);
const status = await CustomerService.saveCustomer(values)
console.log('status '+status);
if(status === true)
{
toast.success('Customer Saved.!');
}
action.resetForm();
},
});
const handleAcNameExists = () => {
// Api call and other logic
console.log('in handleAcNameExists');
handleBlur('accName');
};
return (
<div>
<h3>Edit Customers </h3>
<form onSubmit={handleSubmit}>
<div className="row">
<div className="col-sm-4 mb-3">
<label htmlFor="accName" className="form-label">Customer Name:</label>
<input
type="text"
id="accName"
name="accName"
className="form-control"
value={values.accName}
onChange={handleChange}
onBlur={handleAcNameExists}
autoFocus
/>
{touched.accName && errors.accName && (
<div className="error">{errors.accName}</div>
)}
</div>
<div className="col-sm-4 mb-3">
<label htmlFor="address" className="form-label">Customer Address:</label>
<input
type="text"
id="address"
name="address"
value={values.address}
onChange={handleChange}
onBlur={handleBlur}
className="form-control"
/>
{touched.address && errors.address && (
<div className="error">{errors.address}</div>
)}
</div>
<div className="col-sm-4 mb-3">
<label htmlFor="gstNo" className="form-label">GST No:</label>
<input
type="text"
id="gstNo"
name="gstNo"
value={values.gstNo}
onChange={handleChange}
onBlur={handleBlur}
className="form-control"
/>
</div>
</div>
<div className="row">
<div className="col-sm-4 mb-3">
<label htmlFor="mobNo" className="form-label">Mobile Number:</label>
<input
type="text"
id="mobNo"
name="mobNo"
value={values.mobNo}
onChange={handleChange}
onBlur={handleBlur}
className="form-control"
/>
</div>
<div className="col-sm-4 mb-3">
<label htmlFor="oppBal" className="form-label">Opening Balance:</label>
<input
type="text"
id="oppBal"
name="oppBal"
value={values.oppBal}
onChange={handleChange}
onBlur={handleBlur}
className="form-control"
/>
</div>
<div className="col-sm-4 mb-3">
<label htmlFor="balType" className="form-label">Balance Type:</label>
<select
id="balType"
name="balType"
value={values.balType}
onChange={handleChange}
onBlur={handleBlur}
className="form-select"
>
<option value="Dr">Debit</option>
<option value="Cr">Credit</option>
</select>
</div>
</div>
<div className="row">
<div className="col-sm-4 mb-3">
<label htmlFor="creditLimit" className="form-label">Credit Limit:</label>
<input
type="text"
id="creditLimit"
name="creditLimit"
value={values.creditLimit}
onChange={handleChange}
onBlur={handleBlur}
className="form-control"
/>
</div>
</div>
<div className="row">
<div className="col-sm-6">
<button type="submit" className="btn btn-primary">Save</button>
</div>
<div className="col-sm-6">
<button className="btn btn-primary" onClick={onToggle} >
Show
</button>
</div>
</div>
</form>
</div>
)
}
export default Edit
字符串
)}
导出默认值编辑
1条答案
按热度按时间slmsl1lt1#
如果我没有理解错的话,我相信你打算在
blur
事件上做一些逻辑。你可以通过将你想要的函数传递给onBlur
prop来实现。但你应该注意到,现在你必须手动设置输入的“触摸程度”(如果那甚至是一个单词)。这是通过调用Formik的setFieldTouched
函数来完成的。在这里了解语法。我想你是新来的Formik你不知道领域被感动。该状态确定是否应显示错误消息。我想这就是你的问题所在。你的田地没有被适当地触动。你也可以在这里找到更多关于here的信息。