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

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

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

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刪除
最新教學 更多>
  • 使用 JavaScript Web 元件和 LIT 建置可重複使用元件
    使用 JavaScript Web 元件和 LIT 建置可重複使用元件
    在當今快節奏的 Web 開發環境中,建立可重複使用和可維護的元件是關鍵。 JavaScript Web 元件 提供了一種原生方法來建立跨框架工作的獨立、模組化元素。然而,手動建立這些組件可能既乏味又複雜。這就是 LIT 發揮作用的地方! LIT 簡化了建立 Web 元件的過程,使管理狀態、反應性和...
    程式設計 發佈於2024-11-09
  • 如何在 C++ 中傳遞給非主函數的陣列上使用基於範圍的 for 迴圈?
    如何在 C++ 中傳遞給非主函數的陣列上使用基於範圍的 for 迴圈?
    傳遞給非主函數的數組上基於範圍的for 循環在C 中,基於範圍的for 循環可以是用於迭代數組。但是,當數組傳遞給非主函數時,它會衰減為指針,從而失去其大小資訊。 要解決此問題並啟用基於範圍的 for 循環,數組應該被引用而不是作為指標傳遞。這保留了數組的大小資訊。以下是示範正確方法的修改範例:vo...
    程式設計 發佈於2024-11-09
  • array_column 與 PHP 中的物件陣列相容嗎?
    array_column 與 PHP 中的物件陣列相容嗎?
    在物件陣列中使用 array_column 是否可行? PHP 的 array_column 函數是從多維資料中提取特定列的強大工具大批。然而,它與物件數組一起使用帶來了挑戰。 在早期版本的 PHP 中,array_column 不支援物件陣列。作為一種解決方法,可以使用 array_map 手動提...
    程式設計 發佈於2024-11-09
  • 何時使用 PDO 而不是 mysql_real_escape_string 來轉義 MySQL 查詢?
    何時使用 PDO 而不是 mysql_real_escape_string 來轉義 MySQL 查詢?
    轉義MySQL 查詢:PDO 與mysql_real_escape_string雖然mysql_real_escape_string 提供了一種轉義MySQL 查詢並防止SQL 注入的方法,但建議使用PHP 資料物件( PDO) )以增強安全性和多功能性。 什麼是PDO? PDO 是 PHP 中物件...
    程式設計 發佈於2024-11-09
  • 如何將`std::string`轉換為`LPCSTR`和`LPWSTR`?
    如何將`std::string`轉換為`LPCSTR`和`LPWSTR`?
    將std::string 轉換為LPCSTR 和LPWSTR將std::string 轉換為LPCSTR 或LPWSTR 需要理解這些的本質指標。讓我們澄清一下它們的定義:LPCSTR 與 LPSTR:LPCSTR:指向常數字串的長指針,本質上是 const char*。 LPSTR:指向字串的長指...
    程式設計 發佈於2024-11-09
  • 黃瓜測試:綜合指南
    黃瓜測試:綜合指南
    Cucumber 是一款支持行为驱动开发 (BDD) 的开源测试工具,使团队能够用任何人都能理解的简单语言编写测试。通过弥合开发人员、测试人员和非技术利益相关者之间的差距,Cucumber 确保软件满足功能和业务需求。 在本文中,我们将深入探讨 Cucumber 测试是什么、它的主要功能以及如何在...
    程式設計 發佈於2024-11-09
  • ## Compare() 與 CompareTo():什麼時候應該在 Java 中使用 Each ?
    ## Compare() 與 CompareTo():什麼時候應該在 Java 中使用 Each ?
    闡明compare()和compareTo()之間的區別Java生態系統圍繞操作對象展開,確定它們的相對順序在各種場景中至關重要。本文旨在闡明兩個關鍵方法:compare() 和compareTo() 之間的細微差別,闡明它們在比較對像中的不同作用。 compareTo()compareTo() 位...
    程式設計 發佈於2024-11-09
  • 兩個指針和滑動視窗模式
    兩個指針和滑動視窗模式
    雙指標與滑動視窗模式 模式1:常數視窗(如window = 4或某個整數值) 例如,給定一個(-ve 和 ve)整數數組,找到大小為 k 的連續視窗的最大和. 模式2:(可變視窗大小)具有的最大子數組/子字串範例:sum
    程式設計 發佈於2024-11-09
  • 何時使用 PSR-4 與類別映射自動載入以獲得最佳效能?
    何時使用 PSR-4 與類別映射自動載入以獲得最佳效能?
    PSR-4 與類別映射自動載入:解決效能爭論問題Composer 為類別自動載入提供了多種選項:PSR- 0/ 4 標準或直接類別映射掃描。儘管文件推薦 PSR-4,但使用者認為類別映射提供更快的載入速度。這就提出了一個問題:如果類別映射看起來比 PSR-4 更優秀,為什麼還要使用 PSR-4? P...
    程式設計 發佈於2024-11-09
  • 使用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 應用程式中建立模組化和可重複使用的程式碼至關重要。 預設導出 一個模組只能有一個預設導出。 要匯出預設資源,請在匯出的實體之前使用 ...
    程式設計 發佈於2024-11-09
  • 如何避免 Go 模板中 HTML 和 JSON 的意外轉義?
    如何避免 Go 模板中 HTML 和 JSON 的意外轉義?
    在Go 模板中轉義HTML 和JSON在Go 模板中,正確處理HTML 和JSON 以防止意外轉義至關重要。考慮以下範本:<some_html> {{ .SomeOtherHTML }} </some_html>如果您希望輸出只是 ,那麼您可能會遇到到< 和& 等特殊字元被轉...
    程式設計 發佈於2024-11-09
  • CORS 可防止哪些錯誤:「Access-Control-Allow-Origin 不允許來源」?
    CORS 可防止哪些錯誤:「Access-Control-Allow-Origin 不允許來源」?
    CORS 防止的錯誤:「Access-Control-Allow-Origin 不允許來源」簡介:跨來源資源共享(CORS) 期間,當用戶端腳本嘗試從與其運行來源不同的來源存取資源。 原因:此錯誤有幾個潛在原因: 同源策略:未經伺服器明確許可, JavaScript 被限制存取其網域之外的資源。此策...
    程式設計 發佈於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

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

Copyright© 2022 湘ICP备2022001581号-3