当前位置: 首页 > article >正文

React中forwardRef()的作用?

文章目录

  • 前言
  • 一、forwardRef( )有啥用?
  • 二、使用步骤
    • 1.不分模块组件调用
    • 2.分模块组件调用
  • 总结


前言

react中forwardRef()的基本使用,这里我只是列举了我自己开发时使用的方法,也可以使用该hook来获取dom节点的转发,来操作dom(本文就不详细说,就简单介绍了通过这个hook来调用各个独立组件的方法)


一、forwardRef( )有啥用?

在React中,forwardRef 是一个非常有用的高阶组件(HOC),它允许你将 ref 自动地通过组件传递给子组件。这在你需要直接访问 DOM 节点或组件实例时特别有用

二、使用步骤

这个通常和useRef()来配合使用,下面我们来使用forwardRef() 来实现函数式组件中获取实例来调用组件中的方法。(尤其是在使用函数组件时,因为函数组件没有实例,且默认情况下不接收 refs。)

1.不分模块组件调用

代码如下(示例):

import { useImperativeHandle } from "react";
import { useRef, forwardRef } from "react";

//子组件Son
const Son = forwardRef((props, ref) => {
  useImperativeHandle(ref, () => ({
    // 暴露的方法
    sayHello() {
      console.log("我被父组件调用了");
    },
  }));
  return <div>son</div>;
});

// 父组件App
function App() {
  const appRef = useRef(null);
  const handleClick = () => {
    appRef.current.sayHello();
  };
  return (
    <>
      <Son ref={appRef} />
      <button onClick={handleClick}>我想调用子组件中的方法</button>
    </>
  );
}

export default App;

2.分模块组件调用

代码如下(示例):App组件的代码

import { useRef, forwardRef } from "react";

//引入子组件Son
import Son from "./pages/Son";
// 父组件App
function App() {
  // 创建ref对象
  const appRef = useRef(null);
  // 触发Son组件中的sayHello()方法
  const handleClick = () => {
    appRef.current.sayHello();
  };
  return (
    <>
    	// 绑定ref
      <Son ref={appRef} />
      <button onClick={handleClick}>我想调用子组件中的方法</button>
    </>
  );
}

export default App;

代码如下(示例):Son组件的代码(useImperativeHandle 使用了这个hook来暴露方法)

import { forwardRef } from "react";
import { useImperativeHandle } from "react";
// eslint-disable-next-line react/display-name
const Son = forwardRef((props, ref) => {
  useImperativeHandle(ref, () => ({
    // 暴露的方法
    sayHello() {
      console.log("我被父组件调用了");
    },
  }));
  return <div>son</div>;
});

export default Son;

在这里插入图片描述

总结

其实还有很多传值调用的方法,比如使用状态管理工具、Context、父传子,子传父,根据自己需求来做就可以,只是我本人学习心得,如果有啥建议欢迎讨论。


http://www.kler.cn/news/309554.html

相关文章:

  • python多进程程序设计 之二
  • 基于深度学习的文本引导的图像编辑
  • 【我的 PWN 学习手札】Largebin Attack(< glibc-2.30)
  • linux-Shell 编程-Shell 脚本基础
  • lvs命令介绍
  • k8s部署jumpserver4.0.2
  • Redis(redis基础,SpringCache,SpringDataRedis)
  • golang学习笔记24——golang微服务中配置管理问题的深度剖析
  • Unity3D 游戏数据本地化存储与管理详解
  • 深度智能:迈向高级时代的人工智能
  • ELK 日志分析
  • 十五、谷粒商城- 报错汇总
  • 16个AI应用技巧,职场提升永远可以相信!
  • 新书速览|NestJS全栈开发解析:快速上手与实践
  • C#通过MXComponent与三菱PLC通信
  • vue2基础系列教程之v-model及面试高频问题
  • CSP-J 算法基础 广度优先搜索BFS
  • 展锐平台手机camera 软硬件架构
  • 2024ICPC网络赛第一场
  • 【源代码+仿真+原理图+技术文档+演示视频+软件】基于物联网技术的宠物居家状况监测系统设计与实现
  • Kotlin 极简小抄 P1(变量与常量、基本数据类型、流程控制)
  • 【C++】一次rustdesk-server编译记录
  • 从数据仓库到数据中台再到数据飞轮:社交媒体的数据技术进化史
  • 计算机人工智能前沿进展-大语言模型方向-2024-09-12
  • LED灯、蜂鸣器、继电器的控制
  • 【店雷达全网图搜比价盘点】1688、淘宝、阿里国际、亚马逊、速卖通5大平台
  • 一次渲染十万条数据:前端技术优化(上)
  • Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器
  • 分布式中间件-redis相关概念介绍
  • B3636 文字工作