」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > useRef 的隱藏力量:為什麼它在 React 專案中至關重要

useRef 的隱藏力量:為什麼它在 React 專案中至關重要

發佈於2024-11-09
瀏覽:791

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如有侵犯,請聯絡study_golang@163 .com刪除
最新教學 更多>
  • PHP與C++函數重載處理的區別
    PHP與C++函數重載處理的區別
    作為經驗豐富的C開發人員脫離謎題,您可能會遇到功能超載的概念。這個概念雖然在C中普遍,但在PHP中構成了獨特的挑戰。讓我們深入研究PHP功能過載的複雜性,並探索其提供的可能性。 在PHP中理解php的方法在PHP中,函數超載的概念(如C等語言)不存在。函數簽名僅由其名稱定義,而與他們的參數列表無關...
    程式設計 發佈於2025-07-16
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-07-16
  • Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    程式設計 發佈於2025-07-16
  • 如何克服PHP的功能重新定義限制?
    如何克服PHP的功能重新定義限制?
    克服PHP的函數重新定義限制在PHP中,多次定義一個相同名稱的函數是一個no-no。嘗試這樣做,如提供的代碼段所示,將導致可怕的“不能重新列出”錯誤。 但是,PHP工具腰帶中有一個隱藏的寶石:runkit擴展。它使您能夠靈活地重新定義函數。 runkit_function_renction_...
    程式設計 發佈於2025-07-16
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符提取最後一行,在Postgresql中,您可能需要遇到與在數據庫中的每個不同標識相關的信息中提取信息的情況。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: ...
    程式設計 發佈於2025-07-16
  • PHP未來:適應與創新
    PHP未來:適應與創新
    PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。 引言在編程世界中,PHP一直是網頁開發的中流砥柱。作為一個從1994年就開始發展...
    程式設計 發佈於2025-07-16
  • C++成員函數指針正確傳遞方法
    C++成員函數指針正確傳遞方法
    如何將成員函數置於c [&& && && && && && && && && && &&&&&&&&&&&&&&&&&&&&&&&華儀的函數時,在接受成員函數指針的函數時,要在函數上既要提供指針又可以提供指針和指針到函數的函數。需要具有一定簽名的功能指針。要通過成員函數,您需要同時提供對象指針(此...
    程式設計 發佈於2025-07-16
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-07-16
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-07-16
  • 在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    mysql-python安裝錯誤:“ mysql_config找不到”“ 由於缺少MySQL開發庫而出現此錯誤。解決此問題,建議在Ubuntu上使用該分發的存儲庫。使用以下命令安裝Python-MysqldB: sudo apt-get安裝python-mysqldb sudo pip in...
    程式設計 發佈於2025-07-16
  • 將圖片浮動到底部右側並環繞文字的技巧
    將圖片浮動到底部右側並環繞文字的技巧
    在Web設計中圍繞在Web設計中,有時可以將圖像浮動到頁面右下角,從而使文本圍繞它纏繞。這可以在有效地展示圖像的同時創建一個吸引人的視覺效果。 css位置在右下角,使用css float and clear properties: img { 浮點:對; ...
    程式設計 發佈於2025-07-16
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-07-16
  • 表單刷新後如何防止重複提交?
    表單刷新後如何防止重複提交?
    在Web開發中預防重複提交 在表格提交後刷新頁面時,遇到重複提交的問題是常見的。要解決這個問題,請考慮以下方法: 想像一下具有這樣的代碼段,看起來像這樣的代碼段:)){ //數據庫操作... 迴聲“操作完成”; 死(); } ? > ...
    程式設計 發佈於2025-07-16
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-07-16
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-07-16

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3