”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > useRef 的隐藏力量:为什么它在 React 项目中至关重要

useRef 的隐藏力量:为什么它在 React 项目中至关重要

发布于2024-11-09
浏览:127

The Hidden Power of useRef: Why It’s Essential in Your React Projects

介绍

您是否曾因 React 应用程序性能缓慢而苦苦挣扎,或者发现自己在与复杂的 DOM 操作作斗争?这些都是常见的头痛问题,但您不必忍受它们。想象一个您可以轻松优化性能并操作 DOM 元素而不会导致重新渲染的世界。来认识一下 useRef,这是一个简单但功能强大的 React hook,它就可以做到这一点。

为什么 useRef 如此重要?

乍一看,useRef 似乎只是庞大的 React 生态系统中的另一个钩子,但不要低估它。这是解决两个主要痛点的秘密武器:

  1. 轻松 DOM 操作无需触发重新渲染。
  2. 通过保留不需要 UI 更新的值来提升性能

将 useRef 视为一个强大的助手,让事情保持井然有序,而不会不断引起人们的注意。它保存您需要的值或 DOM 节点,并且默默地执行此操作 - 无需重新渲染,无需大惊小怪。

用简单的术语理解 useRef

让我们简化一下。 useRef 就像一个存储盒,您可以在其中放置一些有价值的内容(例如 DOM 元素或经常更改的值)并在以后使用它,而无需每次值更改时您的 React 组件都重新渲染。

import { useRef, useEffect } from 'react';

function ExampleComponent() {
  const inputRef = useRef(null);

  useEffect(() => {
    inputRef.current.focus();  // Automatically focuses the input when the component mounts
  }, []);

  return ;
}

在此示例中,inputRef 就像通往 DOM 的直接线路。您可以直接与 DOM 元素交互,而无需触发重新渲染。那么,为什么这如此有用?

useRef 实际应用示例

1.无需重新渲染的 DOM 操作

曾经尝试过在页面加载后立即聚焦输入字段吗?或者您可能需要通过单击按钮将元素滚动到视图中。这就是 useRef 的闪光点。您可以直接操作 DOM 元素,无需进行繁琐的状态更新,从而强制进行不必要的重新渲染。

示例:单击按钮滚动到某个部分
import { useRef } from 'react';

function ScrollComponent() {
  const sectionRef = useRef(null);

  const scrollToSection = () => {
    sectionRef.current.scrollIntoView({ behavior: 'smooth' });
  };

  return (
    
      
      
Some content here...
Target Section
> ); }

这个简单的示例可以防止您的组件在与 DOM 交互时重新渲染,从而提高性能和用户体验。

2.存储可变值而不重新渲染

假设您想要跟踪单击按钮的次数。为此使用状态会在每次计数发生变化时触发重新渲染。但使用 useRef,您可以更新值而不会导致不必要的重新渲染。

示例:计算点击次数而不重新渲染
import { useRef } from 'react';

function ClickCounter() {
  const clickCount = useRef(0);

  const handleClick = () => {
    clickCount.current  = 1;
    console.log(`Clicked ${clickCount.current} times`);
  };

  return ;
}

此处,clickCount 实时更新,但由于它存储在 useRef 中,因此组件不会重新渲染,从而实现更流畅的性能。

您为什么要关心?

想象一下在一个大型、复杂的应用程序中工作,其中每个小的状态更新都会导致整个组件树重新渲染。随着时间的推移,这会耗尽应用程序的性能,减慢交互速度,并使用户感到沮丧。通过使用 useRef,您可以保留可变值并直接操作 DOM 元素,而无需状态重新渲染的开销。结果呢?更快、响应更灵敏的应用程序。

常见误解

你可能会想:“使用 useRef 不是就像欺骗 React 的声明性本质吗?”

实际上,没有。虽然 React 是关于状态驱动的 UI,但 useRef 有不同的目的。它为您提供了一种与 DOM 元素和可变值交互的方法,而无需对抗 React 的反应系统。

