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

227
Visualizações
¿Por qué useState no activa la re-renderización?

He inicializado un estado que es una matriz, y cuando lo actualizo, mi componente no se vuelve a procesar. Aquí hay una prueba de concepto mínima:

 function App() { const [numbers, setNumbers] = React.useState([0, 1, 2, 3]); console.log("rendering..."); return ( <div className="App"> {numbers.map(number => ( <p>{number}</p> ))} <input type="text" value={numbers[0].toString()} onChange={newText => { let old = numbers; old[0] = 1; setNumbers(old); }} /> </div> ); }

Según este código, parece que la entrada debe contener el número 0 para comenzar, y cada vez que se cambia, el estado también debe cambiar. Después de ingresar "02" en la entrada, el componente de la aplicación no se vuelve a procesar. Sin embargo, si agrego un setTimeout en la función onChange que se ejecuta después de 5 segundos, muestra que los números se han actualizado.

¿Alguna idea de por qué el componente no se actualiza?

Aquí hay un CodeSandbox con la prueba de concepto.

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

0

Está llamando a setNumbers y pasándole la matriz que ya tiene. Ha cambiado uno de sus valores, pero sigue siendo la misma matriz, y sospecho que React no ve ninguna razón para volver a renderizar porque el estado no ha cambiado; la nueva matriz es la matriz anterior.

Una forma sencilla de evitar esto es distribuir la matriz en una nueva matriz:

 setNumbers([...old])
over 4 years ago · Santiago Trujillo Relatório

0

Necesitas copiar numbers como let old = [...numbers];

useState no actualiza el valor solo si ha cambiado, por lo que si era 44 y se convirtió en 7 , se actualizará. pero ¿cómo puede saber si una matriz u objeto ha cambiado? es por referencia, por lo que cuando let old = numbers solo estás pasando una referencia y no creando una nueva

over 4 years ago · Santiago Trujillo Relatório

0

Otros ya han dado la solución técnica. Para cualquier persona confundida sobre por qué sucede esto, es porque setSomething() solo vuelve a representar el componente si y solo si el estado anterior y el actual son diferentes. Dado que las matrices en javascript son tipos de referencia, si edita un elemento de una matriz en js, aún no cambia la referencia a la matriz original. A los ojos de js, estas dos matrices son iguales, aunque el contenido original dentro de esas matrices sea diferente. Es por eso que setSomething() falla al detectar los cambios realizados en la matriz anterior.

Tenga en cuenta que si usa componentes de clase y actualiza el estado usando setState(), el componente siempre se actualizará independientemente de si el estado ha cambiado o no. Entonces, puede cambiar su componente funcional a un componente de clase como solución. O siga las respuestas proporcionadas por otros.

over 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