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;
相关推荐
剪刀石头布啊3 分钟前
js数组之快速组、慢数组、密集数组、稀松数组
前端
mango_mangojuice25 分钟前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
Days20501 小时前
简单处理接口返回400条数据本地数据分页加载
前端
MZ_ZXD0011 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
Novlan11 小时前
@tdesign/uniapp 图标瘦身
前端
ManThink Technology1 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
. . . . .2 小时前
shadcn组件库
前端
2501_944711432 小时前
JS 对象遍历全解析
开发语言·前端·javascript
发现一只大呆瓜2 小时前
虚拟列表:支持“向上加载”的历史消息(Vue 3 & React 双版本)
前端·javascript·面试
css趣多多3 小时前
ctx 上下文对象控制新增 / 编辑表单显示隐藏的逻辑
前端