测验

React 中的 `useRef` 钩子是什么?应该在什么时候使用它?

主题
React
在GitHub上编辑

TL;DR

React 中的 useRef 钩子用于创建一个在渲染之间保持不变的可变对象。它可用于直接访问和操作 DOM 元素,存储在更新时不导致重新渲染的可变值,以及保留对值的引用而不触发重新渲染。例如,您可以使用 useRef 来聚焦输入元素:

import React, { useRef, useEffect } from 'react';
function TextInputWithFocusButton() {
const inputEl = useRef(null);
useEffect(() => {
inputEl.current.focus();
}, []);
return <input ref={inputEl} type="text" />;
}

React 中的 useRef 钩子是什么?应该在什么时候使用它?

useRef 简介

React 中的 useRef 钩子是一个函数,它返回一个可变的 ref 对象,其 .current 属性被初始化为传递的参数 (initialValue)。返回的对象将在组件的整个生命周期内保持不变。

useRef 的关键用例

访问和操作 DOM 元素

useRef 的主要用例之一是直接访问和操作 DOM 元素。当您需要以 React 的声明式方法无法轻松实现的方式与 DOM 交互时,这特别有用。

例子:

import React, { useRef, useEffect } from 'react';
function TextInputWithFocusButton() {
const inputEl = useRef(null);
useEffect(() => {
inputEl.current.focus();
}, []);
return <input ref={inputEl} type="text" />;
}

在此示例中,useRef 钩子用于创建对输入元素的引用,而 useEffect 钩子用于在组件挂载时聚焦输入元素。

存储可变值

useRef 也可以用于存储在更新时不会导致重新渲染的可变值。这对于跟踪随时间变化但不需要触发重新渲染的值很有用。

例子:

import React, { useRef } from 'react';
function Timer() {
const count = useRef(0);
const increment = () => {
count.current += 1;
console.log(count.current);
};
return <button onClick={increment}>Increment</button>;
}

在此示例中,count 变量存储在 useRef 对象中,并且它的值递增,而不会导致组件重新渲染。

保留对值的引用

useRef 可用于保留对值的引用,而不会触发重新渲染。这对于存储需要在渲染之间保持不变但不需要在更改时导致重新渲染的值很有用。

例子:

import React, { useRef, useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
const prevCountRef = useRef();
useEffect(() => {
prevCountRef.current = count;
}, [count]);
return (
<div>
<h1>Now: {count}</h1>
<h2>Before: {prevCountRef.current}</h2>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}

在这个例子中,prevCountRef 用于保持对 count 前一个值的引用,而不会导致重新渲染。

延伸阅读

在GitHub上编辑