Чтобы использовать useImperativeHandle
, вам нужно работать с другим экземпляром ref
, например так:
const Text = React.forwardRef(({ onClick }, ref) => {
const buttonRef = React.useRef();
React.useImperativeHandle(
ref,
() => ({
getLocation: () => buttonRef.current.getBoundingClientRect()
}),
[buttonRef]
);
return (
<button onClick={onClick} ref={buttonRef}>
Press Me
</button>
);
});
Если вы хотите, чтобы ваш логин c был действительным (используя то же самое перенаправлено ref
), это будет работать:
const Text = React.forwardRef(({ onClick }, ref) => {
React.useEffect(() => {
ref.current.getLocation = ref.current.getBoundingClientRect;
}, [ref]);
return (
<button onClick={onClick} ref={ref}>
Press Me
</button>
);
});
Почему ваш пример не работает?
Поскольку ref.current.getBoundingClientRect
недоступен в момент назначения в useImperativeHandle
(попробуйте зарегистрировать его), потому что вы фактически переопределили ref
кнопки с помощью useImperativeHandle
(отметьте Text3
в песочнице, значение ref.current
имеет getLocation
, назначенное после монтирования).