En este tema, exploraremos dos hooks avanzados de React: useMemo y useCallback. Ambos hooks son utilizados para optimizar el rendimiento de las aplicaciones de React al evitar cálculos innecesarios y la recreación de funciones.
- Introducción a useMemo
El hook useMemo se utiliza para memorizar valores calculados. Esto es útil cuando tienes cálculos costosos que no deberían ejecutarse en cada renderizado a menos que sus dependencias hayan cambiado.
Sintaxis
computeExpensiveValuees una función que realiza un cálculo costoso.[a, b]es la lista de dependencias.useMemosolo volverá a calcular el valor si alguna de estas dependencias cambia.
Ejemplo Práctico
Supongamos que tenemos una función que realiza un cálculo costoso:
function computeExpensiveValue(a, b) {
console.log('Calculando valor...');
return a + b;
}
function MyComponent({ a, b }) {
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
return (
<div>
<p>Valor calculado: {memoizedValue}</p>
</div>
);
}En este ejemplo, computeExpensiveValue solo se ejecutará cuando a o b cambien, optimizando así el rendimiento.
- Introducción a useCallback
El hook useCallback se utiliza para memorizar funciones. Esto es útil cuando pasas funciones a componentes hijos que dependen de props o state, evitando que se creen nuevas instancias de la función en cada renderizado.
Sintaxis
doSomethinges la función que deseas memorizar.[a, b]es la lista de dependencias.useCallbacksolo volverá a crear la función si alguna de estas dependencias cambia.
Ejemplo Práctico
Supongamos que tenemos un componente que pasa una función a un componente hijo:
function MyComponent({ a, b }) {
const handleClick = useCallback(() => {
console.log('Clicked!', a, b);
}, [a, b]);
return (
<div>
<ChildComponent onClick={handleClick} />
</div>
);
}
function ChildComponent({ onClick }) {
return <button onClick={onClick}>Click me</button>;
}En este ejemplo, handleClick solo se recreará cuando a o b cambien, evitando renderizados innecesarios del ChildComponent.
- Comparación entre useMemo y useCallback
| Hook | Propósito | Retorno | Uso Común |
|---|---|---|---|
useMemo |
Memorizar valores calculados | Valor memoizado | Cálculos costosos, valores derivados |
useCallback |
Memorizar funciones | Función memoizada | Pasar funciones a componentes hijos, handlers |
- Ejercicio Práctico
Ejercicio
Crea un componente que tenga un input y un botón. El botón debe mostrar el número de veces que ha sido clicado. Usa useMemo para memorizar el valor calculado de la longitud del texto del input y useCallback para memorizar la función que maneja el clic del botón.
Solución
import React, { useState, useMemo, useCallback } from 'react';
function App() {
const [text, setText] = useState('');
const [count, setCount] = useState(0);
const textLength = useMemo(() => {
console.log('Calculando longitud del texto...');
return text.length;
}, [text]);
const handleClick = useCallback(() => {
setCount(count + 1);
}, [count]);
return (
<div>
<input
type="text"
value={text}
onChange={(e) => setText(e.target.value)}
/>
<p>Longitud del texto: {textLength}</p>
<button onClick={handleClick}>Clickeado {count} veces</button>
</div>
);
}
export default App;Explicación
textLengthse memoriza usandouseMemoy solo se recalcula cuandotextcambia.handleClickse memoriza usandouseCallbacky solo se recrea cuandocountcambia.
- Conclusión
En esta lección, hemos aprendido cómo useMemo y useCallback pueden ser utilizados para optimizar el rendimiento de nuestras aplicaciones de React. Estos hooks son especialmente útiles cuando se trabaja con cálculos costosos o cuando se pasan funciones a componentes hijos. Asegúrate de usarlos adecuadamente para evitar renderizados innecesarios y mejorar la eficiencia de tu aplicación.
En el próximo tema, exploraremos técnicas adicionales de optimización del rendimiento en React.
Curso de React
Módulo 1: Introducción a React
- ¿Qué es React?
- Configuración del Entorno de Desarrollo
- Hola Mundo en React
- JSX: Extensión de Sintaxis de JavaScript
Módulo 2: Componentes de React
- Entendiendo los Componentes
- Componentes Funcionales vs de Clase
- Props: Pasando Datos a Componentes
- State: Gestión del Estado del Componente
Módulo 3: Trabajando con Eventos
- Manejo de Eventos en React
- Renderizado Condicional
- Listas y Claves
- Formularios y Componentes Controlados
Módulo 4: Conceptos Avanzados de Componentes
- Elevando el Estado
- Composición vs Herencia
- Métodos del Ciclo de Vida de React
- Hooks: Introducción y Uso Básico
Módulo 5: Hooks de React
Módulo 6: Enrutamiento en React
Módulo 7: Gestión del Estado
- Introducción a la Gestión del Estado
- API de Contexto
- Redux: Introducción y Configuración
- Redux: Acciones y Reductores
- Redux: Conectando a React
Módulo 8: Optimización del Rendimiento
- Técnicas de Optimización del Rendimiento en React
- Memorización con React.memo
- Hooks useMemo y useCallback
- División de Código y Carga Perezosa
Módulo 9: Pruebas en React
- Introducción a las Pruebas
- Pruebas Unitarias con Jest
- Pruebas de Componentes con React Testing Library
- Pruebas de Extremo a Extremo con Cypress
Módulo 10: Temas Avanzados
- Renderizado del Lado del Servidor (SSR) con Next.js
- Generación de Sitios Estáticos (SSG) con Next.js
- TypeScript con React
- React Native: Creación de Aplicaciones Móviles
