React报错之ref返回undefined或null
正文从这开始~
总览
当我们试图在其对应的DOM元素被渲染之前访问其current
属性时,React的ref通常会返回undefined
或者null
。为了解决该问题,可以在useEffect
钩子中访问ref
,或者当事件触发时再访问ref
。
import {useRef, useEffect} from 'react';
export default function App() {
const ref = useRef();
console.log(ref.current); // ️ undefined here
useEffect(() => {
const el2 = ref.current;
console.log(el2); // ️ element here
}, []);
return (
<div>
<div ref={ref}>
<h2>Hello</h2>
</div>
</div>
);
}
useEffect
useRef()
钩子可以传递一个初始值作为参数。该钩子返回一个可变的ref
对象,ref
对象上的current
属性被初始化为传递的参数。
我们没有为useRef
传递初始值,因此其current
属性设置为undefined
。如果我们将null
传递给钩子,如果立即访问其current
属性,将会得到null
。
需要注意的是,我们必须访问
ref
对象上的current
属性,以此来访问设置了ref
属性的div
元素。
当我们为元素传递ref
属性时,比如说,<div ref={myRef} />
,React将ref
对象的.current
属性设置为相应的DOM节点。
我们使用useEffect
钩子,是因为我们想要确保ref
已经设置在元素上,并且元素已经渲染到DOM上。
如果我们尝试在组件中直接访问ref
上的current
属性,我们会得到undefined,是因为 ref
还没有被设置,而且 div
元素还没有被渲染。
事件
你也可以在事件处理函数中访问ref
的current
属性。
import {useRef, useEffect} from 'react';
export default function App() {
const ref = useRef();
console.log(ref.current); // ️ undefined here
useEffect(() => {
const el2 = ref.current;
console.log(el2); // ️ element here
}, []);
const handleClick = () => {
console.log(ref.current); // ️ element here
};
return (
<div>
<div ref={ref}>
<h2>Hello</h2>
</div>
<button onClick={handleClick}>Click</button>
</div>
);
}
当用户点击按钮的时候,ref
已经被设置好了,相应的元素已经被渲染到DOM中,所以我们能够访问它。
总结
可以在useEffect
钩子中访问ref
,或者当事件触发时再访问ref
。也就是说,要确保元素已经渲染到DOM上。
React报错之ref返回undefined或null的更多相关文章
- vue3.0使用tui.image-editor图片编辑组件报错TypeError: Cannot convert undefined or null to object
在vue3.0的项目中使用tui.image-editor组件.一直都是报错.查看报错位置发现代码 addEventListener() { Object.keys(this.$listeners). ...
- #定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型。其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数)。
#定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型.其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数). def get_num(num): i ...
- react 报错的堆栈处理
react报错 Warning: You cannot PUSH the same path using hash history 在Link上使用replace 原文地址https://reactt ...
- 使用CI遇到的问题报错:Call to undefined function base_url()
问题来源:在HTML文件中使用base_url()函数引入CSS文件时,发现报错:Call to undefined function base_url() 研究了一下才知道是因为没有加载url小助手 ...
- selenium调用Firefox和Chrome需要注意的一些问题,和出现的报错selenium:expected [object undefined] undefined to be a string
在高版本selenium下如:selenium3.4.3 1.高版本的selenium需要浏览器安装一些补丁驱动 Firefox:geckodriver 下载网址:http://download.cs ...
- PHP的报错级别并返回当前级别error_reporting()
定义和用法:error_reporting() 设置 PHP 的报错级别并返回当前级别.函数语法:error_reporting(report_level) 如果参数 level 未指定,当前报错级别 ...
- error_reporting() 设置 PHP 的报错级别并返回当前级别
error_reporting() 设置 PHP 的报错级别并返回当前级别. 语法 error_reporting(report_level) 如果参数 level 未指定,当前报错级别将被返回.下面 ...
- js执行函数报错Cannot set property 'value' of null怎么解决?
js执行函数报错Cannot set property 'value' of null 的解决方案: 原因:dom还没有完全加载 第一步:所以js建议放在body下面执行, 第二步:window.on ...
- hexo 报错 Cannot read property 'replace' of null
详细错误信息: FATAL Cannot read property 'replace' of null TypeError: Cannot read property 'replace' of nu ...
- react报错 TypeError: Cannot read property 'setState' of undefined
代码如下: class test extends Component { constructor(props) { super(props); this.state = { liked: false ...
随机推荐
- DataGrip给DateTime类型字段赋值当前系统默认时间
CURRENT_TIMESTAMP alter table 表名 modify column update_time DATETIME NULL DEFAULT CURRENT_TIMESTAMP O ...
- Python——第五章:pickle模块
序列化:把对象转化成二进制字节 反序列化:把二进制字节转化回对象 Pickle模块的常见用法: Pickle.dunps 把对象(数据)转化成字节 Pickle.loads 把字节转化回对象( ...
- Map的特性(有序和无序)讨论
目录 什么是红黑树? 在 Java 中,基础java.util.Map 接口本身并不保证元素的顺序.具体的实现类 HashMap 和 TreeMap 的行为(无序.有序)有所不同: HashMap 类 ...
- electron入门之试调工具remote(三)
electron入门到入土,从渲染线程中创建新窗口.2022-03-21入门版本17.1.2 electron重要概念,只有一个主线程,其他都是渲染进程或者叫子线程,他们不能直接相互操作,可以通过ip ...
- Python 潮流周刊第 35 期(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- HTTP请求转发那些事:你可能不知道的Hop-by-hop Headers和End-to-end Headers
摘要:不是所有的web容器都能帮助开发者屏蔽hop-by-hop headers,有些容器反而允许开发者自定义hop-by-hop headers来实现更大程度的灵活性. 本文分享自华为云社区< ...
- 十大 CI/CD 安全风险(四)
在上一篇文章,我们着重介绍 PPE 风险,并提供缓解相关风险的安全建议与实践.在本篇文章中,我们将会了解凭据使用环境管理不善与不安全的系统配置,并给出相应的风险缓解建议. 凭据使用管理不善 由于与凭据 ...
- BitSail“拍了拍”你,并给你一份快速入门指南
本 Quick Guide 面向 BitSail 新手入门使用人员,从源码编译.产物结构.如何提交作业.实机演示等多方面带领大家迅速入门 BitSail,从 0 到 1 了解并完成 BitSail 基 ...
- 创建一个基本的FastAPI应用程序
Python 搭建 FastAPI 项目 要生成FastAPI项目的代码,你可以使用FastAPI的脚手架工具来快速创建一个基本的FastAPI应用程序. 以下是创建一个新的FastAPI项目的步骤: ...
- AC(AtCoder) Library 文档翻译
AC(AtCoder) Library Document下载使用 如何安装 首先在 Github 上找到 ac-library 仓库.下载最新版本 解压 zip 文件后将 atcoder ,放置GCC ...