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

258
Visualizações
¿Cómo muestro la carga en la parte superior de todos los elementos cuando la URL en la búsqueda se cambia en la reacción?

Tengo el código que obtiene datos json de una URL y los muestra, así:

 const [error, setError] = useState(null); const [isLoaded, setIsLoaded] = useState(false); const [items, setItems] = useState([]); const [url, setUrl] = useState(url); useEffect(() => { fetch(url) .then(res => res.json()) .then( (result) => { setIsLoaded(true); setItems(result); }, // Note: it's important to handle errors here instead of a catch() block // so that we don't swallow exceptions from actual bugs in components. (error) => { setIsLoaded(true); setError(error); } ) }, [url, setUrl]); if (error) { return <div>Error: {error.message}</div>; } else if (!isLoaded) { return <LoadingAnimation />; } else { return <BasicLayout items={items} setUrl={setUrl} />; }

Donde url es solo una url arbitraria que me obtiene algunos datos. Tengo una función LoadingAnimation personalizada que simplemente muestra la carga cuando la página no se ha cargado. Paso setUrl en la función BasicLayout porque quiero cambiar los parámetros de URL con el clic de un botón y actualizar los datos y mostrarlos. Cuando se activa setUrl, los datos se actualizan como deberían, con un retraso de 4 a 5 segundos. Ahora, además, mientras los datos se actualizan durante ese retraso de 4-5 segundos, quiero mostrar una animación de carga diferente encima de todos los elementos y hacer que el usuario no pueda hacer clic en nada mientras se actualiza la búsqueda.

Intenté pasar setIsLoaded a BasicLayout pero eso solo reemplazó la pantalla completa y volvió a renderizar cada componente. Especialmente no quiero volver a renderizar nada; simplemente represente el ícono de carga y ocúltelo cuando todo haya terminado de actualizarse. ¿Cómo haría para hacer eso?

about 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

en este momento, en su componente, if las declaraciones return lo que React tiene que representar. Así que tienes algunas formas:

en este ejemplo, si hay un cambio de error , React mostrará BasicLayout o un mensaje de error, pero si isLoaded cambiará, LoadingAnimation se ocultará/se mostrará debajo del elemento anterior.

 useEffect(() => { ... }, [url, setUrl]); return ( <> {error ? <div>Error: {error.message}</div> : <BasicLayout items={items} setUrl={setUrl} />} {!isLoaded && <LoadingAnimation />} </> )

Si usa los estilos css correctos, simplemente puede hacer que LoadingAnimation sea un modal (ventana emergente), pero para los modales, en cuanto a mí, es mejor usar React Portals

índice.html

 <div id='root' ></div> <div id='modal' ></div>

Portal.jsx

 const Portal = ({children}) => { const portalNode = document.getElementById('modal') return createPortal(children, portalNode) }

Modal.jsx

 const Modal = ({isActive, setIsActive, children}) => { return ( <Portal> {isActive && <div>{/* ...some code with children */}</div>} </Portal> ) }

Así que en tu componente será algo como esto

 useEffect(() => { ... }, [url, setUrl]); return ( <> {error ? <div>Error: {error.message}</div> : <BasicLayout items={items} setUrl={setUrl} />} <Modal isActive={!isLoaded} ><LoadingAnimation /></Modal> </> )

y también puede hacer que el componente de error sea modal.

Espero que ayude :))

about 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