import React, {
useState,
useRef,
useImperativeHandle,
useCallback
} from "react";
// 子组件
const Child = React.forwardRef((props, ref) => {
const [fresh, setFresh] = useState(false);
const attRef = useRef(0);
// 根据 fresh 是否展示最新 ref,而不是总是最新值
useImperativeHandle(
ref,
() => ({
attRef,
fresh
}),
[fresh] // 依赖
);
const handleClick = useCallback(() => {
attRef.current++;
}, []);
return (
<div>
{attRef.current}
<button onClick={handleClick}>Fancy</button>
<button onClick={() => setFresh(!fresh)}>刷新</button>
</div>
);
});
// 父组件
const App = (props) => {
const fancyInputRef = useRef();
return (
<div>
<Child ref={fancyInputRef} />
<button onClick={() => console.log(fancyInputRef.current)}>
父组件访问子组件的实例属性
</button>
</div>
);
};
export default App;