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

238
Views
¿Cómo mostrar el cargador cuando hay un código de bloqueo en el controlador onClick?

Tengo un componente de reacción simple. El componente tiene un controlador que se ejecuta cuando se hace clic en el botón. Hay algún código de bloqueo en el controlador. Mi tarea es: cuando hago clic en el botón, aparece el cargador. Después de eso, el código de bloqueo realiza algunas operaciones pesadas y luego el cargador desaparece:

 import { useState } from "react"; import "./styles.css"; export default function App() { const [wait, setWait] = useState(true); const onClickHandler = () => { setWait(true); // Blocking code setWait(false); }; return ( <div className="App"> <button onClick={onClickHandler}>Click</button> {wait && <div>Loading...</div>} </div> ); }

Este código es artificial y sé que es mejor no hacer esto: bloquear el hilo. Sé que el procesamiento por lotes funciona aquí. Pero aún así, me gustaría saber cómo puedo mostrar el cargador en esta situación. Y en general, ¿es posible tal situación en la producción, o es una mala práctica?

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Bloquear el código significa que cualquier otra operación en tu página tendrá que esperar hasta que finalice la primera. Si no le importa que esto suceda (tal vez este cargador cubre toda la pantalla o no desea que el usuario haga nada más hasta que finalice la operación), entonces está bien.

Ahora, tal vez quieras realizar esta operación mientras el usuario interactúa con la página, en ese caso deberías hacer uso del comportamiento asíncrono de Promise , usando la sintaxis then / catch / finally . También necesitará useRef para poder tener acceso al estado actual del componente en las devoluciones de llamada.

 import { useState, useRef } from "react"; import "./styles.css"; export default function App() { // your big operation should return a Promise const bigOperation = () => { return new Promise((resolve, reject) => { resolve("Heeeey"); }) } // added "_" to the set function so it won't be confused // with our function to update the reference const [wait, _setWait] = useState(true); // create reference for the wait state const waitRef = useRef(wait); // function to update reference and state (mimics real one _setWait) const setWait = (newValue) => { waitRef.current = newValue; _setWait(newValue); } const onClickHandler = () => { setWait(true); // this executes asyncronously bigOperation().then(() => { setWait(false); }); }; return ( <div className="App"> <button onClick={onClickHandler}>Click</button> {wait && <div>Loading...</div>} </div> ); }
about 4 years ago · Juan Pablo Isaza Report

0

Hay dos maneras de hacer esto

  1. Ejecute su código de bloqueo más tarde, deje que el indicador de carga se muestre primero.

new Promise o setTimeout servirán.

 export default function App() { const [wait, setWait] = useState(true); const onClickHandler = () => { setWait(true); new Promise((resolve) => { // Blocking code setWait(false); resolve() }); }; return ( <div className="App"> <button onClick={onClickHandler}>Click</button> {wait && <div>Loading...</div>} </div> ); }
  1. Lance su código de bloqueo a Web Worker.

Puede usar ganchos personalizados como useWorker para lograr esto convenientemente

useWorker : https://github.com/alewin/useWorker

about 4 years ago · Juan Pablo Isaza Report

0

Movería la condición fuera de la declaración de devolución principal.

 if (wait) return <div>Loading...</div>; return ( <div className="App"> <button onClick={onClickHandler}>Click</button> </div> );
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!