Mauricio Combariza
Me parece dificil, pero muy importante esta clase
Trabajar con useRef en React y TypeScript parece sencillo hasta que aparece el primer error críptico de tipos. Si estás construyendo componentes que necesitan acceder a un nodo del DOM, como una imagen lazy, vas a necesitar este hook y entender por qué inicializarlo en null es la regla de oro.
¿Qué es useRef y para qué sirve en React?
useRef es el hook de React que te permite crear referencias a nodos del DOM y acceder a ellos en tiempo de ejecución. Es la pieza que te falta cuando necesitas que un componente sepa qué está pasando con un elemento real del navegador.
En el proyecto que venimos trabajando, el componente RandomFox era una imagen simple. Para volverlo lazy, necesitamos que sepa en qué momento entra al viewport, esa parte visible del navegador donde el usuario está mirando. Todo lo que está fuera del scroll no debería cargar todavía.
Para lograrlo, el plan combina tres piezas:
¿Qué hace useRef en React? Crea una referencia mutable que apunta a un nodo del DOM o guarda un valor entre renders sin disparar re-renderizados.
¿Cómo se usa useRef sin TypeScript?
Si vienes de JavaScript puro, la implementación es directa. Importas el hook desde React, lo inicializas dentro del componente y lo asignas a la prop especial ref del elemento JSX.
jsx import { useRef } from 'react'
const node = useRef()
return <img ref={node} />
En tiempo de ejecución, esto funciona perfecto. El problema aparece cuando TypeScript entra en escena y empieza a quejarse de que algo no cuadra con los tipos [03:15].
¿Por qué TypeScript marca error al usar useRef?
TypeScript te dice que el tipo es un MutableRefObject que está como undefined, y que ese undefined no es asignable a HTMLImageElement. El error es largo y críptico, pero hay un truco para leerlo: siempre pregúntale a TypeScript por qué.
Vas bajando capa por capa:
current son incompatibles. ¿Por qué?undefined no es asignable a HTMLImageElement | null.En esa última línea aparecen las tres pistas que necesitas: undefined, null y HTMLImageElement. Esa es la clave para resolverlo.
¿Cómo tipar useRef correctamente con TypeScript?
useRef acepta un genérico que le indica qué tipo de elemento del DOM vas a referenciar. Si no le pasas nada, los tipos de React asumen undefined por defecto, y de ahí viene el error.
La primera regla es ser explícito con el genérico. Como estamos trabajando con una imagen, el tipo correcto es HTMLImageElement:
tsx const node = useRef<HTMLImageElement>()
Pero TypeScript todavía no queda contento. Sigue diciendo que undefined no es compatible con HTMLImageElement | null. Aquí entra la segunda regla, y es una de las rarezas de React con TypeScript.
¿Por qué useRef debe inicializarse en null? Porque los tipos de React esperan
HTMLImageElement | null, yundefinedno es lo mismo quenullen el sistema de tipos, aunque ambos sean valores falsy en JavaScript.
La solución final pasa el valor inicial explícitamente:
tsx const node = useRef<HTMLImageElement>(null)
return <img ref={node} />
¿Cuál es la diferencia entre null y undefined en TypeScript?
En JavaScript, null y undefined se comportan parecido en condicionales, pero TypeScript los trata como tipos distintos. Cuando no inicializas el argumento de useRef, JavaScript lo pasa como undefined, y eso choca con el tipo que espera el hook.
Por eso la regla de oro al usar useRef en React con TypeScript es doble:
null cuando aún no tienes el nodo disponible.No es algo que adivinarías leyendo la documentación rápido. Es uno de esos pequeños trucos que aparecen al combinar React con TypeScript, y entenderlo te ahorra horas de pelear con errores incomprensibles.
¿Qué cambia visualmente al agregar useRef al componente?
Nada. Y esa es la parte interesante. Al recargar el proyecto, la imagen se ve igual que antes. Lo que ganaste es acceso programático al nodo para usarlo en el siguiente paso, que es conectar el observador del viewport.
Como ya le dijiste a TypeScript que la referencia es de tipo HTMLImageElement, ahora puedes acceder a las propiedades específicas de una imagen del DOM con autocompletado correcto. Ese es el verdadero valor de tipar bien: el editor te ayuda en lugar de estorbarte.
El siguiente paso del proyecto es agregar la Web API de observables para detectar cuándo la imagen entra al viewport y dispararla solo en ese momento. ¿Cómo lo implementarías tú con IntersectionObserver y useEffect? Cuéntame en los comentarios qué enfoque usarías antes de ver la solución.
Tipos para referencias y observadores
Cuando trabajamos con React y TypeScript, puede que nos encontremos con problemas a la hora de utilizar referencias y observadores en nuestros componentes. Esto se debe a que, dependiendo del objeto HTML con el que estemos trabajando, necesitamos tener en cuenta ciertos conceptos para que nuestro código sea válido.
Digamos que vamos a nuestro componente RandomFox y queremos añadir una referencia con useRef().
export default function RandomFox( { image }: Props ):JSX.Element { const node = useRef() return ( <img **ref={node}** src={ image } className="w-80 h-auto rounded-lg" /> ) }
Incluso si especificamos que la referencia será de tipo HTMLImageElement en el generic de useRef(), el error persiste:
const node = useRef<HTMLImageElement> () // Esto seguirá dando error <img **ref={node}** src={ image } className="w-80 h-auto rounded-lg" />
La razón de este error es que el tipo de dato que useRef() devuelve por defecto es undefined, mientras que el elemento <img> solo acepta referencias de tipo null cuando no están asignadas. Por lo tanto, ambos tipos de dato no coinciden.
Para solucionar este problema, debemos inicializar la referencia con un valor nulo en lugar de dejarla sin asignar:
export default function RandomFox( { image }: Props ):JSX.Element { const node = useRef<HTMLImageElement> (null) return ( <img ref={node} src={ image } className="w-80 h-auto rounded-lg" /> ) }
De esta manera, ya no recibiremos el error en el linter y nuestra referencia será válida para trabajar con el elemento <img>.
Es importante tener en cuenta estos detalles cuando trabajamos con referencias y observadores en React y TypeScript, ya que pueden generar errores difíciles de depurar. Conocer estas diferencias nos permitirá solucionar problemas con mayor facilidad y hacer un mejor uso del tipado de TypeScript en nuestros proyectos.
useRef permite crear una referencia mutable que se puede utilizar para acceder directamente a los elementos del DOM o a los componentes de React que estan representados en pantalla, y también para almacenar valores o funciones que persistan entre renderizados y actualizaciones de componentes. La diferencia entre una referencia creada con useRef y una creada con createRef es que createRef crea una nueva referencia en cada renderizado del componente, mientras que useRef crea una única referencia que se mantiene constante durante todo el ciclo de vida del componente
Mauricio Combariza
Me parece dificil, pero muy importante esta clase
Cristina Hernández
const myRef = useRef<Type>(initialValue);
Donde Type es el tipo del valor que se almacenará en la referencia y initialValue es el valor inicial de la referencia.
En este caso, el useRef se usa para tomar el valor del elemento y conocer de la imagen, en que momento y en qué posición se encuentra dentro del viewport.
John Davis Pablo Valverde
¿ Que es useRef ? Es un Hook que te permite crear una referencia mutable que persiste durante todo el ciclo de vida de tu componente, lo que significa que no pierde su valor entre renderizaciones.
John Davis Pablo Valverde
¿ Que es useEffect ? Es un Hook que te permite ejecutar código cada vez que cambian sus dependencias la primera vez que se realiza el componente.
Miguel Angel Reyes Moreno
RxJS que pertenece a Angular usa un patrón de diseño llamado 'Observable'
Javier Damiani
Con la frase que me quedo de la clases que por regla de oro hay que poner el elemento con el que vamos a trabajar e inicializarlo en null.
Edgar Molina
viewport: parte del navegador visible.
josue rodrigo fierro morfin
import { useRef } from "react" type Props = {image:string} export const RandomFox = ({image}:Props): JSX.Element =>{ const node = useRef<HTMLImageElement>(null); return <img ref={node} width={320} height="auto" src={image} className="rounded"/> }
Alfonso Neil Jiménez Casallas
y aquí es cuando entendemos mejor por qué el valor null es muy diferente al valor undefined
Jorge Arias Argüelles
Este resumen concentra los conceptos clave de la clase sobre la optimización del manejo de imágenes en React con TypeScript.
Irving Juárez
Aunque el hook useRef se usa normalmente para tener una referencia de un nodo del DOM, no es para lo unico que funciona el hook. Realmente el hook nos da la referencia de un objeto. Lo que significa que el valor de esa referencia no va a cambiar cuando se haga un renderizado del Componente. Entonces si tu quieres tener una variable que no cambie durante ciertos renderizados, utiliza useRef
Harold Zurita Simon
🎯 Tipando useRef en React con TypeScript
Cuando usamos useRef, debemos indicar el tipo del elemento del DOM al que va a apuntar 🔗🌐
Esto le permite a TypeScript saber qué métodos y propiedades estarán disponibles.
⚠️ ¿Por qué inicializar con null?
Si llamamos a useRef sin valor inicial, su valor por defecto sería undefined 🚫
Pero TypeScript no acepta undefined para los tipos de referencias del DOM.
👉 Por eso, siempre debemos inicializarlo con null ✅
useRef<HTMLImageElement>(null);
🧩 null ≠ undefined
En TypeScript no son lo mismo ❌:
undefined: la variable no tiene valor asignadonull: la variable existe, pero aún no apunta a nada💡 En el caso de useRef, null representa que el elemento del DOM todavía no se ha montado.
🖼️ Ejemplo completo
import { useRef } from "react"; type Props = { image: string; }; export const RandomFox = ({ image }: Props): JSX.Element => { const node = useRef<HTMLImageElement>(null); return ( <img ref={node} width={320} height="auto" src={image} className="rounded" /> ); };
🚀 Beneficios de tipar useRef
Al tiparlo correctamente obtenemos:
node.current?.width, etc.)👉 Y TypeScript nos obliga a manejar correctamente el caso null, evitando errores en runtime ⚠️✨
Jose Ever Muñoz Muñoz
inicializar las variables en null es mas importante de lo que parece, en ciertos casos me ha salvado de bugs que de otra manera no habria podido solucionar al menos no en poco tiempo
Abner Pérez Rodríguez
Vayamos por partes.
Dentro del componente de RandomFox se tiene una constante derivada del uso de useRef(). Este hook, como se puede ver en su definición, se nos indica que requiere de un valor inicial T o null (con T se refiere a cualquier tipo de dato).
function useRef<T>(initialValue: T|null): RefObject<T>;
Más adelante nos encontramos que la constante node se ocupa en el atributo ref de la etiqueta <img /> y esto básicamente indica que se colocara como referencia guardada en node la propia<img /> que al inspeccionarla podemos ver que typescript la trata como un objeto de tipo HTMLImageElement.
return <img ref={node} width={320} height="auto" src={imageURL} className="rounded" />;
Tomando lo anterior en cuenta ahora sabemos que el valor inicial que necesita y devolverá useRef() debe ser HTMLImageElement o null.
Esto se puede verificar realizando un pequeño trick donde los siguientes ejemplos son funcionales.
// initialValue = null const node = useRef<HTMLImageElement>(null); // initialValue: HTMLImageElement const node = useRef<HTMLImageElement>(document.createElement("img"));
Oier Solabarrieta Egues
El null en el constructor de useReference si tiene sentido. Al inicializar con null estamos indicando que la referencia que estamos creando todavía no está asociada a ningún elemento del DOM. Se podría pensar que se esta creando una referencia al elemento null .
Miguel Negron Garcia
Everyone remember that the default value that is assign inside JS when you dont assign a value is undefined and that null is a value that to be present need to be assigned.
Carlos Rodríguez
Este curso es extremadamente espectacular