react中使用ref和useImperativeHandle
1.使用ref
- useRef只能在函数组件中使用
- createRef既可以在函数中使用 也可以在类函数中使用
let prev1,
prev2;
const Demo = function Demo() {
let [num, setNum] = useState(0);
let box1 = useRef(null),
box2 = React.createRef();
if (!prev1) {
prev1 = box1;
prev2 = box2;
} else {
console.log(prev1 === box1);
console.log(prev2 === box2);
}
useEffect(() => {
console.log(box1.current);
console.log(box2.current);
});
return <div className="demo">
<span className="num" ref={box1}>{num}</span>
<span className="num" ref={box2}>哈哈哈</span>
<Button type="primary" size="small"
onClick={() => {
setNum(num + 1);
}}>
新增
</Button>
</div>;
};
2.使用useImperativeHandle
class Child extends React.Component {
state = { x: 1000 };
render() {
return <div className="child-box">
{this.state.x}
</div>;
}
}
const Child = React.forwardRef(function Child(props, ref) {
return <div className="child-box">
<span ref={ref}>哈哈哈</span>
</div>;
});
const Child = React.forwardRef(function Child(props, ref) {
let [text, setText] = useState('你好世界');
const submit = () => { };
useImperativeHandle(ref, () => {
return {
text,
submit
};
});
return <div className="child-box">
<span>哈哈哈</span>
</div>;
});
const Demo = function Demo() {
let x = useRef(null);
useEffect(() => {
console.log(x.current);
}, []);
return <div className="demo">
//将创建的ref传给子组件
<Child ref={x} />
</div>;
};