Marc Benito
Optimizando el rendimiento en React

Optimizando el rendimiento en React con useMemo y useCallback

15 de marzo de 2024

React nos proporciona varios hooks para optimizar el rendimiento de nuestras aplicaciones. Dos de los más importantes son useMemo y useCallback. En este artículo, veremos cuándo y cómo usarlos efectivamente.

¿Cuándo usar useMemo?

useMemo es perfecto para memorizar valores computacionalmente costosos. Aquí hay un ejemplo práctico:

// ❌ Sin memorización
const expensiveValue = calculateExpensiveValue(props.data);

// ✅ Con memorización
const memoizedValue = useMemo(() => {
  return calculateExpensiveValue(props.data);
}, [props.data]);

useCallback en la práctica

useCallback es especialmente útil cuando pasamos funciones como props a componentes memorizados con React.memo. Veamos un ejemplo:

// ❌ Sin memorización
const handleClick = () => {
  console.log(props.value);
};

// ✅ Con memorización
const handleClick = useCallback(() => {
  console.log(props.value);
}, [props.value]);

Ejemplo completo de optimización

Aquí tienes un ejemplo más completo que combina ambos hooks en un escenario real:

import React, { useMemo, useCallback } from 'react';

interface DataItem {
  id: number;
  value: number;
}

interface Props {
  data: DataItem[];
  onItemSelect: (item: DataItem) => void;
}

const DataList: React.FC<Props> = ({ data, onItemSelect }) => {
  // Memorizar cálculos costosos
  const sortedData = useMemo(() => {
    return [...data].sort((a, b) => b.value - a.value);
  }, [data]);

  // Memorizar función de callback
  const handleItemClick = useCallback((item: DataItem) => {
    console.log('Item clicked:', item);
    onItemSelect(item);
  }, [onItemSelect]);

  return (
    <ul>
      {sortedData.map((item) => (
        <li key={item.id} onClick={() => handleItemClick(item)}>
          {item.value}
        </li>
      ))}
    </ul>
  );
};

export default React.memo(DataList);

Conclusiones

La optimización del rendimiento es crucial en aplicaciones React modernas, pero es importante no caer en la sobre-optimización. Usa estos hooks cuando:

  • Tienes cálculos computacionalmente costosos (useMemo)
  • Pasas callbacks a componentes memorizados (useCallback)
  • Necesitas mantener la referencia estable de un valor u objeto

Recuerda que la memorización tiene su propio costo, así que asegúrate de medir el rendimiento antes y después de aplicar estas optimizaciones.