El hook useCallback memoriza una función y la devuelve solo si las dependencias han cambiado, evitando que se recree en cada render.
Es especialmente útil al pasar funciones como props a componentes hijos optimizados con React.memo, ya que ayuda a prevenir renders innecesarios.
Aquí tienes la estructura básica de useCallback:
const funcionMemorizada = useCallback(() => {
// lógica aquí
}, [dependencias]); En este caso, se demuestra cómo usar useCallback para evitar la recreación de una función en cada renderizado.
import React, { useState, useCallback } from 'react';
import { View, Button, StyleSheet } from 'react-native';
const Contador = () => {
const [contador, setContador] = useState(0);
const incrementar = useCallback(() => {
setContador(c => c + 1);
}, []);
return (
<View style={styles.container}>
<View style={styles.buttonWrapper}>
<Button title={`Contador: ${contador}`} onPress={incrementar} color="#6200EE" />
</View>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
buttonWrapper: {
width: 200,
margin: 10,
borderRadius: 5,
overflow: 'hidden',
},
});
export default Contador; En la siguiente demostración, se utiliza el hook useCallback para memorizar la función incrementar, evitando su recreación en cada render.
Es útil cuando se pasa la función a componentes hijos optimizados o para mejorar el rendimiento.
useCallback?useCallback es útil para evitar la recreación de funciones en cada renderizado, lo que puede ser costoso en términos de rendimiento, especialmente si pasas funciones a componentes hijos que dependen de ellas.
Cuando pasas funciones a componentes hijos, cada vez que el componente padre se renderiza, las funciones se recrean. Esto puede causar que los componentes hijos también se rendericen innecesariamente.
Esto es especialmente cierto si los componentes hijos están optimizados con React.memo, ya que React.memo solo evita el renderizado si las props no han cambiado.
Aquí tienes un ejemplo donde useCallback se utiliza para evitar la recreación de una función que se pasa como prop a un componente hijo.
import React, { useCallback, useState, memo } from 'react';
import { View, Button, Text } from 'react-native';
const BotonMemo = memo(({ onPress }) => {
console.log('Render BotonMemo');
return <Button title="Click aquí" onPress={onPress} />;
});
const App = () => {
const [contador, setContador] = useState(0);
const handleClick = useCallback(() => {
setContador(c => c + 1);
}, []);
return (
<View>
<Text>Contador: {contador}</Text>
<BotonMemo onPress={handleClick} />
</View>
);
};
export default App; [valor1, valor2]).Combina useCallback con React.memo para crear componentes hijos ultra eficientes que solo se renderizan cuando es realmente necesario.