在导航中以 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);
        }}