Chuck's Academy

React Hooks

El Hook useImperativeHandle

useImperativeHandle Hook ### ### Introducción ### El Hook useImperativeHandle permite personalizar la instancia ref que es expuesta a los componentes padres al usar forwardRef. Es útil cuando necesitas controlar detalladamente cómo los componentes manejan y exponen sus referencias, proporcionando una API más específica y controlada desde el componente hijo. ### Sintaxis básica ### useImperativeHandle se utiliza junto a forwardRef para exponer métodos específicos del componente hijo a través de la referencia proporcionada. javascript import React, { useImperativeHandle, forwardRef, useRef } from 'react'; const FancyInput = forwardRef((props, ref) => { const inputRef = useRef(); useImperativeHandle(ref, () => ({ focus: () => { inputRef.current.focus(); }, clear: () => { inputRef.current.value = ''; } })); return <input ref={inputRef} />; }); function ParentComponent() { const fancyInputRef = useRef(); return ( <div> <FancyInput ref={fancyInputRef} /> <button onClick={() => fancyInputRef.current.focus()}>Focus Input</button> <button onClick={() => fancyInputRef.current.clear()}>Clear Input</button> </div> ); } ### Descripción del ejemplo ### En este ejemplo: - FancyInput es un componente hijo que utiliza forwardRef para aceptar una referencia de su padre. - useImperativeHandle se utiliza para exponer los métodos focus y clear a través de la referencia inputRef. - ParentComponent interactúa con FancyInput llamando a los métodos focus y clear a través de fancyInputRef. ### Casos de uso ### useImperativeHandle es útil cuando: - Necesitas exponer funcionalidades específicas: Proveer una API controlada desde componentes hijos a sus padres. - Control detallado de referencias: Manejar cómo una referencia interactúa con elementos internos del componente. ### Ejemplo avanzado ### Considera una imagen personalizada que necesita ser rotada y escalada mediante métodos expuestos. javascript import React, { useImperativeHandle, forwardRef, useRef, useState } from 'react'; const CustomImage = forwardRef((props, ref) => { const imgRef = useRef(); const [rotation, setRotation] = useState(0); const [scale, setScale] = useState(1); useImperativeHandle(ref, () => ({ rotate: (deg) => { setRotation(rotation + deg); }, zoom: (factor) => { setScale(scale * factor); } })); return ( <img ref={imgRef} src={props.src} alt='Custom' style={{ transform: `rotate(${rotation}deg) scale(${scale})` }} /> ); }); function App() { const imageRef = useRef(); return ( <div> <CustomImage ref={imageRef} src='https://via.placeholder.com/150' /> <button onClick={() => imageRef.current.rotate(45)}>Rotate 45°</button> <button onClick={() => imageRef.current.zoom(1.2)}>Zoom 120%</button> </div> ); } ### Descripción del ejemplo avanzado ### En este ejemplo: - CustomImage maneja una imagen que puede ser rotada y escalada utilizando métodos expuestos a través de useImperativeHandle. - App contiene botones que interactúan con CustomImage a través de la referencia imageRef, permitiendo rotar y escalar la imagen fácilmente. ### Comparación con simplemente usar ref ### Si bien puedes manipular elementos DOM directamente con ref, useImperativeHandle proporciona una forma más controlada y declarativa de exponer funcionalidades específicas, mejorando la mantenibilidad y claridad del componente. ### Advertencias ### useImperativeHandle debe ser usado con moderación y cuando realmente sea necesario. Exponer demasiadas funcionalidades internas puede romper el encapsulamiento del componente, haciendo que partes del componente dependan demasiado entre sí. ### Consideraciones de uso ### - Encapsulamiento: Exponer solo lo necesario para mantener el encapsulamiento y la independencia del componente. - Mantenibilidad: Asegúrate de que los métodos expuestos tengan sentido y sean bien documentados para uso futuro. [Placeholder para imagen sobre el uso de useImperativeHandle: Diagrama que muestra la interacción entre forwardRef, useImperativeHandle, y cómo se exponen métodos del componente hijo al componente padre, destacando el flujo de referencias y métodos.]


Pregúntame lo que sea