Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >React报错之ref返回undefined或null

React报错之ref返回undefined或null

作者头像
chuckQu
发布于 2022-08-19 08:34:02
发布于 2022-08-19 08:34:02
1.3K00
代码可运行
举报
文章被收录于专栏:前端F2E前端F2E
运行总次数:0
代码可运行

原文链接:https://bobbyhadz.com/blog/react-ref-returns-undefined-or-null[1]

作者:Borislav Hadzhiev[2]

正文从这开始~

总览

当我们试图在其对应的DOM元素被渲染之前访问其current属性时,React的ref通常会返回undefined或者null。为了解决该问题,可以在useEffect钩子中访问ref,或者当事件触发时再访问ref

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 元素还没有被渲染。

事件

你也可以在事件处理函数中访问refcurrent属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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上。

参考资料

[1]

https://bobbyhadz.com/blog/react-ref-returns-undefined-or-null: https://bobbyhadz.com/blog/react-ref-returns-undefined-or-null

[2]

Borislav Hadzhiev: https://bobbyhadz.com/about

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端F2E 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
React报错之Cannot assign to 'current' because a read-only property
原文链接:https://bobbyhadz.com/blog/react-cannot-assign-to-current-because-read-only-property[1]
chuckQu
2022/08/19
1.1K0
React报错之Cannot assign to 'current' because a read-only property
React报错之Function components cannot have string refs
当我们在一个函数组件中使用一个字符串作为ref时,会产生"Function components cannot have string refs"错误。为了解决该错误,使用useRef()钩子来得到一个可变的ref对象,这样你就可以在组件中作为ref使用。
chuckQu
2023/02/13
8780
React报错之Function components cannot have string refs
React技巧之打开文件输入框
原文链接:https://bobbyhadz.com/blog/react-open-file-input-on-button-click[1]
chuckQu
2022/08/19
9620
React技巧之打开文件输入框
React报错之react component changing uncontrolled input
原文链接:https://bobbyhadz.com/blog/react-component-changing-uncontrolled-input[1]
chuckQu
2022/08/19
3750
React报错之react component changing uncontrolled input
React报错之You provided a `checked` prop to a form field
当我们在多选框上设置了checked 属性,却没有onChange 处理函数时,会产生"You provided a checked prop to a form field without an onChange handler"错误。为了解决该错误,可以使用defaultChecked 属性,或者在表单字段上设置onChange 属性。
chuckQu
2022/09/20
1.7K0
React报错之You provided a `checked` prop to a form field
React技巧之在state数组中添加元素
原文链接:https://bobbyhadz.com/blog/react-push-to-state-array[1]
chuckQu
2022/08/19
2.8K0
React技巧之在state数组中添加元素
React技巧之处理tab页关闭事件
原文链接:https://bobbyhadz.com/blog/react-handle-tab-close-event[1]
chuckQu
2022/08/19
1.9K0
React技巧之useRef钩子
原文链接:https://bobbyhadz.com/blog/react-update-state-when-props-change[1]
chuckQu
2022/08/19
5820
React技巧之useRef钩子
React技巧之使用ref获取元素宽度
原文链接:https://bobbyhadz.com/blog/react-get-element-width-ref[1]
chuckQu
2022/08/19
4.1K0
React技巧之设置data属性
原文链接:https://bobbyhadz.com/blog/react-set-data-attribute[1]
chuckQu
2022/08/19
1.7K0
React技巧之设置data属性
React报错之React Hook 'useEffect' is called in function
为了解决错误"React Hook 'useEffect' is called in function that is neither a React function component nor a custom React Hook function",可以将函数名的第一个字母大写,或者使用use作为函数名的前缀。比如说,useCounter使其成为一个组件或一个自定义钩子。
chuckQu
2022/09/20
1.3K0
React报错之React Hook 'useEffect' is called in function
React技巧之检查元素是否可见
原文链接:https://bobbyhadz.com/blog/react-check-if-element-in-viewport[1]
chuckQu
2022/08/19
1.1K0
React报错之Object is possibly null
原文链接:https://bobbyhadz.com/blog/react-useref-object-is-possibly-null[1]
chuckQu
2022/08/19
8880
React报错之Object is possibly null
React技巧之获取元素类名
原文链接:https://bobbyhadz.com/blog/react-get-class-name-of-element[1]
chuckQu
2022/08/19
1.3K0
React技巧之调用子组件函数
原文链接:https://bobbyhadz.com/blog/react-call-function-in-child-component[1]
chuckQu
2022/08/19
2K0
React技巧之调用子组件函数
React技巧之表单提交获取input值
原文链接:https://bobbyhadz.com/blog/react-get-form-input-value-on-submit[1]
chuckQu
2022/08/19
1.6K0
React技巧之表单提交获取input值
React报错之Expected `onClick` listener to be a function
当我们为元素的onClick属性传递一个值,但是该值却不是函数时,会产生"Expected onClick listener to be a function"报错。为了解决该报错,请确保只为元素的onClick属性传递函数。
chuckQu
2022/08/19
1.1K0
React报错之Expected `onClick` listener to be a function
React报错之`value` prop on `input` should not be null
原文链接:https://bobbyhadz.com/blog/react-value-prop-on-input-should-not-be-null[1]
chuckQu
2022/08/19
7080
React报错之`value` prop on `input` should not be null
React报错之Objects are not valid as a React child
原文链接:https://bobbyhadz.com/blog/react-objects-are-not-valid-as-react-child[1]
chuckQu
2022/08/19
1.3K0
React报错之Objects are not valid as a React child
React Ref 使用总结
useRef 还可以传入一个初始值,这个值会保存在 ref.current 中,上面代码中,如果不给 div 元素传递 ref={divRef},则 divRef.current 的值将是我们传入的初始值。
多云转晴
2020/09/08
7K0
React Ref 使用总结
相关推荐
React报错之Cannot assign to 'current' because a read-only property
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验