Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

78
Vistas
Manejo de un número desconocido de entradas en React

Estoy creando un elemento de reacción que permite a los usuarios enviar correos electrónicos a amigos/familiares. El elemento tiene por defecto 3 campos de entrada; sin embargo, el usuario puede hacer clic en un botón para agregar campos de entrada adicionales.

Mi idea para construir este componente es tener un botón que incremente un contador y luego usar ese valor de contador para ejecutar un ciclo y agregar elementos a una matriz.

 <button onClick={handleAddEmail}> Add email </button> function handleAddEmail() { setNumberOfEmails(numberOfEmails + 1); }

Ahora, para que esto funcione, necesito un gancho NumberOfEmails . Este enlace se inicializará con los tres primeros campos de entrada.

 const [numberOfEmails, setNumberOfEmails] = useState(3);

Además, hay un gancho inviteEmails para manejar el estado de cada entrada.

 const [inviteEmails, setInviteEmails] = useState([])

Todas estas entradas deben representarse en una función:

 function renderEmailFields() { const emailContainer = [ <input value={inviteEmails[0]} onChange={(e) => handleEmailChange(0, e)} placeholder="Enter email here..." />, <input value={inviteEmails[1]} onChange={(e) => handleEmailChange(1, e)} placeholder="Enter email here..." />, <input value={inviteEmails[2]} onChange={(e) => handleEmailChange(2, e)} placeholder="Enter email here..." />]; for (let i = 3; i < numberOfEmails; i++) { emailContainer.push( <input value={inviteEmails[i]} onChange={(e) => handleEmailChange(i, e)} placeholder="New email..." /> ); } return emailContainer;

El código que tengo arriba está cerca de funcionar, sin embargo, agregar un nuevo campo de entrada hace que las entradas anteriores se bloqueen y no se puedan editar.

Cualquier consejo sería apreciado.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Realmente no necesita un segundo átomo de estado para la cantidad de entradas si me pregunta.

Vea CodeSandbox en vivo aquí .

  • useCallback y la magia del dataset de datos hacen que no necesite una función de controlador onClick separada para cada entrada.
  • .filter(Boolean) elimina todos los valores falsos; las cadenas vacías son falsas.
  • Por el gusto de hacerlo, esto también le permite eliminar elementos de la matriz.
 function App() { const [inviteEmails, setInviteEmails] = React.useState(["", "", ""]); const handleEmailChange = React.useCallback((event) => { const index = parseInt(event.target.dataset.index, 10); setInviteEmails((inviteEmails) => { const newInviteEmails = [...inviteEmails]; newInviteEmails[index] = event.target.value; return newInviteEmails; }); }, []); const removeEmail = React.useCallback((event) => { const index = parseInt(event.target.dataset.index, 10); setInviteEmails((inviteEmails) => { const newInviteEmails = [...inviteEmails]; newInviteEmails.splice(index, 1); return newInviteEmails; }); }, []); const addEmail = React.useCallback( () => setInviteEmails((inviteEmails) => [...inviteEmails, ""]), [] ); return ( <div> {inviteEmails.map((email, index) => ( <div key={index}> <input value={email} data-index={index} onChange={handleEmailChange} placeholder="Enter email here..." /> <button onClick={removeEmail} data-index={index}> &times; </button> </div> ))} <button onClick={addEmail}>Add email</button> <pre>{JSON.stringify(inviteEmails.filter(Boolean), null, 2)}</pre> </div> ); }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda