Node 之 React ref 最新版本的用法

2023-05-16

在进行React开发时,有时在组件的代码中需要访问实际的Dom对象,这个时候就要用到ref这个属性来将 dom对象的值保存进来,以便代码访问。

一、Create Ref

自从 React v16.3开始,在类组件中推荐使用React.createRef()创建Refs,通过ref附加到组件中,对该节点的引用通过ref的current属性访问

React在组件挂载时给current传入DOM元素,并在组件卸载时传入null,ref会在生命周期函数前更新完成

代码举例:

import React, { Component, createRef} from "react";
class App extends Component {
  constructor(props) {
    super(props);
    this.h1Ref = createRef();
  }
  componentDidMount() {
    console.log("React.createRef()");
    console.log(this.h1Ref.current);
  }
  render() {
    return <h1 ref={this.h1Ref}>Hello World!</h1>;
  }
}
export default App;
 

二、useRef

当在函数组件中使用React.createRef()会抛出以下错误:
Uncaught Invariant Violation: Function components cannot have refs. Did you mean to use React.forwardRef()?

原因:函数组件和class组件根本区别是,函数组件没有实例,所以无法使用实例对象,取而代之的为useRef,或使用forwardRef

作用:

获取DOM节点
获取组件实例
渲染周期之间共享数据存储(state修改会触发重新渲染,所以不能跨周期共享)
使用方法:与createRef类似,挂在current上

import React, { useEffect, useRef } from 'react';
function App() {
  const h1Ref = useRef();
  useEffect(() => {
    console.log('useRef')
    console.log(h1Ref.current)
  }, [])
  return <h1 ref={h1Ref}>Hello World!</h1>
}
export default App;
 

三、Ref 转发,用于引用子组件中的Dom元素

有时候需要引用子组件中的Dom对象,就需要传递ref给子组件,需要用到React.forwardRef函数,常规函数组件和 class 组件不接收 ref 参数,且 props 中也不存在 ref。以下这个例子展示了,将ref转发到了最终的button标签上,其实Ref 转发不仅限于 DOM 组件,你也可以转发 refs到 class组件实例中。

const FancyButton = React.forwardRef((props, ref) => (
  <button ref={ref} className="FancyButton">
    {props.children}
  </button>
));
 
// 你可以直接获取 DOM button 的 ref:
const ref = React.createRef();
// 此时的ref即React.forwardRef的参数之一
<FancyButton ref={ref}>Click me!</FancyButton>;

四、Callback Ref

在旧版本中,Callback Ref能助你更精细地控制何时 refs

被设置和解除,传递一个函数。这个函数中接受 React 组件实例或 HTML DOM 元素作为参数。

React 将在组件挂载时,会调用 ref 回调函数并传入 DOM 元素,当卸载时调用它并传入 null。在 componentDidMount 或 componentDidUpdate 触发前,React 会保证 refs 一定是最新的。

使用方式:ref={element => (this.eleref = element)}

获取DOM元素节点:

import React, { Component } from "react";
class App extends Component {
  componentDidMount() {
    console.log("Callback Ref");
    console.log(this.h1Ref);
  }
  render() {
    return (
      <div>
        <h1 ref={element => (this.h1Ref = element)}>Hello World!</h1>
      </div>
    );
  }
}
export default App;
 
