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

151
Visualizações
async onClick con múltiples setStates que no funcionan como se esperaba

ANTECEDENTES

Tengo un objeto al que hago referencia para alternar cambios de estado en un evento onClick.

 const map = { active: { name: "sliceA", toggle: (map) => map.inactive }, inactive: { name: "sliceB", toggle: (map) => map.active } }

useState del componente contiene map.acive o map.inactive segmento de objeto a través de una función de transición.

 const [slice, setSlice] = useState(map.active); const transition = (getMethod) => { const getNewSlice = getMethod(slice); const result = getNewSlice(map); setSlice(result); };

Esto funciona como espero hasta que intente varios cambios de estado en un solo evento onClick.

 const handleClick = async () => { try { transition(slice => slice.toggle); await stall(); transition(slice => slice.toggle); } catch (err) {} };

TEMA

Ver enlace - codesandbox1

Si hace clic en el botón X1, la segunda transición () en handleClick () no activará el cambio de estado.

Si hace clic en el botón X2, la segunda transición () en handleClick () activará el cambio de estado.

SOLICITUD

¿Por qué sucede esto y hay alguna forma de solucionarlo? Hice otra forma más manual de establecer el estado y funciona como se esperaba: codesandbox2

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

0

El motivo es que ambas llamadas de transition en una llamada de handleClick se refieren al estado del slice en el que se definió la transition de la llamada de representación. En otras palabras, setState no actualiza el slice sobre el que se cierra la transtion .

Para que siempre actúe en el estado actual , use un setter de devolución de llamada. currentSlice también se actualizará entre las llamadas de procesamiento:

 const transition = (getMethod) => { setSlice((currentSlice) => { const getNewSlice = getMethod(currentSlice); return getNewSlice(map); }); };

Enlace de la caja de arena

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