使用最佳实践参考

  1. 直接 DOM 操作

    使用 useRef 直接与 DOM 交互 - 无论是聚焦输入字段、触发动画还是滚动到某个部分。它可以帮助您避免不必要的重新渲染并使您的应用程序保持敏捷。

  2. 不要过度使用 useRef 来实现类似状态的行为

    useRef 非常适合跟踪不影响 UI 的值。但如果你的 UI 依赖于该值,则更喜欢 useState 在必要时触发重新渲染。

  3. 优化动画

    对于需要频繁更新 DOM 的动画,可以使用 useRef 来存储引用。这可确保您的动画逻辑不会导致不必要的重新渲染,从而实现更平滑的过渡。

这样想...

想象一下,每次你试图专注于一项任务时都被打断——那该有多令人沮丧?当您在 React 应用程序中允许不必要的重新渲染时,就会发生这种情况。 useRef 就像一个“请勿打扰”标志,确保您的应用程序可以在幕后处理更新,而不会中断用户体验。

总之

通过使用 useRef,您可以提高性能,防止不必要的重新渲染,并直接与 DOM 元素交互。它是构建高性能 React 应用程序的必备工具。

最终要点

准备好增强您的 React 应用程序的性能了吗?通过掌握 useRef,您将避免不必要的重新渲染,优化与 DOM 的交互,并编写更干净、更高效的代码。立即开始使用 useRef,看看您的应用程序运行起来有多流畅。

使用 useRef 转变您的工作流程

想象一下您的应用程序运行得更快、更流畅,并且可以轻松处理复杂的操作。这就是 useRef 的力量。无论您是构建功能丰富的仪表板还是简单的表单,此挂钩都可以帮助您控制性能和 DOM 操作。

