The useImperativeHandle hook allows you to customize the instance value that is exposed to parent components when using ref
. This can be useful when you need to provide a certain interface to parent components, but you don't want to expose all of the internal implementation details of a child component.
Here’s an example of how to use useImperativeHandle:
import React, { useRef, useImperativeHandle } from 'react'; const Input = React.forwardRef((props, ref) => { const inputRef = useRef(); useImperativeHandle(ref, () => ({ focus: () => { inputRef.current.focus(); }, value: inputRef.current.value })); return ( <input type="text" ref={inputRef} placeholder={props.placeholder} /> ); }); function App() { const inputRef = useRef(); const handleClick = () => { inputRef.current.focus(); }; return ( <div> <Input ref={inputRef} placeholder="Type here" /> <button onClick={handleClick}>Focus input</button> </div> ); }
In this example, we define a custom Input
component that uses useImperativeHandle
to expose a focus
method and a value
property to parent components when using ref
. The useImperativeHandle
hook takes two arguments: the ref
object and a callback function that returns an object with the properties and methods that should be exposed to parent components.
In the App
component, we use the Input
component and pass a ref
object to it. We also define a handleClick
function that calls the focus
method of the inputRef
object when a button is clicked.
When you run this code, you’ll see an input field with a placeholder text and a button that says “Focus input”. When you click the button, the focus
method of the inputRef
object is called, and the input field is focused.
In summary, the useImperativeHandle
hook allows you to customize the instance value that is exposed to parent components when using ref
. This can be useful when you need to provide a certain interface to parent components but don't want to expose all of the internal implementation details of a child component.