forwardRef 暴露dom节点
作用:使用ref暴露DOM节点给父组件
案例
例如在父组件中想要获取子组件input的输入值,和让input获取焦点
父组件
javascript
import { Button } from 'antd-mobile'
import Son from "./components/son";
import { useState,useRef } from "react";
const Year = () => {
const inputRef = useRef(null)
const getinputRef =()=>{
console.log(inputRef);
console.log(inputRef.current.value); //子组件的输入内容
inputRef.current.focus() //获取焦点
}
return (
<div>
父组件
<Son ref={inputRef}></Son>
<div className="purple-theme">
<Button color="primary" onClick={getinputRef}>按钮</Button>
</div>
</div>
);
};
export default Year;
子组件
javascript
import { forwardRef } from "react";
const Son = forwardRef((props,ref) => {
console.log('我是子组件');
return (
<div>
我是子组件
<input type="text" ref={ref}></input>
</div>
);
})
export default Son;
useImperativeHandle 暴露子组件方法
作用:使用ref暴露子组件中的方法
案例
父组件通过ref调用子组件内部的focus方法实现使input获取焦点
子组件
javascript
import { forwardRef,useImperativeHandle,useRef } from "react";
import { Button } from 'antd-mobile'
const Son = forwardRef((props,ref) => {
console.log('我是子组件');
const inputRef = useRef(null)
//聚焦方法
const FocusInput = ()=>{
console.log(inputRef);
inputRef.current.focus()
}
// 把子组件方法暴露出去
useImperativeHandle(ref,()=>{
return {
FocusInput
}
})
return (
<div>
我是子组件
<input type="text" ref={inputRef}></input>
</div>
);
})
export default Son;
父组件
javascript
import { Button } from 'antd-mobile'
import Son from "./components/son";
import { useState,useRef } from "react";
const Year = () => {
const SonRef = useRef(null)
//调用子组件暴露的方法
const getinputRef =()=>{
SonRef.current.getinputRef()
}
return (
<div>
父组件
<Son ref={SonRef}></Son>
<div className="purple-theme">
<Button color="primary" onClick={getinputRef}>按钮</Button>
</div>
</div>
);
};
export default Year;