forwardRef 暴露dom节点
作用:使用ref暴露DOM节点给父组件
案例
例如在父组件中想要获取子组件input的输入值,和让input获取焦点
父组件
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;
子组件
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获取焦点
子组件
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;
父组件
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;