// 打印结果
 Callback Ref
 <h1>Hello World!</h1>
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node 之 React ref 最新版本的用法 的相关文章

  • React(一):React的设计哲学 - 简单之美

    React 一 React的设计哲学 简单之美 React 二 React开发神器Webpack React 三 理解JSX和组件 React 四 虚拟DOM Diff算法解析 React 五 使用Flux搭建React应用程序架构 Rea
  • Umi+Dva初印象<基础应用,结构,流转逻辑>

    目录 前言 知识储备 generator函数 Dva初识 实际交互 函数式组件 class组件 前言 项目初始为umi脚手架进行初始化 lt 初始化过程 http t csdn cn cuTaY gt 工程中加载了umi自带的antd ui
  • useEffect详情用法

    1 为什么要使用useEffect 想必大家都是用过vue吧 在vue框架所写的项目中 我们通过在与后端进行数据交互的过程中 通常都是会在生命周期中进行数据的请求 然后将数据返回给页面进行渲染 在React中我们也是这样 但是在函数式组件中
  • React之state、hooks性能分析

    目录 一 state 1 为什么使用setState 2 setState异步更新 3 如何获取异步的结果 4 setState一定是异步吗 5 源码分析 6 数据的合并 7 多个state的合并 二 为什么需要Hook 三 Class组件
  • 前端学科面试题大全

    作用域和值类型引用类型的传递 变量作用域 作用域变量访问区域 变量值存在栈中 变量赋值相当于值赋值 值传递与引用传递有哪些区别 函数内部 变量会先声明 形式参数变量声明提升 整个函数体有var声明的变量 如果没有访问全局定义的num2 函数
  • react 父组件调用子组件的方法

    子组件中 const child forwardRef props ref gt useImperativeHandle ref gt 这里面的方法是暴露给父组件的 test console log 我是组件里的test方法 test2 t
  • quill编辑器使用

    官方git https github com quilljs quill 官方文档 https quilljs com 中文文档 https kang bing kui gitbook io quill 编辑器是个正经编辑器 就是文档太不正
  • 【React】 4课 react初识组件

    首先我们如1课创建一个文件夹在文件夹中安装react环境需要的配置文件 npm init y npm i babel standalone D npm i react react dom D 安装配置文件教程链接 https blog cs
  • vue发展历史简介

    基本介绍 Vue 是一套用于构建用户界面的 渐进式框架 与其它大型框架不同的是 Vue 被设计为可以自底向上逐层应用 最初它不过是个人项目 时至今日 已成为全世界三大前端框架之一 github 上拥有 17 8万 Star 领先于 Reac
  • React配置@src根路径

    第一种 直接修改node modules包中的webpack config js文件 找到node modules react scripts config webpack config js文件 修改其中alias中的配置 添加 src
  • 在 React 中,ref 是引用虚拟 DOM 还是实际 DOM?

    我假设虚拟 DOM 并且 React 通过比较来处理它 但我有一位招聘人员说 ref 会影响实际的 DOM 我不明白这是怎么回事 我认为他们只是误会了 Refs 应该引用实际的 DOM Refs 的一种用法是与第三方 DOM 库集成 因此您
  • Node.js 工作线程与子进程:应该使用哪一个

    Node js 工作线程与子进程 应该使用哪一个 并行处理在计算密集型应用程序中起着至关重要的作用 例如 考虑一个确定给定数字是否为素数的应用程序 如果我们熟悉素数 我们就会知道必须从 1 遍历到该数的平方根才能确定它是否是素数 而这通常非
  • React Jsx转换成真实DOM过程?

    面试官 说说React Jsx转换成真实DOM过程 一 是什么 react 通过将组件编写的 JSX 映射到屏幕 以及组件中的状态发生了变化之后 React 会将这些 变化 更新到屏幕上 在前面文章了解中 JSX 通过 babel 最终转化
  • 按引用传递引用与按值传递引用 - C#

    问候 我明白了按值传递和按引用传递之间的区别 但是通过 ref 传递引用 例如数组 和通过值传递数组是我似乎无法理解的 如何通过引用传递引用 int myArray 1 2 3 PassByVal myArray PassByRef ref
  • 为什么迭代器方法不能采用“ref”或“out”参数?

    我今天早些时候尝试过这个 public interface IFoo IEnumerable
  • 带 ref/Pointer 参数的 C# 反射调用方法

    我想通过反射调用类的每个方法 但无法使用指针作为引用来调用方法 通常我可以为我找到的每个指针传递 null 一切都会好起来的 问题是当函数尝试访问我传递的指针时 该指针将是对内存地址 0 的引用 这显然对我的程序来说会立即崩溃 所以我需要传
  • 无法使用 ref 调用 connect redux 组件上的子方法

    我想打电话SingleCard子组件方法renderHiddenItem 我分配了不同的ref每个的名字renderItem 但当我打电话时这个名字 it is undefined 这段代码有什么问题吗 我怎样才能实现这个目标
  • PL/SQL 打印存储过程返回的引用游标

    如何从存储过程 OUT 变量 返回的引用游标中获取数据并将结果行打印到 SQL PLUS 中的 STDOUT ORACLE存储过程 PROCEDURE GetGrantListByPI p firstname IN VARCHAR2 p l
  • 更新匿名方法内的 ref 参数

    是否有解决方法可以更新匿名方法内的 ref 参数 我知道匿名方法不允许访问外部作用域的 ref 参数 但是还有其他方法可以做到这一点吗 我正在使用 MessageStream 的外部库 因此无法更改委托的参数 void DoWork ref
  • 如何使用Vue3中的ref访问父组件中的子组件方法?

    我正在尝试使用 vue3 和 ref 方法访问父组件中的子方法 但它返回一个错误 未捕获的类型错误 addNewPaper value savePaper 不是函数 下面是我的代码 请指导我哪里错了 子组件

