TypeError: schema[sync ? 'validateSync' : 'validate'] is not a function
TypeError: schema[sync ? 'validateSync' : 'validate'] is not a function
我正在尝试使用 Formik 和 Yup 验证 material ui 表单,但出现错误。
这是我从另一个文件导入的架构。
export const schema = Yup.object({
email: Yup.string()
.email('Invalid Email')
.required('This Field is Required'),
});
这是我使用验证的地方。
如果我写 validation = schema
它没有给出错误,但也没有验证。如果我将其更改为 {schema}
,应用程序就会崩溃。
export default function RemoveUserPage() {
const [isSubmitted, setIsSubmitted] = useState(false);
const [isRemoved, setIsRemoved] = useState(false);
const [errorMessage, setErrorMessage] = useState('');
const [removeUser] = useMutation(REMOVE_USER);
let submitForm = (email: string) => {
setIsSubmitted(true);
removeUser({
variables: {
email: email,
},
})
};
const formik = useFormik({
initialValues:{ email: '' },
onSubmit:(values, actions) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
actions.setSubmitting(false);
}, 1000);
},
validationSchema:{schema}
})
const handleChange = (e: ChangeEvent<HTMLInputElement>)=>{
const {name,value} = e.target;
formik.setFieldValue(name,value);
}
return (
<div>
<Form
onSubmit={e => {
e.preventDefault();
submitForm(formik.values.email);
}}>
<div>
<TextField
variant="outlined"
margin="normal"
id="email"
name="email"
helperText={formik.touched.email ? formik.errors.email : ''}
error={formik.touched.email && Boolean(formik.errors.email)}
label="Email"
value={formik.values.email}
//onChange={change.bind(null, 'email')}
onChange={formik.handleChange}
/>
<br></br>
<CustomButton
disabled={!formik.values.email}
text={'Remove User'}
/>
</div>
</Form>
</div>
);
}
此外,我还想在按钮的 disabled
中传递 isValid!
条件,但我不知道该怎么做。我得到它是因为我可以将它写在道具中但不确定如何在 useFormik() 中使用它。
此外,当我提交表单时,文本字段不会自动重置。我该如何解决?
错误:
TypeError: schema[sync ? 'validateSync' : 'validate'] is not a function. (In 'schema[sync ? 'validateSync' : 'validate'](validateData, {
abortEarly: false,
context: context
})', 'schema[sync ? 'validateSync' : 'validate']' is undefined)
早些时候,我使用的是<Formik>
。在这种情况下,验证是在我打字时完成的,例如,如果我写 'hfs' 它会在我打字时立即告诉我无效的电子邮件。但是,使用 useFormik(根据下面的答案),只有在我提交表单后它才会说电子邮件无效。我不想发生这种情况,因为一旦提交了表单,也会调用突变。我想将验证分开。这是我之前使用的
export default function RemoveUserPage() {
const [isSubmitted, setIsSubmitted] = useState(false);
const [isRemoved, setIsRemoved] = useState(false);
const [errorMessage, setErrorMessage] = useState('');
const [removeUser] = useMutation<DeleteUserResponse>(REMOVE_USER);
let submitForm = (email: string) => {
setIsSubmitted(true);
removeUser({
variables: {
email: email,
},
})
.then(({ data }: ExecutionResult<DeleteUserResponse>) => {
if (data !== null && data !== undefined) {
setIsRemoved(true);
}
})
};
return (
<div>
<Formik
initialValues={{ email: '' }}
onSubmit={(values, actions) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
actions.setSubmitting(false);
}, 1000);
}}
validationSchema={schema}>
{props => {
const {
values: { email },
errors,
touched,
handleChange,
isValid,
setFieldTouched,
} = props;
const change = (name: string, e: FormEvent) => {
e.persist();
handleChange(e);
setFieldTouched(name, true, false);
};
return (
<Wrapper>
<Form
onSubmit={e => {
e.preventDefault();
submitForm(email);
}}>
<div>
<TextField
variant="outlined"
margin="normal"
id="email"
name="email"
helperText={touched.email ? errors.email : ''}
error={touched.email && Boolean(errors.email)}
label="Email"
value={email}
onChange={change.bind(null, 'email')}
/>
<br></br>
<CustomButton
disabled={!isValid || !email}
text={'Remove User'}
/>
</div>
</Form>
);
}}
</Formik>
</div>
);
}
应该是 validationSchema: schema 而不是 {schema}
不生效的原因是你没有使用formik的handleSubmit
useFormik({
initialValues:{ email: '' },
onSubmit:(values, actions) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
actions.setSubmitting(false);
}, 1000);
},
validationSchema: schema
})
...
<Form onSubmit={formik.handleSubmit}>
...
<CustomButton
disabled={formik.touched.email && formik.errors.email ? true : false}
text={'Remove User'}
/>
...
</Form>
它应该使用 formik 的 handleSubmit 来获取您在 validationSchema 上定义的验证
同时将 formik.touched.email && formik.errors.email 传递给按钮的 disabled 属性。
根据您的要求,要在您输入时验证该字段,您应该按照以下步骤操作:
<TextField
variant="outlined"
margin="normal"
id="email"
name="email"
helperText={formik.touched.email ? formik.errors.email : ""}
error={formik.touched.email && Boolean(formik.errors.email)}
label="Email"
value={formik.values.email}
onChange={props => {
formik.handleChange(props);
formik.handleBlur(props);
}}
onBlur={formik.handleBlur}
/>
我正在尝试使用 Formik 和 Yup 验证 material ui 表单,但出现错误。
这是我从另一个文件导入的架构。
export const schema = Yup.object({
email: Yup.string()
.email('Invalid Email')
.required('This Field is Required'),
});
这是我使用验证的地方。
如果我写 validation = schema
它没有给出错误,但也没有验证。如果我将其更改为 {schema}
,应用程序就会崩溃。
export default function RemoveUserPage() {
const [isSubmitted, setIsSubmitted] = useState(false);
const [isRemoved, setIsRemoved] = useState(false);
const [errorMessage, setErrorMessage] = useState('');
const [removeUser] = useMutation(REMOVE_USER);
let submitForm = (email: string) => {
setIsSubmitted(true);
removeUser({
variables: {
email: email,
},
})
};
const formik = useFormik({
initialValues:{ email: '' },
onSubmit:(values, actions) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
actions.setSubmitting(false);
}, 1000);
},
validationSchema:{schema}
})
const handleChange = (e: ChangeEvent<HTMLInputElement>)=>{
const {name,value} = e.target;
formik.setFieldValue(name,value);
}
return (
<div>
<Form
onSubmit={e => {
e.preventDefault();
submitForm(formik.values.email);
}}>
<div>
<TextField
variant="outlined"
margin="normal"
id="email"
name="email"
helperText={formik.touched.email ? formik.errors.email : ''}
error={formik.touched.email && Boolean(formik.errors.email)}
label="Email"
value={formik.values.email}
//onChange={change.bind(null, 'email')}
onChange={formik.handleChange}
/>
<br></br>
<CustomButton
disabled={!formik.values.email}
text={'Remove User'}
/>
</div>
</Form>
</div>
);
}
此外,我还想在按钮的 disabled
中传递 isValid!
条件,但我不知道该怎么做。我得到它是因为我可以将它写在道具中但不确定如何在 useFormik() 中使用它。
此外,当我提交表单时,文本字段不会自动重置。我该如何解决?
错误:
TypeError: schema[sync ? 'validateSync' : 'validate'] is not a function. (In 'schema[sync ? 'validateSync' : 'validate'](validateData, {
abortEarly: false,
context: context
})', 'schema[sync ? 'validateSync' : 'validate']' is undefined)
早些时候,我使用的是<Formik>
。在这种情况下,验证是在我打字时完成的,例如,如果我写 'hfs' 它会在我打字时立即告诉我无效的电子邮件。但是,使用 useFormik(根据下面的答案),只有在我提交表单后它才会说电子邮件无效。我不想发生这种情况,因为一旦提交了表单,也会调用突变。我想将验证分开。这是我之前使用的
export default function RemoveUserPage() {
const [isSubmitted, setIsSubmitted] = useState(false);
const [isRemoved, setIsRemoved] = useState(false);
const [errorMessage, setErrorMessage] = useState('');
const [removeUser] = useMutation<DeleteUserResponse>(REMOVE_USER);
let submitForm = (email: string) => {
setIsSubmitted(true);
removeUser({
variables: {
email: email,
},
})
.then(({ data }: ExecutionResult<DeleteUserResponse>) => {
if (data !== null && data !== undefined) {
setIsRemoved(true);
}
})
};
return (
<div>
<Formik
initialValues={{ email: '' }}
onSubmit={(values, actions) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
actions.setSubmitting(false);
}, 1000);
}}
validationSchema={schema}>
{props => {
const {
values: { email },
errors,
touched,
handleChange,
isValid,
setFieldTouched,
} = props;
const change = (name: string, e: FormEvent) => {
e.persist();
handleChange(e);
setFieldTouched(name, true, false);
};
return (
<Wrapper>
<Form
onSubmit={e => {
e.preventDefault();
submitForm(email);
}}>
<div>
<TextField
variant="outlined"
margin="normal"
id="email"
name="email"
helperText={touched.email ? errors.email : ''}
error={touched.email && Boolean(errors.email)}
label="Email"
value={email}
onChange={change.bind(null, 'email')}
/>
<br></br>
<CustomButton
disabled={!isValid || !email}
text={'Remove User'}
/>
</div>
</Form>
);
}}
</Formik>
</div>
);
}
应该是 validationSchema: schema 而不是 {schema}
不生效的原因是你没有使用formik的handleSubmit
useFormik({
initialValues:{ email: '' },
onSubmit:(values, actions) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
actions.setSubmitting(false);
}, 1000);
},
validationSchema: schema
})
...
<Form onSubmit={formik.handleSubmit}>
...
<CustomButton
disabled={formik.touched.email && formik.errors.email ? true : false}
text={'Remove User'}
/>
...
</Form>
它应该使用 formik 的 handleSubmit 来获取您在 validationSchema 上定义的验证
同时将 formik.touched.email && formik.errors.email 传递给按钮的 disabled 属性。
根据您的要求,要在您输入时验证该字段,您应该按照以下步骤操作:
<TextField
variant="outlined"
margin="normal"
id="email"
name="email"
helperText={formik.touched.email ? formik.errors.email : ""}
error={formik.touched.email && Boolean(formik.errors.email)}
label="Email"
value={formik.values.email}
onChange={props => {
formik.handleChange(props);
formik.handleBlur(props);
}}
onBlur={formik.handleBlur}
/>