React - useRef 与 TypeScript 和功能组件

作者:编程家 分类: typescript 时间:2025-08-16

使用React - useRef和TypeScript创建功能组件

在React开发中,我们经常需要在组件中访问和操作DOM元素。在过去,我们通常使用`ref`属性来获取DOM元素的引用,但这种方式在函数组件中并不适用。为了解决这个问题,React引入了一个新的钩子函数叫做`useRef`。本文将介绍如何在使用TypeScript编写的功能组件中使用`useRef`,并提供一些实际案例代码。

使用`useRef`钩子函数

`useRef`是一个React提供的钩子函数,它返回一个可变的ref对象,可以在函数组件的整个生命周期中保持稳定。我们可以使用`useRef`来获取和操作DOM元素的引用,或者在组件之间共享数据。

下面是一个简单的示例,展示了如何在函数组件中使用`useRef`:

typescript

import React, { useRef } from 'react';

const MyComponent: React.FC = () => {

const inputRef = useRef(null);

const handleClick = () => {

if (inputRef.current) {

inputRef.current.focus();

}

};

return (

);

};

export default MyComponent;

在上面的代码中,我们创建了一个`inputRef`引用,并将其传递给`input`元素的`ref`属性。当点击按钮时,`handleClick`函数会获取`inputRef.current`的值,如果存在,则调用`focus`方法使输入框获取焦点。

使用`useRef`来保存组件之间的数据

除了用于获取和操作DOM元素的引用,`useRef`还可以用于在组件之间共享数据。由于每次渲染都会重新创建函数组件,我们无法使用普通的变量来保存数据,因为它们会在每次渲染时重新初始化。这时,`useRef`就派上用场了。下面是一个示例,展示了如何使用`useRef`来保存数据:

typescript

import React, { useRef } from 'react';

const MyComponent: React.FC = () => {

const countRef = useRef(0);

const handleClick = () => {

countRef.current += 1;

console.log(countRef.current);

};

return (

);

};

export default MyComponent;

在上面的代码中,我们创建了一个`countRef`引用,并将其初始化为0。每次点击按钮时,我们可以通过访问`countRef.current`来增加计数器的值,并将新值打印到控制台。

使用`useRef`来处理上一次的值

有时候,我们需要在组件的不同渲染之间存储某个值。例如,我们可能需要在组件更新时比较前后两次的某个状态。这时,`useRef`也可以派上用场。下面是一个示例,展示了如何使用`useRef`来保存上一次的值:

typescript

import React, { useRef, useEffect } from 'react';

const MyComponent: React.FC = () => {

const prevCountRef = useRef(null);

const count = 0;

useEffect(() => {

prevCountRef.current = count;

});

return (

Previous Count: {prevCountRef.current}

Current Count: {count}

);

};

export default MyComponent;

在上面的代码中,我们创建了一个`prevCountRef`引用,并将其初始化为`null`。在组件更新时,我们将`count`的值赋给`prevCountRef.current`,这样我们就可以在下一次渲染时获取上一次的计数器值。

使用`useRef`的注意事项

虽然`useRef`在函数组件中非常方便,但也有一些注意事项需要注意。首先,`useRef`返回的引用对象是可变的,这意味着我们可以在组件的整个生命周期中修改它的值。这样一来,我们就可以在函数组件内部保存状态,而不需要使用`useState`。

另外,需要注意的是,`useRef`返回的引用对象在每次渲染中都是稳定的。这意味着即使组件重新渲染,`useRef`返回的引用对象也不会改变。因此,当我们需要访问和操作DOM元素时,可以放心地将`useRef`用于`ref`属性。

在本文中,我们学习了如何在使用TypeScript编写的功能组件中使用`useRef`钩子函数。我们展示了如何在函数组件中获取和操作DOM元素的引用,并展示了如何使用`useRef`在组件之间共享数据。我们还展示了如何使用`useRef`来保存上一次的值,并提醒了一些使用`useRef`的注意事项。希望本文对你理解和使用`useRef`有所帮助!