随机推荐

  • 服务器挂载硬盘

    BuyVM Block Storage xff08 数据盘 xff09 挂载方法 垃圾站 cyhour com fdis l 可以查看硬盘 xff1a 1 找到数据盘之后 xff0c 格式化 mkfs ext4 F dev sdb 2 创建
  • setuptools:‘NoneType‘ object has no attribute ‘split‘

    问题 xff1a 运行 python m pip install e 或者 python setup py build develop 报错 anaconda3 envs querydet lib python3 7 site packag
  • Linux卸载pycharm

    1 确保pycharm程序全部关闭之后 xff0c 进入pycharm的安装目录 xff0c 默认在 opt 2 进入Pycharm的bin目录 xff08 我也不懂为什么 xff0c 或许知道的可以告诉一声 xff09 xff0c 我的是
  • Rust Web入门(一):TCP 和 HTTP Server

    本教程笔记来自 杨旭老师的 rust web 全栈教程 xff0c 链接如下 xff1a https www bilibili com video BV1RP4y1G7KF p 61 1 amp vd source 61 8595fbbf1
  • Rust Web入门(三):连接数据库

    本教程笔记来自 杨旭老师的 rust web 全栈教程 xff0c 链接如下 xff1a https www bilibili com video BV1RP4y1G7KF p 61 1 amp vd source 61 8595fbbf1
  • 如何进入 Windows 的 Ubuntu 子系统

    很久没有用这个 Ubuntu 子系统了 xff0c 最近是因为阿里云到期了 xff0c 又不打算续费 xff0c 所以才重新用起了它 记得原来直接按 Windows 43 R xff0c 输入 ubuntu 回车 xff0c 就能进入这个系
  • Git最新教程4——使用码云Gitee使用教程,创建项目仓库并上传代码

    此git栏目均有学习笔记以及相应的视频 xff0c 视频链接在最后 xff0c 学习笔记完全开源 xff1a https gitee com SiobhanMing Siobhan studyNote 目录 一 注册登录码云 xff0c 完
  • CentOS6.5 安装ntopng-1.2.0

    0 准备工作 安装libpcap xff1a 最好源码安装 yum install y libpcap 安装redis yum install y redis 1 安装 tar zxvf ntopng cd ntopng autogen s
  • Java编程题之四个数字组成不同且无重复的三位数

    题目 有1 2 3 4四个数字 xff0c 能组成多少个互不相同且无重复数字的三位数 xff1f 都是多少 xff1f span class token keyword int span count span class token ope
  • 联想笔记本摄像头被禁用

    联想笔记本摄像头被禁用 针对摄像头 xff08 相机 QQ视频 微信视频 xff09 能够正常打开 xff0c 但是不显示画面 xff0c 如果是找不到摄像头这种问题 xff0c 关了吧 xff0c 找其他的别看这个浪费时间 这种情况可能是
  • Zoom to learn, learn to zoom超分辨网络

    目录 论文主要贡献背景创新点一 SR RAW数据集创新点二 CoBi损失函数结果结论 论文 Zhang X Chen Q Ng R et al Zoom to learn learn to zoom C Proceedings of the
  • 操作系统复习之OS的运行环境

    目录 1 3 1用户态与核心态 1 3 2中断与异常 1 3 3系统调用 例题 1 3 1用户态与核心态 在计算机系统中 xff0c CPU通常运行两种不同性质的程序 一种是操作系统内核程序 另一种是用户自编程序 xff0c 简称用户程序或
  • Docker搭建nextcloud+onlyoffice+ldap+smb协作编辑

    安装docker span class token comment 通过yum源安装docker span sudo yum span class token operator span y install docker span clas
  • 装破解软件后,容易出现hardlock.sys蓝屏警告

    一般遇到这种情况先别着急重装系统 xff0c 先进入安全模式把刚才装的软件卸载 xff0c 包括文件夹删干净 然后可以把别的电脑的hardlock sys文件直接拷贝过来替换掉 xff0c 重启一般就可以
  • windows下C++连接本地MySQL数据库

    IDE选用CLion 这是我数据库里的数据 db1数据库里的user表 首先将本地MySQL的lb文件夹里的libmysql dll和libmysql lib这两个文件复制到cmake build debug文件夹下 xff0c 这两个文件
  • Openstack 知识点概述及基本常用命令

    Openstack OpenStack既是一个社区 xff0c 也是一个项目和一个开源软件 xff0c 提供开放源码软件 xff0c 建立公共和私有云 xff0c 它提供了一个部署云的操作平台或工具集 xff0c 其宗旨在于 xff1a 帮
  • Visual Studio 2017 运行、调试使用CMake构建的多可执行程序项目

    在 Windows 环境下 xff0c 笔者主要通过 Visual Studio 进行较大型项目的查看和运行调试 这里记录下使用 Visual Studio 编译 运行和调试可能包含有多个可执行程序的多文件项目的方法 xff0c 特别的 x
  • C语言实现链表的逆序的几种方式

    文章目录 通过头插法实现的通过双指针实现链表的逆序通过栈来实现的通过递归来实现 通过头插法实现的 1 通过头插法 xff08 两条链表 xff09 来实现的 通过遍历原来的链表 xff0c 将遍历得到的每一个节点都插入到新链表的头结点 xf
  • Ubuntu进入(安全模式)修改用户密码

    一 重启系统 xff0c 开机时 xff0c 长按shift进入grub菜单 xff08 有的不用按直接进入如下菜单 xff09 xff1b 选择高级选项 xff1b 回车继续 xff1b 二 选中recovery mode xff08 如
  • Node 之 React ref 最新版本的用法

    在进行React开发时 xff0c 有时在组件的代码中需要访问实际的Dom对象 xff0c 这个时候就要用到ref这个属性来将 dom对象的值保存进来 xff0c 以便代码访问 一 Create Ref 自从 React v16 3开始 x