」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 了解 useRef:初學者指南

了解 useRef:初學者指南

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

Understanding useRef: A Beginners Guide

介紹

什麼是 useRef

useRef 是 React 鉤子,允許建立對值或 DOM 元素的持久參考。與用於管理觸發重新渲染的狀態的 useState 不同,useRef 主要用於副作用或直接存取 DOM 元素。

為什麼要使用 useRef

useRef 鉤子特別有用:

  • 直接存取 DOM 元素:您可以使用 useRef 取得 DOM 元素的引用,讓您可以直接操作它而無需觸發重新渲染。
  • 建立持久值:與狀態不同,使用 useRef 建立的值在渲染之間保留,這使得它們非常適合儲存不需要觸發重新渲染的資料。

了解 useRef 鉤子

useRef 鉤子傳回一個具有 .current 屬性的物件。當您呼叫 useRef 時,它會建立對您作為參數傳遞的值的持久性參考。此引用儲存在傳回物件的 .current 屬性中。

使用 useRef 建立引用

要建立引用,只需使用初始值呼叫 useRef 即可。

import { useRef} from 'react'

const App = () => {
  const countRef = useRef(0)

  return (...)
}

export default App

在上面的範例中,countRef 是初始值 0 的參考。

訪問參考值

要存取參考值,只需呼叫帶有 .current 屬性的 countRef 物件

import { useRef} from 'react'

const App = () => {
  const countRef = useRef(0)

  const increment = () => {
    countRef.current  
  }

  return (
    

Count: {countRef.current}

) } export default App

在上面的範例中,如果您按一下按鈕,它將呼叫增量函數,這將增加countRef,但計數不會在

Count: {countRef.current}

處更新,因為更新了useRef不會導致像useState. 這樣的重新渲染

將程式碼更新為下面的範例以獲得您期望的結果。

import { useRef, useState } from 'react'

const App = () => {
  const countRef = useRef(0)
  const [count, setCount] = useState(0)

  const increment = () => {
    countRef.current  
    setCount(countRef.current)
  }

  return (
    

Count: {count}

) } export default App

useRef 的常見用例

直接存取和操作 DOM 元素

可以使用 useRef 鉤子來存取和更改 html 元素的屬性

const App = () => {
  const inputRef = useRef(null)

  const handleFocus = () => {
    inputRef.current.focus()
  }

  return(
    
  )
}

持久的價值觀

與 useState 或變數不同,useRef 可以在重新渲染之間傳遞值和數據,例如快取數據或配置設定。

效能最佳化

在某些情況下,使用 useRef 可以透過避免不必要的重新渲染來幫助元件最佳化。就像如果您有一個渲染大量項目清單的元件,您可以使用 useRef 快取它,並且僅修改重新渲染已更改的項目。

最佳實踐和注意事項

  • 渲染期間請勿寫入或讀取ref.current
  • 您可以變更 ref.current 屬性
  • 當您變更 ref.current 屬性時,React 不會重新渲染您的元件
  • 資訊對於元件的每個副本來說都是本地的(與共享的外部變數不同)。您可以在重新渲染之間儲存資訊(與常規變數不同,每次渲染時重置)。
  • 您可以從事件處理程序或效果讀取或寫入參考
  • 用 ref 操作 dom

將引用傳遞給自訂元件。

如果您嘗試像這樣將引用傳遞給您自己的元件

const inputRef = useRef(null);

return ;

您可能會在控制台中收到錯誤:
警告:不能給函數元件提供引用。嘗試存取此引用將失敗。您的意思是使用 React.forwardRef() 嗎?

要解決此問題,請使用forwardRef 包裝自訂元件,如下所示:

const inputRef = useRef(null);

return ;

自訂元件:

import { forwardRef } from 'react';

const MyInput = forwardRef(({ value, onChange }, ref) => {
  return (
    
  );
});

export default MyInput;

結論

useRef 是一個功能強大的鉤子,主要用於副作用使用,例如在重新渲染之間快取資料或存取 DOM 元素。它是 React 應用程式中效能優化和實現特定功能的絕佳工具。

