React报错之ref返回undefined或null
2023-02-18 16:41:37 时间
正文从这开始~
总览
当我们试图在其对应的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上。
相关文章
- UIAutomator测试框架介绍
- PyQuery详解
- 爬虫的基本原理
- “Navicat Premium”已损坏,无法打开, 您应该将它移到废纸篓的解决办法
- scrapy解析与数据库
- 爬虫技术-Scrapy框架介绍
- 爬虫技术-滑块验证码
- 爬虫技术-验证码处理
- 爬虫技术-字体反爬
- 爬虫技术-RPC技术讲解
- 爬虫技术-cookie反爬讲解
- 性能调优命令之jmap
- jenkins邮件报警机制配置
- Selenium 模拟键盘操作
- Jenkins踩坑记录:环境变量PATH没有/usr/local/bin
- HttpRunner V3.x 从入门到精通
- Jmeter之事务控制器
- Jmeter之集合点
- Jmeter之定时器
- Jmeter之断言处理