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

195
Visualizações
Reaccionar: casilla de verificación atascada en verdadero, pero el estado se actualiza

Tengo un valor en mi estado para almacenar una lista de ciudades, una casilla de verificación para seleccionarlas en una tabla y un detector de eventos para agregar el valor seleccionado al estado.

Puedo alternar la casilla de verificación una vez, de falso a verdadero. Entonces, no puede cambiar a falso. Estoy registrando el estado y está actualizado correctamente, por lo que no entiendo por qué mi casilla de verificación no está actualizada.

Por ejemplo :

  • La casilla de verificación "Nueva York" no está marcada, por lo que el estado es []
  • Puedo comprobarlo, el estado cambia a ["New York"]
  • Cuando lo desmarco, el estado cambia a [] , pero no pasa nada en la casilla de verificación

Aquí está el código:

 const [selected, setSelected] = useState([]);
 <input type="checkbox" onChange={(e) => handleRowSelect(e, bpf.city_name)} checked={selected.indexOf(bpf.city_name) > -1} />
 const handleRowSelect = (e, city) => { let arr = selected; const index = arr.indexOf(city) if (index === -1) { arr.push(city); } else { arr.splice(index, 1); } setSelected(arr); console.log(arr) console.log(selected) dispatch({ type: 'SET_SEL_BPF', payload: selected }) }
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Su problema es la inmutabilidad del objeto en React. Cada vez que establece un nuevo estado, debe inicializar un nuevo objeto/matriz para que React comprenda que su objeto/matriz ha cambiado.

En su caso, está utilizando arr.push y arr.splice que mantienen la misma matriz todo el tiempo

El cambio puede ser

 const handleRowSelect = (e, city) => { let arr = selected; const index = arr.indexOf(city) if (index === -1) { //create a new array, and add city arr = [...arr, city] } else { //create a new array with `filter` arr = arr.filter((city, index) => index !== arr.length - 1) } setSelected(arr); console.log(arr) console.log(selected) dispatch({ type: 'SET_SEL_BPF', payload: selected }) }

O puede probar de esta manera con una nueva inicialización de matriz let arr = [...selected];

 const handleRowSelect = (e, city) => { let arr = [...selected]; //create a new array from the existing one const index = arr.indexOf(city) if (index === -1) { arr.push(city); } else { arr.splice(index, 1); } setSelected(arr); console.log(arr) console.log(selected) dispatch({ type: 'SET_SEL_BPF', payload: selected }) }
about 4 years ago · Juan Pablo Isaza Relatório

0

Esto se debe a que está mutando su estado selected .

La línea let arr = selected; no deep copy el estado selected . arr y selected en realidad apuntan al mismo objeto en la memoria.

Esto significa que lo selected se está mutando y no actualizando con un estado completamente nuevo (también conocido como mutado), es decir, cambiando los valores del mismo objeto en lugar de crear un obj completamente nuevo con sus nuevos valores.

Cuando mutas tu estado. React no se actualiza correctamente y es una gran regla en reaccionar nunca mutar su estado.

Considere hacer una copia profunda de su estado y luego mutar esa deep copy y luego configurar seleccionado a esa nueva copia profunda setSelected(*your deep copy*)

Editar: mirando las otras respuestas, CUIDADO con la creación de una copia como let arr = [...selected] . Esto funcionará si la matriz tiene solo un nivel de profundidad. Pero si tiene una matriz de objetos como: let arr = [{}] o matrices anidadas let arr = [[]] los objetos o matrices dentro de {} no serán copias profundas y se mutarán. Causando el mismo problema.

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