Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

148
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!