在导航中以 react-native 重置 formik 表单
Resetting a formik form in react-native on navigation
我正在尝试创建一个可以创建和编辑实体的 React Native 应用程序。
例如,用户。
我有一个包含名字和姓氏以及电子邮件地址的 formik 表格。
如果传递了用户参数,则表单应采用这些值。
但是,它只在第一次有效。之后,表单保留第一个值。
如何强制重新评估表单?
function FormScreen({ navigation, route }) {
const formikRef = React.createRef();
const initialValues = { firstName: "", lastName: "", email: "" };
if (route.params && route.params.user) {
if (route.params.user.firstName) {
initialValues.firstName = route.params.user.firstName;
}
if (route.params.user.lastName) {
initialValues.lastName = route.params.user.lastName;
}
if (route.params.user.email) {
initialValues.email = route.params.user.email;
}
}
const unsubscribeBlur = navigation.addListener("blur", (e) => {
console.log("form blur");
if (formikRef.current) {
console.log("form reset");
formikRef.current?.resetForm();
}
});
return (
<View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
<Formik
innerRef={formikRef}
initialValues={initialValues}
validationSchema={Yup.object({
firstName: Yup.string()
.max(15, "Must be 15 characters or less")
.required("Required"),
lastName: Yup.string()
.max(20, "Must be 20 characters or less")
.required("Required"),
email: Yup.string()
.email("Invalid email address")
.required("Required"),
})}
onSubmit={(values, { setSubmitting }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}, 400);
}}
>
<Form>
<label htmlFor="firstName">First Name</label>
<Field name="firstName" type="text" />
<ErrorMessage name="firstName" />
<label htmlFor="lastName">Last Name</label>
<Field name="lastName" type="text" />
<ErrorMessage name="lastName" />
<label htmlFor="email">Email Address</label>
<Field name="email" type="email" />
<ErrorMessage name="email" />
<button type="submit">Submit</button>
</Form>
</Formik>
</View>
);
}
export default FormScreen;
我有代码可以在模糊时重置表单,但重置似乎没有任何作用。
完整代码可以在点心找到。
https://snack.expo.io/@hackzilla/create-and-edit-with-formik
因为您使用的是标签导航器。当您在 them.So 之间切换时,主屏幕和表单屏幕不会重新安装 formik 不会按照您的方式加载新的 initialValues.In,您可以在每次表单屏幕为 focused.But 时使用路由参数重置表单更好的方法是使用堆栈导航器,每次使用新实例创建表单。
useFocusEffect(
React.useCallback(() => {
if (formikRef.current) {
console.log("form reset");
formikRef.current?.setValues(initialValues);
}
})
);
我们可以在提交后重置表单,这样它会清除所有字段。请尝试用下面提到的代码替换您的提交方法。
onSubmit={(values, { setSubmitting, resetForm }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
// reset the fields after submit
resetForm();
}, 400);
}}
我正在尝试创建一个可以创建和编辑实体的 React Native 应用程序。
例如,用户。
我有一个包含名字和姓氏以及电子邮件地址的 formik 表格。 如果传递了用户参数,则表单应采用这些值。
但是,它只在第一次有效。之后,表单保留第一个值。
如何强制重新评估表单?
function FormScreen({ navigation, route }) {
const formikRef = React.createRef();
const initialValues = { firstName: "", lastName: "", email: "" };
if (route.params && route.params.user) {
if (route.params.user.firstName) {
initialValues.firstName = route.params.user.firstName;
}
if (route.params.user.lastName) {
initialValues.lastName = route.params.user.lastName;
}
if (route.params.user.email) {
initialValues.email = route.params.user.email;
}
}
const unsubscribeBlur = navigation.addListener("blur", (e) => {
console.log("form blur");
if (formikRef.current) {
console.log("form reset");
formikRef.current?.resetForm();
}
});
return (
<View style={{ flex: 1, alignItems: "center", justifyContent: "center" }}>
<Formik
innerRef={formikRef}
initialValues={initialValues}
validationSchema={Yup.object({
firstName: Yup.string()
.max(15, "Must be 15 characters or less")
.required("Required"),
lastName: Yup.string()
.max(20, "Must be 20 characters or less")
.required("Required"),
email: Yup.string()
.email("Invalid email address")
.required("Required"),
})}
onSubmit={(values, { setSubmitting }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
}, 400);
}}
>
<Form>
<label htmlFor="firstName">First Name</label>
<Field name="firstName" type="text" />
<ErrorMessage name="firstName" />
<label htmlFor="lastName">Last Name</label>
<Field name="lastName" type="text" />
<ErrorMessage name="lastName" />
<label htmlFor="email">Email Address</label>
<Field name="email" type="email" />
<ErrorMessage name="email" />
<button type="submit">Submit</button>
</Form>
</Formik>
</View>
);
}
export default FormScreen;
我有代码可以在模糊时重置表单,但重置似乎没有任何作用。
完整代码可以在点心找到。 https://snack.expo.io/@hackzilla/create-and-edit-with-formik
因为您使用的是标签导航器。当您在 them.So 之间切换时,主屏幕和表单屏幕不会重新安装 formik 不会按照您的方式加载新的 initialValues.In,您可以在每次表单屏幕为 focused.But 时使用路由参数重置表单更好的方法是使用堆栈导航器,每次使用新实例创建表单。
useFocusEffect(
React.useCallback(() => {
if (formikRef.current) {
console.log("form reset");
formikRef.current?.setValues(initialValues);
}
})
);
我们可以在提交后重置表单,这样它会清除所有字段。请尝试用下面提到的代码替换您的提交方法。
onSubmit={(values, { setSubmitting, resetForm }) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
setSubmitting(false);
// reset the fields after submit
resetForm();
}, 400);
}}