版本聲明 本文轉載於:https://dev.to/kada/understanding-useref-a-beginners-guide-58bg?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何解決 CSS 轉換期間 Webkit 文字渲染不一致的問題?
    如何解決 CSS 轉換期間 Webkit 文字渲染不一致的問題?
    解決CSS 轉換期間的Webkit 文本渲染不一致在CSS 轉換期間,特別是縮放元素時,Webkit 中可能會出現文本渲染不一致的情況瀏覽器。這個問題源自於瀏覽器嘗試優化渲染效能。 一種解決方案是透過添加以下屬性來強制對過渡元素的父元素進行硬體加速:-webkit-transform: transl...
    程式設計 發佈於2024-11-05
  • 使用 Reactables 簡化 RxJS
    使用 Reactables 簡化 RxJS
    介紹 RxJS 是一個功能強大的庫,但眾所周知,它的學習曲線很陡峭。 這個函式庫龐大的 API 介面,再加上向反應式程式設計的典範轉移,可能會讓新手不知所措。 我創建了 Reactables API 來簡化 RxJS 的使用並簡化開發人員對反應式程式設計的介紹。 ...
    程式設計 發佈於2024-11-05
  • 如何在 Pandas 中找到多列的最大值?
    如何在 Pandas 中找到多列的最大值?
    找出 Pandas 中多列的最大值要確定 pandas DataFrame 中多列的最大值,可以採用多種方法。以下是實現此目的的方法:對指定列使用max() 函數此方法涉及明確選擇所需的列並應用max() 函數: df[["A", "B"]] df[[&quo...
    程式設計 發佈於2024-11-05
  • CI/CD 入門:自動化第一個管道的初學者指南(使用 Jenkins)
    CI/CD 入門:自動化第一個管道的初學者指南(使用 Jenkins)
    目錄 介紹 什麼是 CI/CD? 持續整合(CI) 持續交付(CD) 持續部署 CI/CD 的好處 更快的上市時間 提高程式碼品質 高效率協作 提高自動化程度和一致性 如何建立您的第一個 CI/CD 管道 第 1 步:設定版本控制 (GitHub) 步驟 2: 選擇 CI/CD ...
    程式設計 發佈於2024-11-05
  • TypeScript 如何讓 JavaScript 在大型專案中更加可靠。
    TypeScript 如何讓 JavaScript 在大型專案中更加可靠。
    介绍 JavaScript 广泛应用于 Web 开发,现在也被应用于不同行业的大型项目中。然而,随着这些项目的增长,管理 JavaScript 代码变得更加困难。数据类型不匹配、运行时意外错误以及代码不清晰等问题可能会导致查找和修复错误变得困难。 这就是TypeScript介入的地...
    程式設計 發佈於2024-11-05
  • 如何使用PHP的password_verify函數安全地驗證使用者密碼?
    如何使用PHP的password_verify函數安全地驗證使用者密碼?
    使用 PHP 解密加密密碼許多應用程式使用密碼雜湊等加密演算法安全地儲存使用者密碼。然而,在驗證登入嘗試時,將輸入密碼與加密的儲存版本進行比較非常重要。 加密問題password_hash 使用 Bcrypt,一元加密演算法方式雜湊演算法,表示加密的密碼無法逆轉或解密。這是一項安全功能,可確保即使資...
    程式設計 發佈於2024-11-05
  • 學習 Vue 部分 建立天氣應用程式
    學習 Vue 部分 建立天氣應用程式
    深入研究 Vue.js 就像在 DIY 工具包中發現了一個新的最喜歡的工具——直觀、靈活,而且功能強大得驚人。我接觸 Vue 的第一個副業專案是一個天氣應用程序,它教會了我很多關於框架功能以及一般 Web 開發的知識。這是我到目前為止所學到的。 1. Vue 入門:簡單與強大 Vu...
    程式設計 發佈於2024-11-05
  • NFT 預覽卡組件
    NFT 預覽卡組件
    ?剛剛完成了我的最新專案:使用 HTML 和 CSS 的「NFT 預覽卡元件」! ?查看並探索 GitHub 上的程式碼。歡迎反饋! ? GitHub:[https://github.com/khanimran17/NFT-preview-card-component] ?現場示範:[https:...
    程式設計 發佈於2024-11-05
  • Android 應用程式如何連接到 Microsoft SQL Server 2008?
    Android 應用程式如何連接到 Microsoft SQL Server 2008?
    將Android 應用程式連接到Microsoft SQL Server 2008Android 應用程式可以無縫連接到中央資料庫伺服器,包括Microsoft SQL Server 2008。這種連接允許開發人員從其行動應用程式存取和管理儲存在遠端伺服器上的資料。 連接方法雖然提供的範例程式碼專注...
    程式設計 發佈於2024-11-05
  • 以下是一些基於問題的標題選項,重點關注核心問題:

* C++ std::可選:為什麼沒有對引用類型進行專門化? (直接、切題)
* C++ std::option 中的參考類型
    以下是一些基於問題的標題選項,重點關注核心問題: * C++ std::可選:為什麼沒有對引用類型進行專門化? (直接、切題) * C++ std::option 中的參考類型
    C 中的可選:為什麼沒有專門化引用類型? 儘管在像 Boost 這樣的庫中存在對引用類型的專門化,C標準庫的 std::Optional 不提供這樣的功能。這項決定引發了對其理由和潛在替代機制的詢問。 遺漏背後的理由在討論 n3406(可選提案)期間,有人提出了擔憂關於包含可選參考文獻。認識到這些反...
    程式設計 發佈於2024-11-05
  • 評估機器學習分類模型
    評估機器學習分類模型
    大纲 模型评估的目标是什么? 模型评估的目的是什么,有哪些 常见的评估程序? 分类准确率有什么用,它的作用是什么 限制? 混淆矩阵如何描述一个 分类器? 可以从混淆矩阵计算哪些指标? T模型评估的目标是回答问题; 不同型号如何选择? 评估机器学习的过程有助于...
    程式設計 發佈於2024-11-05
  • 如何消除 Eval-Base64_Decode PHP 病毒並保護您的網站?
    如何消除 Eval-Base64_Decode PHP 病毒並保護您的網站?
    如何像PHP 病毒檔案一樣刪除Eval-Base64_Decode採用eval-base64_decode 技術的病毒,例如您的病毒已經描述過,可能會很麻煩。我們將幫助您了解病毒的性質及其潛在漏洞,並提供有關如何消除病毒的全面指南。 了解病毒此特定病毒以 eval-base64_decode 程式碼...
    程式設計 發佈於2024-11-05
  • 如何在 Serp 中排名 4
    如何在 Serp 中排名 4
    搜索引擎排名页面 (SERP) 是网站争夺可见性和流量的地方。到 2024 年,在 Google 和其他搜索引擎上的高排名仍然对在线成功至关重要。然而,SEO(搜索引擎优化)多年来已经发生了变化,并将继续发展。如果您想知道如何在 2024 年提高 SERP 排名,这里有一个简单的指南可以帮助您了解最...
    程式設計 發佈於2024-11-05
  • 如何使用多處理在 Python 進程之間共享鎖
    如何使用多處理在 Python 進程之間共享鎖
    在Python 中的進程之間共享鎖定當嘗試使用pool.map() 來定位具有多個參數(包括Lock() 物件)的函數時,它是對於解決子進程之間共享鎖的問題至關重要。由於 pickling 限制,傳統的 multiprocessing.Lock() 無法直接傳遞給 Pool 方法。 選項 1:使用 ...
    程式設計 發佈於2024-11-05
  • Type Script 中 readonly 和 const 的區別
    Type Script 中 readonly 和 const 的區別
    這兩個功能的相似之處在於它們都是不可分配的。 能具體解釋一下嗎? 在這篇文章中,我將分享它們之間的差異。 const 防止重新分配給變數。 在這種情況下,hisName 是一個不能重新分配的變數。 const hisName = 'Michael Scofield' hisN...
    程式設計 發佈於2024-11-05

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

Copyright© 2022 湘ICP备2022001581号-3