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;
相关推荐
OpenTiny社区23 分钟前
AI-Extension:让 AI 真的「看得到、动得了」你的浏览器
前端·ai编程·mcp
IT_陈寒25 分钟前
Redis缓存击穿:3个鲜为人知的防御策略,90%开发者都忽略了!
前端·人工智能·后端
农夫山泉不太甜2 小时前
Tauri v2 实战代码示例
前端
yuhaiqiang2 小时前
被 AI 忽悠后,开始怀念搜索引擎了?
前端·后端·面试
红色石头本尊2 小时前
1-umi-前端工程化搭建
前端
真夜2 小时前
关于对echart盒子设置百分比读取的宽高没有撑开盒子解决方案
前端
楠木6852 小时前
RAG 资料库 Demo 完整开发流程
前端·ai编程
肠胃炎3 小时前
挂载方式部署项目
服务器·前端·nginx
像我这样帅的人丶你还3 小时前
使用 Next.js + Prisma + MySQL 开发全栈项目
前端
FPGA小迷弟3 小时前
FPGA 时序约束基础:从时钟定义到输入输出延迟的完整设置
前端·学习·fpga开发·verilog·fpga