一、 介绍

React.forwardRef 会创建一个React组件,这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中。这种技术并不常见,但在以下两种场景中特别有用:

  • 转发 refs 到 DOM 组件
  • 在高阶组件中转发 refs

二、案例效果

将父组件的ref 传递给子组件

三、代码案例

父组件

const container = useRef(null);// 子组件<ContextMenuref={container}visible={isSelectList}clickX={clickX}clickY={clickY}menuDataList={menuDataList}/>

子组件

import React, {useState, useEffect, forwardRef,
} from 'react';
import PropTypes from 'prop-types';
import './index.scss';import { getMenuStyle } from '../card/card.service';const ContextMenu = forwardRef(({visible, clickX, clickY, menuDataList,
}, ref) => {const [menuStyle, setMenuStyle] = useState({});useEffect(() => {if (visible) {const { current } = ref;setMenuStyle(getMenuStyle(clickX, clickY, current));} else {setMenuStyle({ visibility: 'hidden' });}}, [visible]);// eslint-disable-line react-hooks/exhaustive-depsreturn (<ul className="chooseList-box" style={menuStyle} ref={ref}>{menuDataList.map((menuItem) => (menuItem.isEnabled ? (<li role="presentation" onClick={menuItem.clickEvent} key={menuItem.menuContent}>{menuItem.menuContent}</li>) : (<li className="disabledLi" key={menuItem.menuContent}>{menuItem.menuContent}</li>)))}</ul>);
});
ContextMenu.propTypes = {visible: PropTypes.bool.isRequired,menuDataList: PropTypes.arrayOf(PropTypes.object).isRequired,clickX: PropTypes.number.isRequired,clickY: PropTypes.number.isRequired,
};export default ContextMenu;

forwardRef 的详解及使用相关推荐

  1. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  2. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  3. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  4. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  5. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  6. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  7. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  8. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  9. pytorch nn.LSTM()参数详解

    输入数据格式: input(seq_len, batch, input_size) h0(num_layers * num_directions, batch, hidden_size) c0(num ...

最新文章

  1. R语言使用for循环绘制多个模型的DCA(Decision Curve Analysis)曲线并保存特定分辨率的DCA曲线的结果文件
  2. python2(中文编码问题):UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1...
  3. Docker用Dockerfile定制镜像
  4. 周四话分析:数据驱动,如何塑造下一个“教育领头羊”?
  5. cuda-convnet2编译
  6. rails 构建 API
  7. Oracle DBA课程系列笔记(16)
  8. Ubuntu16 python2.7升级python3.5
  9. 【MySQL】MySQL中的查询语句的详解----等值连接、左连接、右连接、全连接
  10. docker-for-windows配置了阿里云镜像,仍然无法获得链接:(Client.Timeout exceeded while awaiting headers)
  11. 实验3.3 设计一个用于人事管理的People(人员)类
  12. 我的第一个python web开发框架(23)——代码版本控制管理与接口文档
  13. swt中关于Text.setSelection()的记录
  14. pymysql.err.OperationalError: 1136, Column count doesn t match value count at row 1
  15. OpenCV Python 直方图
  16. linux tar解压bin文件,linux下 tar解压 gz解压 bz2等各种解压文件使用方法
  17. 【测试】11月11日的测试
  18. 计算机用户删除会怎样,电脑注销会删掉内容吗,电脑注销后会删除账户吗
  19. npm安装报错(npm ERR code EPERM npm ERR syscall mkdir npm ERR path CProgram Filesnodejsnode_ca...)
  20. ArcMap 属性连接和空间连接用法

热门文章

  1. 高中关于人工智能方面的课题_《人工智能的发展与应用》课题开题报告
  2. 崩三类卡通渲染解析及制作规范
  3. java培优学习笔记(一)多线程快速入门
  4. readelf命令和ELF文件详解
  5. TCP/IP协议,卷一第42页错误
  6. 线程池原理(ThreadPoolExecutor)
  7. 【终端快捷键】Linux terminal 终端常用快捷键
  8. linux安全之服务安全
  9. Kafka系列之:增加Kafka节点扩展Kafka集群
  10. speedoffice(Excel)如何画直线