函数组件在 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()方法之类的方法。