查看hooks文档和一些博客,我们了解到当使用useRef((时,我们存储了一个可变的值。
文件:
您可能熟悉refs,它主要是作为访问DOM的一种方式。如果将ref对象传递给React,React将在相应的DOM节点发生更改时将其.current属性设置为该节点。
但是,useRef((除了用于ref属性之外,还可以用于其他用途。它可以方便地保持任何可变值,类似于在类中使用实例字段的方式。
这是因为useRef((创建了一个纯JavaScript对象。useRef((和自己创建{current:…}对象之间的唯一区别是,useRef将在每次渲染时为您提供相同的ref对象。
与只声明和使用带有let
的变量相比,这给我们带来了什么优势?
代码ex:
import React, {useRef} from "react";
const MyFunctionalComponent = (props) => {
const refVariable = useRef('value');
//versus
let letVariable = 'value';
}
跟进:给出的答案很有帮助,再加上一些测试,我得到了所需的理解。如果有人遇到这个概念有问题,我现在的理解方式是:
- 可以有实例变量,但它们确实是即时的,每次重新渲染都会重新初始化它们
- useRef((为您提供了更持久的功能,如useState((,但更新不会触发重新渲染,如果您正在以链接方式进行大量操作,但直到最后都不想触发重新渲染则非常有用
- useState((应该只绑定到UI元素使用的变量,因为状态的任何更改都会触发整个组件的重新呈现。不要有一系列操作过程中的状态,使用refs直到链的末端
最后一句话描述得很清楚:
useRef将在每次渲染时为您提供相同的ref对象。
如果您自己声明一个简单的javascript变量,它将在每次渲染时更新。当您需要在重新渲染期间保持某些值时,会使用ref(除了使用ref属性进行DOM节点引用之外(
我正在改变我的答案,并将人们推荐给下面的Arman,因为这是一个更合适的答案。本质上,对于功能组件,整个函数在每次重新渲染时都会运行。这意味着在函数体中使用简单let x = 5;
初始化的变量将在每次渲染时重新初始化,并重置它们。这就是我们需要像useRef
这样的钩子的原因,它为在渲染之间持续存在的值提供了引用