Skip to content
Advertisement

Fields in Formik (validated on Yup) are constantly displaying an error as if they are empty or invalid. find codesandbox-link attached below

 const updateCreateFormField = (e) => {
    const { name, value } = e.target;
    
    setCreatForm({
      ...createForm,
      [name]: value,
    })

    console.log({ name, value });
  };  

//The onChange variable in the fields is updated on the above code. I am unable to find the solution towards making the below fields function properly. I tried using formik’s setFieldValue however It didn’t work

    const formik = useFormik({
    initialValues: {
      Name: "",
      Address: "",
      phoneNumber: "",
      Email: "",
    }
  })

The below code is the return function:

    return (<div className="App">
         
    {updateForm._id && (<div>
      <h2>Update Customer:</h2>
      <Box height={20} />
      <Formik initialValues={formik.initialValues}
        validationSchema={object({
          Name: string().required("Please enter a name").min(3, "Name is too short"),
          Address: string().required("Please enter an address").min(3, "Address is too short"),
          phoneNumber: number().required("Please enter a phone number").min(4, "Phone number is too short"),
          Email: string().required("Please enter an email").email("Invalid email"),
        })}
        onSubmit={(values, formikHelpers) => {
          console.log(values);
          formikHelpers.resetForm();
        }}
      >

        {({ errors, isValid, touched, dirty }) => (
          <Form onSubmit={updateCustomer}>

            <Field name="Name" type="name" as={TextField} variant="outlined" color="primary" label="Name" fullWidth
              onChange={handleUpdateFieldChange}
              value={updateForm.Name}
              error={Boolean(errors.Name) && Boolean(touched.Name)}
              helperText={Boolean(touched.Name) && errors.Name}
            />
            <Box height={14} />
            <Field name="Address" type="Address" as={TextField} variant="outlined" color="primary" label="Address" fullWidth
              onChange={handleUpdateFieldChange}
              value={updateForm.Address}
              error={Boolean(errors.Address) && Boolean(touched.Address)}
              helperText={Boolean(touched.Address) && errors.Address}
            />
            <Box height={14} />
            <Field name="phoneNumber" type="number" as={TextField} variant="outlined" color="primary" label="Phone Number" fullWidth
              error={Boolean(errors.phoneNumber) && Boolean(touched.phoneNumber)}
              helperText={Boolean(touched.phoneNumber) && errors.phoneNumber}
              onChange={handleUpdateFieldChange}
              value={updateForm.phoneNumber}
            />
            <Box height={14} />
            <Field name="Email" type="email" as={TextField} variant="outlined" color="primary" label="Email" fullWidth
              error={Boolean(errors.Email) && Boolean(touched.Email)}
              helperText={Boolean(touched.Email) && errors.Email}
              onChange={handleUpdateFieldChange}
              value={updateForm.Email}
            />
            <Box height={16} />
            <Button type="submit" variant="contained" color="primary" size="large" disabled={!dirty || !isValid} >Update Customer</Button>
          </Form>
        )}
      </Formik>
    </div>)}

    {!updateForm._id && <div>
      <h2>Create Customer:</h2>
      <Box height={20} />
      <Formik initialValues={formik.initialValues}
        validationSchema={object({
          Name: string().required("Please enter a name").min(3, "Name is too short"),
          Address: string().required("Please enter an address").min(3, "Address is too short"),
          phoneNumber: number().required("Please enter a phone number").min(4, "Phone number is too short"),
          Email: string().required("Please enter an email").email("Invalid email"),
        })}
        onSubmit={(values, formikHelpers) => {
          console.log(values);
          formikHelpers.resetForm();
        }}
      >

        {({ setFieldValue, errors, isValid, touched, dirty,handleBlur,handleSubmit}) => (
          <Form onSubmit={createCustomer} >

            <Field as={TextField} name="Name" type="name" variant="outlined" color="primary" label="Name" fullWidth
              onChange={updateCreateFormField} value={createForm.Name}
              error={Boolean(errors.Name) && Boolean(touched.Name)}
              helperText={Boolean(touched.Name) && errors.Name}
            />
            <Box height={14} />
            <Field name="Address" type="Address" as={TextField} variant="outlined" color="primary" label="Address" fullWidth
              error={Boolean(errors.Address) && Boolean(touched.Address)}
              helperText={Boolean(touched.Address) && errors.Address}
              onChange={updateCreateFormField} value={createForm.Address}
            />
            <Box height={14} />
            <Field name="phoneNumber" type="number" as={TextField} variant="outlined" color="primary" label="Phone Number" fullWidth
              error={Boolean(errors.phoneNumber) && Boolean(touched.phoneNumber)}
              helperText={Boolean(touched.phoneNumber) && errors.phoneNumber}
              onChange={updateCreateFormField}
              value={createForm.phoneNumber}
            />
            <Box height={14} />
            <Field name="Email" type="email" as={TextField} variant="outlined" color="primary" label="Email" fullWidth
              error={Boolean(errors.Email) && Boolean(touched.Email)}
              helperText={Boolean(touched.Email) && errors.Email}
              onChange={updateCreateFormField}
              value={createForm.Email}
            />
            <Box height={16} />
            <Button type="submit" variant="contained" color="primary" size="large" disabled={!dirty || !isValid} >Create Customer</Button>
          </Form>
        )}


      </Formik>
    </div>}

    <Box height={40} />

  </div>
  )

Sandbox

Advertisement

Answer

Simply use Formik’s handleChange event and values. You don’t need to create custom functions or states to change values.

Working example here

Also, if you want to have custom function to have inside onChange you can use formik’s setFieldValue.

More information related to formik events https://formik.org/docs/api/formik

User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement