下图是useRef的demo效果图,经过“一个父组件嵌套一个子组”件来总结一些知识点。react
import React, {
useRef,
useEffect,
useImperativeHandle,
forwardRef,
} from "react";
const RefDemo = () => {
const domRef = useRef(1);
const childRef = useRef(null);
useEffect(() => {
console.log("ref:deom-init", domRef, domRef.current);
console.log("ref:child-init", childRef, childRef.current);
});
const showChild = () => {
console.log("ref:child", childRef, childRef.current);
childRef.current.say();
};
return (
<div style={{ margin: "100px", border: "2px dashed", padding: "20px" }}>
<h2>这是外层组件</h2>
<div
onClick={() => {
console.log("ref:deom", domRef, domRef.current);
domRef.current.focus();
domRef.current.value = 'hh';
}}
>
<label>这是一个dom节点</label><input ref={domRef} />
</div>
<br />
<p onClick={showChild} style={{ marginTop: "20px" }}>
这是子组件
</p>
<div style={{ border: "1px solid", padding: "10px" }}>
<Child ref={childRef} />
</div>
</div>
);
};
export default RefDemo;
复制代码
const Child = forwardRef((props, ref) => {
useImperativeHandle(ref, () => ({
say: sayHello,
}));
const sayHello = () => {
alert("hello,我是子组件");
};
return <h3>子组件</h3>;
});
等同于 =>
const ChildComponent = (props, ref) => {
useImperativeHandle(ref, () => ({
say: sayHello,
}));
const sayHello = () => {
alert("hello,我是子组件");
};
return <h3>子组件</h3>;
};
const Child = forwardRef(ChildComponent);
复制代码