React-forwardRef-useImperativeHandle

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;
相关推荐
Bigger10 小时前
Tauri (26)——托盘图标总对不上系统主题?一行 Template Image 搞定
前端·rust·app
kyriewen12 小时前
面试官问你:“AI 能写 80% 的代码了,公司为什么还需要你?”
前端·javascript·面试
甲维斯13 小时前
又升级咯!坦克大战2026,科技与复古并存!
前端·人工智能·游戏开发
搬砖的码农15 小时前
(08)为什么我的 Agent 一跑后台服务就卡死
前端·agent·ai编程
飘尘15 小时前
前端转全栈(Java 后端)必须要知道的:开发中的锁机制与分布式并发控制
前端·后端·全栈
亲亲小宝宝鸭16 小时前
前端性能监控:web-vitals
前端·性能优化·监控
前端切图崽_小郭16 小时前
虚拟滚动:静态 vs 动态的核心差异与实现?
vue.js
陆枫Larry16 小时前
可滚动页面背景填不满:`height: 100vh` vs `min-height: 100vh`
前端
Patrick_Wilson16 小时前
Squash Merge 的血缘陷阱:为什么删掉的代码又活了过来
前端·git·程序员