React Hook - useImperativeHandle
O React Hook useImperativeHandle
permite aos componentes funcionais personalizar a interface exposta por suas refs. Esse controle adicional sobre a ref
é especialmente útil quando se trabalha com componentes mais complexos que necessitam de uma comunicação direta entre o componente pai e o filho.
Uso comum
O useImperativeHandle
é usado para especificar quais valores a ref
do componente deve expor para o componente pai. Ele é geralmente utilizado dentro do corpo do componente funcional. Aqui está um exemplo básico:
import React, { forwardRef, useRef, useImperativeHandle } from 'react';
// Componente filho que aceita uma ref
const ChildComponent = forwardRef((props, ref) => {
// Ref interna para o elemento <input>
const inputRef = useRef();
// Expondo métodos específicos para o componente pai usar
useImperativeHandle(ref, () => ({
focus: () => {
inputRef.current.focus();
},
// Outros métodos, se necessário
}));
return <input ref={inputRef} />;
});
// Componente pai que utiliza a ref personalizada
const ParentComponent = () => {
// Ref para o componente filho
const childRef = useRef();
// Chamando o método focus do componente filho através da ref
const handleClick = () => {
childRef.current.focus();
};
return (
<div>
{/* Utilizando o componente filho encaminhando a ref */}
<ChildComponent ref={childRef} />
{/* Botão que chama o método focus do componente filho */}
<button onClick={handleClick}>Focus no Input</button>
</div>
);
};
Neste exemplo, useImperativeHandle
é usado para expor um método focus
da ref do componente filho. Isso permite que o componente pai chame diretamente o método focus
do <input>
contido no componente filho.
Observação
Embora o
useImperativeHandle
seja uma ferramenta útil, é aconselhável usá-lo com moderação. Em muitos casos, é possível projetar componentes de forma que a comunicação ocorra principalmente por meio de props e state, evitando a necessidade de manipular refs diretamente.