函数组件在 React 中不能有字符串引用
当我们在函数组件中使用字符串作为引用时,会出现“Function components cannot have string refs”的错误。 要解决该错误,请使用 useRef() 钩子获取一个可变的 ref 对象,我们可以将其用作组件内部的 ref。
下面是产生上述错误的示例代码
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>
);
}

代码片段中的问题是我们使用字符串作为引用。
要解决该错误,请改用 useRef 钩子来获取可变引用对象。
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 对象的当前属性才能访问我们设置 ref 属性的输入元素。
当我们将 ref prop 传递给元素时,例如 ,React将ref对象的.current属性设置为对应的DOM节点。
useRef钩子创建一个普通的 JavaScript 对象,但在每次渲染时都会为您提供相同的 ref 对象。 换句话说,它几乎是一个具有.current属性的记忆对象值。
需要注意的是,当你更改 ref 的当前属性的值时,不会导致重新渲染。
例如,ref 不必包含在 useEffect 钩子的依赖项数组中,因为更改它的当前属性不会导致重新渲染。
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 在其内容更改时不会通知我们。
更改对象的当前属性不会导致重新渲染。
相关文章
在 JavaScript 中检查字符串是否是有效的 JSON 字符串
发布时间:2024/03/21 浏览次数:105 分类:JavaScript
-
本教程描述了如何在 Javascript 中检查 JSON 字符串是否有效。
使用 JavaScript 将图像转换为 Base64 字符串
发布时间:2024/03/16 浏览次数:174 分类:JavaScript
-
本文将讨论如何通过创建画布并将图像加载到其中,并使用文件读取器方法获取图像的相应字符串,将图像转换为其 base64 字符串表示。
将 JSON 字符串转换为 C# 对象
发布时间:2024/01/19 浏览次数:101 分类:编程语言
-
本教程演示如何使用 Newtonsoft.Json 包或 JavaScriptSerializer 提供的 DeserializeObject 函数将 JSON 字符串转换为 C#
C# 将对象转换为 JSON 字符串
发布时间:2024/01/19 浏览次数:192 分类:编程语言
-
本文介绍如何将 C# 对象转换为 C# 中的 JSON 字符串的不同方法。它介绍了 JavaScriptSerializer().Serialize(),JsonConvert.SerializeObject()和 JObject.FromObject()之类的方法。
在 C# 中对 Base64 字符串进行编码和解码
发布时间:2024/01/16 浏览次数:231 分类:编程语言
-
Convert 类可用于在 C# 中将标准字符串编码为 base64 字符串,并将 base64 字符串解码为标准字符串。使用 C# 中的 Convert.ToBase64String() 方法将字符串编码为 Base64 字符串
在 C# 中格式化具有固定空格的字符串
发布时间:2024/01/16 浏览次数:164 分类:编程语言
-
本教程介绍了如何在 C# 中格式化具有固定空格或填充的字符串。在本教程中,你将了解 C# 如何让你可以使用不同的方法自由地格式化具有固定空间的字符串。
如何在 C# 中将字符串转换为整型 Int
发布时间:2024/01/16 浏览次数:74 分类:编程语言
-
这篇 C# 整型转换成字符串的方法文章介绍了在 C# 中将字符串转换为整数的不同方法。本文介绍了 Int32.TryParse()方法,Convert.ToInt()方法和 Int32.Parse()方法之类的方法。