版本声明 本文转载于:https://dev.to/paharihacker/the-hidden-power-of-useref-why-its-essential-in-your-react-projects-3f6n?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 使用Java Native Access (JNA)调用MacOS API
    使用Java Native Access (JNA)调用MacOS API
    介绍 这是一个关于如何将 JNA 与 MacOS API 结合使用的简单示例。我不会解释这一点,因为我仍在学习,但我将代码保持最少,以便更容易理解并了解如何将其用于其他目的的基本概念。 大部分代码来自 Intellij-Community(Apache 许可证)。 ...
    编程 发布于2024-11-09
  • 了解 JavaScript 中的导出和导入
    了解 JavaScript 中的导出和导入
    在 JavaScript 中,模块是独立的代码单元,可以使用导出将资产公开给其他模块,并使用导入使用来自其他模块的资产。这种机制对于在现代 JavaScript 应用程序中构建模块化和可重用的代码至关重要。 默认导出 一个模块只能有一个默认导出。 要导出默认资源,请在导出的实体之前使用 defaul...
    编程 发布于2024-11-09
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-09
  • 如何避免 Go 模板中 HTML 和 JSON 的意外转义?
    如何避免 Go 模板中 HTML 和 JSON 的意外转义?
    在 Go 模板中转义 HTML 和 JSON在 Go 模板中,正确处理 HTML 和 JSON 以防止意外转义至关重要。考虑以下模板:<some_html> {{ .SomeOtherHTML }} </some_html>如果您希望输出只是 ,那么您可能会遇到 < 和 &...
    编程 发布于2024-11-09
  • 为什么 useState 在严格模式下渲染组件两次?
    为什么 useState 在严格模式下渲染组件两次?
    理解useState中的双重渲染在React中,useState钩子通常用于管理组件状态。但是,在某些条件下,您可能会注意到使用 useState 呈现的组件对于每次状态更新都会呈现两次。这种行为让许多未启用严格模式的开发人员感到困惑。为什么会出现这种情况?严格模式的作用与未启用严格模式的假设相反,...
    编程 发布于2024-11-09
  • Flex 项目是块级还是 Flex 级?深入研究 CSS 布局
    Flex 项目是块级还是 Flex 级?深入研究 CSS 布局
    Flex 项目令人困惑的本质:块级还是 Flex 级别?Flex 项目是否是块级的问题一直是CSS 开发者之间的争论。 CSS 灵活框布局模块级别 1 规定 Flex 项目位于 Flex 级别,而不是块级别。然而,后面的部分表明弹性项目的显示值是“块化的”。这就提出了一个问题:Flex 项目到底是块...
    编程 发布于2024-11-09
  • 如何在不使用 Sudo 的情况下在 macOS 上安装 Python 包时修复权限错误?
    如何在不使用 Sudo 的情况下在 macOS 上安装 Python 包时修复权限错误?
    排查 macOS 上 Pip 的权限错误尝试在 Mac 上安装 Python 包时,您可能会遇到与写入日志文件或站点包相关的权限错误目录。这些错误可能会令人沮丧,特别是如果您想在当前用户帐户下安装软件包而不使用 sudo。权限错误的根本原因默认情况下,Pip 会尝试在系统中安装软件包-wide Py...
    编程 发布于2024-11-09
  • 如何在 Go 中自动执行外部命令输入:绕过“登录”等命令的用户交互的指南
    如何在 Go 中自动执行外部命令输入:绕过“登录”等命令的用户交互的指南
    Go 自动化外部命令输入在 Go 中,执行外部命令并管理其输入和输出是一项常见任务。但是,在处理提示用户输入的命令(例如“登录”)时,以编程方式自动执行这些输入可能具有挑战性。解决此问题的一种方法是直接写入命令的标准输入(stdin) )使用字节缓冲区。让我们深入研究提供的解决方案:login :=...
    编程 发布于2024-11-09
  • 如何在 CSS 中为多个父级中的特定 n 个子级设置样式
    如何在 CSS 中为多个父级中的特定 n 个子级设置样式
    跨多个父级设置特定第 n 个子级的样式使用第 n 个子级选择器设置嵌套元素的样式时,需要注意的是,选择器在单父上下文中运行。当针对多个父级中的特定子元素时,这可能会带来挑战。问题:考虑以下标记:<div class="foo"> <ul> ...
    编程 发布于2024-11-09
  • 如何使用字符串插值将 CSS 属性设置为 SASS 中的 mixin 值?
    如何使用字符串插值将 CSS 属性设置为 SASS 中的 mixin 值?
    将 SASS Mixin 值设置为 CSS 属性创建通用边距/填充 mixin 时,可能需要将 CSS 属性设置为 mixin 值。为此,需要使用字符串插值。CSS 属性的字符串插值要使用变量作为 CSS 属性名称,需要字符串插值 (#{$var})。示例以下 mixin 演示了如何使用字符串插值设...
    编程 发布于2024-11-09
  • MUI TextField:构建变体、颜色和样式
    MUI TextField:构建变体、颜色和样式
    The mui textfield is a fundamental component in Material-UI, designed to capture user inputs efficiently and stylishly. This guide explores its build ...
    编程 发布于2024-11-09
  • 在 Java 中如何安全地将 Long 转换为 Int?
    在 Java 中如何安全地将 Long 转换为 Int?
    在 Java 中安全地将 Long 转换为 Int:一个全面的解决方案在 Java 中使用数字类型时,确保转换至关重要操作不会导致数据丢失。当将 long 值转换为 int 时,这一点尤其重要,因为 long 的精度可能超过 int。Java 8:简化流程Java 8 之前的版本,安全地将 long...
    编程 发布于2024-11-09
  • 如何修复集成 Authorize.net 支付网关时出现“调用未定义函数curl_init()”错误?
    如何修复集成 Authorize.net 支付网关时出现“调用未定义函数curl_init()”错误?
    未定义的函数:curl_init()在实现Authorize.net的支付网关的上下文中,您可能会遇到错误“调用未定义”函数curl_init()”。这表明您的系统上未正确配置或安装 PHP curl 扩展。Windows 操作系统对于 Windows 用户,请验证您的 php.ini 文件中的以下...
    编程 发布于2024-11-09
  • Next.js 中的 SSR 应用程序路由与页面路由相比有何新变化
    Next.js 中的 SSR 应用程序路由与页面路由相比有何新变化
    介绍 Next.js 长期以来一直是构建服务器渲染 React 应用程序的流行选择。凭借其对服务器端渲染 (SSR) 的内置支持,开发人员可以创建动态、SEO 友好的应用程序。然而,Next.js 13 中 App Router 的引入以及 Next.js 14 中的改进显着简化和...
    编程 发布于2024-11-09
  • CSS 中的垂直对齐实际上是如何工作的?
    CSS 中的垂直对齐实际上是如何工作的?
    CSS 中的垂直对齐:了解细微差别vertical-align 属性允许您将内联元素垂直放置在其父元素中。然而,除非您掌握基本原理,否则它的行为可能是不可预测的。内联元素和高度Vertical-align 仅影响内联元素。 和 等元素是块级元素,不受影响。对于没有固有行高的内联元素,例如 和 ...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3