Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

172
Visualizações
Validation using Yup with key

So I'm trying to validate my form using the Yup package, there is a function createForm to create a form which creates a form with unique ID, and then that ID is pass to fields for every form which is created. I'm trying to validate those fields for each form created but I'm failing to validate those inputs with the unique id present. Here is the code :

import { nanoid } from 'nanoid';

const AddContact = () => {
  const [formData, setFormData] = useState([{key: nanoid()}])

    const createForm = () => {
      setFormData(prevFormData => [...prevFormData, {key: nanoid()}])
    }

   const deleteForm = (key) => {
      setFormData(prevFormData => prevFormData.filter(item => item.key !== key))
    }

return(
<Formik
      initialValues={{}}
      validationSchema={
      formData.map(data => {
         Yup.object().shape({
           [`name_${data.key}`]: Yup.string().required("Please enter a valid name"),
           [`company_${data.key}`]: Yup.string().required("Please enter a Company name"),
           [`mobile_no_${data.key}`]: Yup.number().typeError("Please enter a valid mobile number"),
           [`email_${data.key}`]: Yup.string().email().required("Please enter a valid email"),
         })
       })
     }
       //onSubmit={onSubmit}
>
 {({ handleSubmit, values }) => {
       return(
            <div>
              {formData.map((data, index) => {
               return(
               <button onClick={() => deleteForm(data.key)}}>
               <input name={`name_${data.key}`}>
               <input name={`company_${data.key}`}>
               <input name={`mobile_no_${data.key}`}>
               <input name={`email_${data.key}`}>
              )})}
              <button onClick={createForm}/>
            </div>
     )
}}


about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Try this code: I have created validationSchema from formData and it is working fine as it shows errors and values at the bottom of the form right now.

import React, { useState } from "react";
import { Formik } from "formik";
import { nanoid } from "nanoid";
import * as Yup from "yup";

const AddContact = () => {
  const [formData, setFormData] = useState([{ key: nanoid() }]);

  const createForm = () => {
    setFormData((prevFormData) => [...prevFormData, { key: nanoid() }]);
  };

  const deleteForm = (key) => {
    setFormData((prevFormData) =>
      prevFormData.filter((item) => item.key !== key)
    );
  };

  const validationSchema = {
    ...formData.reduce((result, data) => {
      result = {
        ...result,
        [`name_${data.key}`]: Yup.string().required(
          "Please enter a valid name"
        ),
        [`company_${data.key}`]: Yup.string().required(
          "Please enter a Company name"
        ),
        [`mobile_no_${data.key}`]: Yup.number().typeError(
          "Please enter a valid mobile number"
        ),
        [`email_${data.key}`]: Yup.string()
          .email()
          .required("Please enter a valid email")
      };
      return result;
    }, {})
  };

  return (
    <Formik
      initialValues={{}}
      validationSchema={Yup.object().shape(validationSchema)}
    >
      {({ handleSubmit, values, errors, handleChange }) => {
        return (
          <div>
            {formData.map((data, index) => (
              <div key={index} style={{ margin: 10 }}>
                <button onClick={() => deleteForm(data.key)}>Delete</button>
                <input name={`name_${data.key}`} onChange={handleChange} />
                <input name={`company_${data.key}`} onChange={handleChange} />
                <input name={`mobile_no_${data.key}`} onChange={handleChange} />
                <input name={`email_${data.key}`} onChange={handleChange} />
              </div>
            ))}
            <button onClick={createForm} style={{ margin: 10 }}>
              Create Form
            </button>
            <button type="submit" onClick={handleSubmit}>
              Submit
            </button>
            {errors && (
              <div>
                <div>ERRORS: {JSON.stringify(errors)}</div>
                <div>VALUES: {JSON.stringify(values)}</div>
              </div>
            )}
          </div>
        );
      }}
    </Formik>
  );
};

export default AddContact;
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda