Chuck's Academy

React Hooks

El Hook useMemo

useMemo Hook ### ### Introducción ### El Hook useMemo es utilizado para memorizar valores calculados, optimizando el rendimiento al evitar recalculaciones costosas en cada renderización. Este Hook es particularmente útil cuando necesitas realizar cálculos intensivos o tienes componentes que dependen de datos complejos que no deben recalcularse en cada render. ### Sintaxis básica ### useMemo toma una función y una lista de dependencias, y solo recalcula el valor memorizado cuando alguna de las dependencias cambia. javascript import React, { useState, useMemo } from 'react'; function ExpensiveComponent({ a, b }) { // Calcula el valor memorizado const expensiveValue = useMemo(() => { return a + b; }, [a, b]); return <div>{expensiveValue}</div>; } function App() { const [count, setCount] = useState(0); return ( <div> <ExpensiveComponent a={1} b={2} /> <button onClick={() => setCount(count + 1)}>Incrementar Count</button> <p>Count es: {count}</p> </div> ); } ### Descripción del ejemplo ### En este ejemplo: - ExpensiveComponent utiliza useMemo para calcular el valor expensiveValue. - El cálculo solo se realiza cuando a o b cambian, no en cada renderización del componente. - Aunque App se renderiza cada vez que se incrementa count, el valor memorizado en ExpensiveComponent no se recalcula a menos que cambien a o b. ### Casos de uso ### useMemo es útil en varios escenarios, como: - Cálculos intensivos: Realizar cálculos costosos solo cuando cambian las entradas. - Renderizaciones condicionales: Evitar renderizaciones innecesarias de componentes hijos. - Filtrado y ordenamiento de listas: Memorizar los resultados para evitar repetir cálculos. ### Ejemplo avanzado ### Considera el caso de una lista filtrada de usuarios. javascript import React, { useState, useMemo } from 'react'; const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }, // Más usuarios... ]; function UsersList({ filter }) { const filteredUsers = useMemo(() => { console.log('Filtrando usuarios...'); return users.filter(user => user.name.toLowerCase().includes(filter.toLowerCase())); }, [filter]); return ( <ul> {filteredUsers.map(user => ( <li key={user.id}>{user.name}</li> ))} </ul> ); } function App() { const [filter, setFilter] = useState(''); return ( <div> <input value={filter} onChange={e => setFilter(e.target.value)} placeholder='Buscar usuario...' /> <UsersList filter={filter} /> </div> ); } ### Descripción del ejemplo avanzado ### En este ejemplo: - UsersList utiliza useMemo para memorizar la lista filtrada de usuarios, evitando recalcular la lista filtrada en cada renderización. - La consola mostrará 'Filtrando usuarios...' solo cuando el filtro cambie, optimizando el rendimiento. ### Cuándo no usar useMemo ### Evita el uso excesivo de useMemo. Úsalo solo cuando tienes pruebas claras de problemas de rendimiento. En la mayoría de los casos, React es eficiente en el manejo de actualizaciones de componentes por sí solo. ### Advertencias ### Aunque useMemo puede mejorar el rendimiento, también añade una capa de complejidad. Úsalo con precaución y asegúrate de que realmente está beneficiando el rendimiento de tu aplicación. [Placeholder para imagen sobre el uso de useMemo: Diagrama que muestra cómo useMemo evita recalcular valores en cada render, destacando el proceso de dependencia y memoización de resultados.]


Pregúntame lo que sea