Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

152
Vistas
El componente de imagen personalizado de React no se procesa según la condición dada

Estoy tratando de construir un componente de imagen en fallback con un accesorio de respaldo, si se proporciona, renderizará el componente de respaldo hasta que la imagen se haya descargado y renderizado correctamente.

La representación condicional es la siguiente:

 if (loading) { return fallback; } else if (error) { return <span>ERROR</span>; } else if (src) { return ( <> <img alt="" ref={imageRef} decoding="async" src={props.src} /> </> ); } else return null; }

Y la imagen se llama en el archivo App.js como

 <Image src="https://source.unsplash.com/random/100x100" fallback={<h1>Loading...</h1>} />

Estoy usando useEffect gancho para llamar a la función que verifica aún más si la imagen se ha montado en la pantalla usando ref .

 React.useLayoutEffect(() => { imageRef.current = true; start(); return () => { imageRef.current = false; }; }, []); async function start() { if (!src || !fallback) { const errorMessage = "`src` & `fallback` must be provided"; setError(errorMessage); return; } setLoading(true); tryLoadImage(); } async function loadImage() { const img = imageRef.current; if (!img) { return; } setLoading(false); } async function tryLoadImage() { try { await loadImage(); if (imageRef.current) { setLoading(false); } } catch (error) { console.log("error", error); } }

El problema al que me enfrento:

  1. Incluso después de usar declaraciones condicionales en la parte de return , el componente da un espacio en blanco y negro y luego representa la imagen, por lo tanto, no se representa "Cargando..." en la pantalla.
  2. Intenté usar setTimeOut para el retraso en el accesorio 'setLoading', en este caso, el respaldo se procesa después de ese cierto retraso de tiempo de espera, no antes.

Cosas de las que no estoy seguro:

  1. ¿Sucede esto debido a una actualización por lotes en el enlace useState?
  2. Mi gancho useEffect se dispara después de que el retorno se pinta en la pantalla. ¿Este mecanismo es correcto en mi caso de uso?

Consulte el enlace de Codesandbox para ver la demostración/código en vivo: https://codesandbox.io/s/img-lazy-ke6zz

Cualquier ayuda en la dirección correcta sería muy útil.

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Puedes usar useEffect mejor en este caso; tienes un estado de loading . Debería escuchar cuando este valor cambia en su useEffect .

 useEffect(() => { setLoading(false); }, [loading]);

El valor que pasa en la matriz en el enlace useEffect se está escuchando (puede haber más que valor aquí, ya que es una matriz). Entonces, cuando uno de esos valores cambia, ejecuta el código en useEffect. En este componente, loading solo debería cambiar una vez a falso. Entonces, cada vez que usa setLoading en su código, se ejecuta este useEffect.

Te recomiendo leer más sobre este gancho aquí: https://reactjs.org/docs/hooks-effect.html

Además, creo que es mejor en este caso, el estado de loading predeterminado es verdadero en lugar de falso. Entonces, cuando el componente se renderiza, se está cargando desde el principio. En la función de start , puede usar setLoading en falso cuando src o fallback no están configurados. Esta es también la razón por la que no se muestra su respaldo. Como la loading predeterminada es falsa y muestra el respaldo cuando esto se está loading es verdadero.

Una mejor práctica de usar React.useEffect y React.useState es importarlo en su archivo. Esto se puede hacer de la siguiente manera import React, { useRef, useEffect, useState } from "react"; . Entonces puedes usarlos así const [loading, setLoading] = useState(false); sin React prefijándolo.

Puede encontrar una versión editada de su CodeSandbox aquí https://codesandbox.io/s/img-lazy-forked-l8zuf?file=/src/Image.js . También cambié la declaración de devolución, lo que puede hacer si no desea mostrar errores.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda