useImperativeHandle
useImperativeHandle
customizes the instance value that’s exposed to parent components when using a ref
.
For example, we can use it as follows:
function Button(props, ref) {
const buttonRef = React.useRef();
React.useImperativeHandle(ref, () => ({
focus: () => {
buttonRef.current.focus();
}
}));
return <button ref={buttonRef}>Button</button>;
}
Button = React.forwardRef(Button);
function App() {
const buttonRef = React.useRef(null);
React.useEffect(() => {
buttonRef.current.focus();
}, []);
return (
<>
<Button ref={buttonRef} />
</>
);
}
In the code above, we have:
React.useImperativeHandle(ref, () => ({
focus: () => {
buttonRef.current.focus();
}
}));
to customize the focus
method to call buttonRef.current.focus();
.
Then we pass buttonRef
in Button
to the button
‘s ref
as follows:
<button ref={buttonRef}>Button</button>;
Then to make the ref accessible to App
, we run:
Button = React.forwardRef(Button);
Then in App
, we run:
const buttonRef = React.useRef(null);
to create the ref and:
<Button ref={buttonRef} />
to set buttonRef
to our exposed Button
‘s buttonRef
after calling forwardRef
to expose it to App
.
Then we run:
React.useEffect(() => {
buttonRef.current.focus();
}, []);
to focus the Button
component’s button
when App
first renders.
Conclusion
We can use the useCallback
hook to return a memoized callback, which we can call. It takes a callback as an argument and an array of dependencies that were referenced in the callback as the second argument.
useMemo
caches values that are computed. It takes a function that returns a value as the first argument, and an array of values that the function depends on as the second argument.
useRef
returns a mutable object whose current
property is initialized to the initial value and can be passed into the ref
prop of an element to set current
to the DOM element.
useImperativeHandle
customizes the behavior of the DOM element methods of the element that’s exposed via forwardRef
to the parent component.