React报错Function components cannot have string refs

 更新时间:2022年12月16日 08:43:38   作者:chuck  
这篇文章主要为大家介绍了React报错Function components cannot have string refs解决方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

总览

当我们在一个函数组件中使用一个字符串作为ref时,会产生"Function components cannot have string refs"错误。为了解决该错误,使用useRef()钩子来得到一个可变的ref对象,这样你就可以在组件中作为ref使用。

这里有个示例用来展示错误是如何发生的。

// App.js
export default function App() {
  // A string ref has been found within a strict mode tree.
  // ⛔️ Function components cannot have string refs.
  // We recommend using useRef() instead.
  return (
    <div>
      <input type="text" id="message" ref="msg" />
    </div>
  );
}

上述代码片段的问题在于,我们使用了字符串作为ref

useRef

为了解决该错误,使用useRef钩子来获取可变的ref对象。

// App.js
import {useEffect, useRef} from 'react';
export default function App() {
  const refContainer = useRef(null);
  useEffect(() => {
    // 👇️ this is reference to input element
    console.log(refContainer.current);
    refContainer.current.focus();
  }, []);
  return (
    <div>
      <input type="text" id="message" ref={refContainer} />
    </div>
  );
}

useRef()钩子可以被传递一个初始值作为参数。该钩子返回一个可变的ref对象,其.current属性被初始化为传递的参数。

需要注意的是,我们必须访问ref对象上的current属性,以获得对我们设置了ref属性的input元素的访问。

当我们传递ref属性到元素上时,比如说,<input ref={myRef} /> 。React将ref对象上的.current属性设置为相应的DOM节点。

useRef钩子创建了一个普通的JavaScript对象,但在每次渲染时都给你相同的ref对象。换句话说,它几乎是一个带有.current属性的记忆化对象值。

不会重新渲染

应该注意的是,当你改变refcurrent属性的值时,不会引起重新渲染。

例如,一个ref不需要包含在useEffect钩子的依赖数组中,因为改变它的current属性不会引起重新渲染。

// App.js
import {useEffect, useRef} from 'react';
export default function App() {
  const refContainer = useRef(null);
  const refCounter = useRef(0);
  useEffect(() => {
    // 👇️ this is reference to input element
    console.log(refContainer.current);
    refContainer.current.focus();
    // 👇️ incrementing ref value does not cause re-render
    refCounter.current += 1;
    console.log(refCounter.current);
  }, []);
  return (
    <div>
      <input type="text" id="message" ref={refContainer} />
    </div>
  );
}

例子中的useEffect钩子只运行了2次,因为useRef在其内容发生变化时并没有通知我们。

改变对象的current属性并不会导致重新渲染。

以上就是React报错Function components cannot have string refs的详细内容,更多关于React报错Function components cannot have string refs的资料请关注脚本之家其它相关文章!

相关文章

  • 详解基于webpack搭建react运行环境

    详解基于webpack搭建react运行环境

    本篇文章主要介绍了详解基于webpack搭建react运行环境,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • React使用Props实现父组件向子组件传值

    React使用Props实现父组件向子组件传值

    在React中,组件之间的数据传递通常是通过属性(Props)来实现的,父组件可以通过属性向子组件传递数据,这是React组件通信的基础模式之一,本文将探讨如何使用Props来实现父组件向子组件传递数据,需要的朋友可以参考下
    2025-04-04
  • React Hook实现对话框组件

    React Hook实现对话框组件

    这篇文章主要为大家详细介绍了React Hook实现对话框组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • React使用Electron开发桌面端的详细流程步骤

    React使用Electron开发桌面端的详细流程步骤

    React是一个流行的JavaScript库,用于构建Web应用程序,结合Electron框架,可以轻松地将React应用程序打包为桌面应用程序,本文详细介绍了使用React和Electron开发桌面应用程序的步骤,需要的朋友可以参考下
    2023-06-06
  • React使用redux基础操作详解

    React使用redux基础操作详解

    这篇文章主要介绍了如何在React中直接使用Redux,目前redux在react中使用是最多的,所以我们需要将之前编写的redux代码,融入到react当中去,本文给大家详细讲解,需要的朋友可以参考下
    2023-01-01
  • React中setState是同步的还是异步的

    React中setState是同步的还是异步的

    这篇文章主要介绍了React中setState是同步的还是异步的,这是一个经典的 React 面试题,但答案并不是简单的“同步”或“异步”,需要分情况讨论,下面就来详细的介绍一下
    2026-06-06
  • React大文件分片上传原理及方案

    React大文件分片上传原理及方案

    前端进行大文件分片上传的方案几乎都是利用Blob.prototype.slice方法对文件进行分片,用数组将每一个分片存起来,最后将分片发给后端,本文给大家介绍React大文件分片上传方案,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • React创建对话框组件的方法实例

    React创建对话框组件的方法实例

    在项目开发过程中,对于复杂的业务选择功能很常见,下面这篇文章主要给大家介绍了关于React创建对话框组件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • React Fragment介绍与使用详解

    React Fragment介绍与使用详解

    本文主要介绍了React Fragment介绍与使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • react实现动态增减表单项的示例代码

    react实现动态增减表单项的示例代码

    在做项目的时候,甲方给的信息有限,网页的备案信息写成固定的,之后验收的时候,甲方要求把这个备案信息写成动态的,可以自增减,下面通过实例代码给大家介绍react实现动态增减表单项的示例,感兴趣的朋友跟随小编一起看看吧
    2024-05-05

最新评论