如果我们希望在父组件对子组件进行一些状态的变更等操作,建议由子组件暴露封装好的方法给父组件,以保证数据和操作的安全性
例如,子组件通过 useImperativeHandle 向父组件有粒度地暴露了 reset 方法,而不是直接把 count 值暴露给父组件,以保证状态的私有化和安全性
// Child.tsx
const Child = forwardRef((_, ref) => {
const [count, setCount] = useState<number>(0);
const inc = () => setCount(count + 1);
useImperativeHandle(ref, () => ({
reset: () => setCount(0)
}));
return (
<>
<div>Child Value: {count}</div>
<button onClick={inc}>add</button>
</>
);
});
export default Child;
在父组件中,调用该方法即可
const App: React.FC = () => {
const childRef = useRef<childRefType>();
const resetChild = () => {
childRef.current?.reset();
};
return (
<div>
<Child ref={childRef}></Child>
<button onClick={resetChild}>inc child value</button>
</div>
);
};
export default App;