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

368
Visualizações
¿Cómo obtengo varios archivos en useState en React (Next.js)?

Primero, revisa mi código.

¡Puede haber alguna falta de ortografía! (Reescribí mi código)

 const test = () => { const [files, setFiles] = useState([]); const handleFile = (e) => { for(let i=0; i<e.target.files.length; i++){ setFiles([...files, e.target.files[i] } } return ( { files.map((file, index) => ( <div key={index}> <p> {file[index].name} </p> <button> Delete </button> </div> )) } <label onChange={handleFile}> <input type='file' mutiple /> Attach File </label> ) }

Cuando renderizo con este código, comete errores,

TypeError: no se pueden leer las propiedades de undefined (leyendo 'nombre')

{archivo[índice].nombre}

como esto.

Cuando elimino .name, solo se representan los botones. (ya que no especifiqué qué renderizar de la propiedad del archivo).

Además, estoy tratando de renderizar varios archivos a la vez. Como configuro mi tipo de entrada como múltiple , puedo seleccionar varios archivos cuando elijo cargar cosas.

Sin embargo, aunque seleccioné dos o tres, solo muestra uno.

Espero que mi explicación describa bien mi situación. Si tiene alguna pregunta, ¡pregúnteme!

¡Tengo ganas de oír de usted!

about 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Si actualiza el mismo estado varias veces en la misma función de controlador, solo la última llamada funcionará por problemas de rendimiento. Tienes que cambiar tu controlador onChange a algo como:

 const handleFile = (e) => { const newFiles = [] for(let i = 0; i < e.target.files.length; i++){ newFiles.push(e.target.files[i]) } setFiles(newFiles) }

también como se menciona en otra respuesta, cambie la línea "nombre" a esto:

 <p>{file.name}</p>
about 4 years ago · Santiago Trujillo Relatório

0

Para cualquiera que tenga el mismo problema que yo, aquí hay una solución provisional.

 const [files, setFiles] = useState([]); const handleFile = (e) => { setFiles([...files, e.target.files[0], e.target.files[1], e.target.files[2]]) if(e.target.files[1] == null) { setFiles([...files, e.target.files[0]]) } if (e.target.files[1] && e.target.files[2] == null) { setFiles([...files, e.target.files[0], e.target.files[1]]) } };

Usando la declaración condicional, puede controlar el índice de archivos. Sin embargo, todavía no sé cuál es la otra forma de lidiar con el problema.

De todos modos, ¡espero que mi respuesta te ayude un poco!

about 4 years ago · Santiago Trujillo Relatório

0

No estoy seguro de si me estoy perdiendo algo, pero creo que hacer un bucle como este es redundante cuando, en cambio, simplemente puede hacer

 const handleFile = (e) => { setFiles(e.target.files) }

Además, cuando desee acceder al valor del estado anterior, probablemente debería acceder al valor del estado anterior mediante una función de devolución de llamada dentro de setFiles como este

 for(let i=0; i<e.target.files.length; i++){ setFiles((prevfiles)=>[...prevFiles,e.target.files[i]]) }

EDITAR: también menciono una solución que no está incluida en la respuesta original, ya que @Matt ya la había declarado en el momento de la publicación. Estoy editando esta respuesta solo con el fin de proporcionar la respuesta completa

file[index].name tuvo que ser cambiado a file.name

about 4 years ago · Santiago Trujillo 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