提交时如何获取Formik initialValues?

时间:2020-10-19 06:56:59

标签: reactjs formik

我是Formik的新手,不确定如何在提交处理程序中访问initialValues,以便在提交之前将其与values进行比较。

如果有人可以在下面的基本Formik示例中演示如何完成此操作,

const Basic = () => (
  <div>
    <h1>Sign Up</h1>
    <Formik
      initialValues={{
        firstName: '',
        lastName: '',
        email: '',
      }}
      onSubmit={async (values) => {
        await new Promise((r) => setTimeout(r, 500));
        // GET initialValues HERE... 
        alert(JSON.stringify(values, null, 2));
      }}
    >
      <Form>
        <label htmlFor="firstName">First Name</label>
        <Field id="firstName" name="firstName" placeholder="Jane" />

        <label htmlFor="lastName">Last Name</label>
        <Field id="lastName" name="lastName" placeholder="Doe" />

        <label htmlFor="email">Email</label>
        <Field
          id="email"
          name="email"
          placeholder="jane@acme.com"
          type="email"
        />
        <button type="submit">Submit</button>
      </Form>
    </Formik>
  </div>
);

ReactDOM.render(<Basic />, document.getElementById('root'));

我知道那里有一些线程解释如何使用HOC等进行操作,例如https://medium.com/@MelkorNemesis/how-to-check-if-formik-values-have-changed-on-submit-2c6ee89992ec,但是我的React知识不足以将其转换为上面的基本功能。 FWIW我也认为在Formik文档中将其作为示例似乎是很常见的用例。

1 个答案:

答案 0 :(得分:1)

您可以在组件内部声明一个对象,并将其传递给Formik initialValues 属性。

const Basic = () => {
  const initialValues = {
    firstName: '',
    lastName: '',
    email: '',
  };
  return (
    <div>
      <h1>Sign Up</h1>
      <Formik
        initialValues={initialValues}
        onSubmit={async (values) => {
          // compare initialValues and values here
        }}
      >
        <Form>
          <label htmlFor="firstName">First Name</label>
          <Field id="firstName" name="firstName" placeholder="Jane" />

          <label htmlFor="lastName">Last Name</label>
          <Field id="lastName" name="lastName" placeholder="Doe" />

          <label htmlFor="email">Email</label>
          <Field
            id="email"
            name="email"
            placeholder="jane@acme.com"
            type="email"
          />
          <button type="submit">Submit</button>
        </Form>
      </Formik>
    </div>
  );
};

ReactDOM.render(<Basic />, document.getElementById('root'));