React 19 中的useRef得到了進一步加強。

文章目錄

  • 前言
    • 一 useRef 的核心原理
      • 1.1 為什么需要 useRef?
      • 1.2 基本語法
    • 二、React 19 中 useRef 的常見用法
      • 2.1 訪問 DOM 元素
      • 2.2 保存跨渲染的數據
    • 三、React 19 中的改進
      • ref 作為一個屬性
      • 案例演示(觸發子組件焦點事件)
    • 注意
  • 總結


前言

在 React 的世界里,useRef 是一個既簡單又強大的 Hook,它常常被用于訪問 DOM 元素、保存不可變數據或管理組件的生命周期行為。隨著 React 19 的發布,useRef 的使用場景和最佳實踐也得到了進一步強化。本文將結合 React 19 的特性,深入探討 useRef 的核心用法、常見誤區以及實戰技巧。


一 useRef 的核心原理

useRef 是 React 提供的一個內置 Hook,用于創建一個可變的 ref 對象。其返回值是一個包含 current 屬性的對象,該屬性在整個組件的生命周期中保持不變。

1.1 為什么需要 useRef?

  • 訪問 DOM 元素:在函數組件中,useRef 是獲取 DOM 節點的標準方式。
  • 保存跨渲染的數據useRefcurrent 屬性不會因組件的重新渲染而改變,適合存儲不需要觸發重渲染的數據。
  • 管理副作用:結合 useEffectuseRef 可以用于控制副作用的執行時機。

1.2 基本語法

	import { useRef } from 'react';function MyComponent() {const myRef = useRef(initialValue);// 使用 myRef.current 訪問或修改值return <div ref={myRef}>Hello, World!</div>;}

二、React 19 中 useRef 的常見用法

2.1 訪問 DOM 元素

這是 useRef 最經典的用法。通過將 ref 屬性綁定到 DOM 元素上,可以直接操作該元素。

示例:聚焦輸入框

	import { useRef } from 'react';function FocusInput() {const inputRef = useRef(null);const handleFocus = () => {inputRef.current?.focus();};return (<div><input ref={inputRef} type="text" placeholder="Type something..." /><button onClick={handleFocus}>Focus Input</button></div>);}

2.2 保存跨渲染的數據

useRefcurrent 屬性不會因組件的重新渲染而改變,因此可以用來存儲一些不需要觸發重渲染的數據,比如計時器 ID 或事件監聽器。

示例:記錄按鈕點擊次數

	import { useRef } from 'react';function ClickCounter() {const clickCountRef = useRef(0);const handleClick = () => {clickCountRef.current += 1;console.log(`Button clicked ${clickCountRef.current} times`);};return <button onClick={handleClick}>Click Me</button>;}

三、React 19 中的改進

之前我們在18版本的時候你要傳遞ref給外部,需要借助forwardRef,現在到了react 19不需要了,你直接以屬性的方式進行傳遞。

ref 作為一個屬性

從 React 19 開始,你現在可以在函數組件中將 ref 作為 prop 進行訪問:

function MyInput({placeholder, ref}) {return <input placeholder={placeholder} ref={ref} />
}//...<MyInput ref={ref} />

新的函數組件將不再需要 forwardRef,我們將發布一個 codemod 來自動更新你的組件以使用新的 ref prop。在未來的版本中,我們將棄用并移除 forwardRef

案例演示(觸發子組件焦點事件)

import { useRef } from "react";
const Child = ({ ref }: { ref: React.Ref<HTMLInputElement> }) => {return (<div><input type="text" ref={ref} /></div>);
};
const App = () => {const childRef = useRef<HTMLInputElement>(null);const handler = () => {childRef.current?.focus();};return (<div><button onClick={() => handler()}>點擊</button><Child ref={childRef} /></div>);
};export default App;

在這里插入圖片描述

注意

  • 在類組件中,ref 不作為 props 傳遞,因為它們引用的是組件實例。這意味著,如果你在類組件中需要訪問 ref,你需要使用 React.forwardRef 或者 React.createRef
  • useRef的值不能作為useEffect等其他hooks的依賴項,因為它并不是一個響應式狀態
  • 組件在重新渲染的時候,useRef的值不會被重新初始化。

總結

useRef 是 React 中一個簡單卻強大的 Hook,它在 React 19 中依然保持著其核心價值。通過掌握 useRef 的基本用法、高級技巧以及最佳實踐,你可以更高效地開發 React 應用,避免常見的性能問題和代碼混亂。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81766.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

idea查看class文件源碼

1、在idea中查看.class文件源碼 在idea的一個工程里面將.class文件復制進去&#xff0c;會提示如下&#xff1a; 這時候&#xff0c;打開一個其他類&#xff0c;右鍵-》"show in explorer"&#xff0c;打開資源文件夾&#xff0c;這時候將class文件粘貼在此處&#…

基于 Vue + CEF3 的瀏覽器批量管理系統(附功能詳解)

&#x1f310; 基于 Vue CEF3 的瀏覽器批量管理系統&#xff08;附功能詳解&#xff09; 在當前多任務操作需求日益增長的背景下&#xff0c;如何高效管理多個瀏覽器實例成為了一個值得探討的問題。今天給大家介紹一款基于 Vue 和 CEF3 構建的瀏覽器批量管理系統&#xff0c;…

JS實現古詩豎排從右至左

一個老題目&#xff0c;將下面古詩文由橫排&#xff0c;變成古文豎排模式&#xff1a; 靜夜思 李白 床前明月光&#xff0c; 疑似地上霜。 舉頭望明月&#xff0c; 低頭思故鄉。變成&#xff1a; 低|舉|疑|床|靜 頭|頭|似|前|夜 思|望|地|明|思 故|明|上|月| 鄉|月|霜|光|李…

在 Android 中實現支持多手勢交互的自定義 View(Kotlin 完整指南)

本文將手把手教你創建一個支持拖動、縮放、旋轉等多種手勢交互的自定義 View&#xff0c;并提供完整的代碼實現和優化建議。 一、基礎實現 1.1 創建自定義 View 骨架 import android.content.Context import android.graphics.* import android.util.AttributeSet import an…

Kotlin 協程 (一)

1. Kotlin 協程的核心概念 1.1 協程&#xff08;Coroutine&#xff09; 定義&#xff1a;協程是一種輕量級的執行上下文&#xff0c;可以在任何時候掛起和恢復&#xff0c;而不需要阻塞線程。特點&#xff1a; 比傳統線程更輕量&#xff0c;開銷更小。支持掛起和恢復&#xf…

機器學習 集成學習方法之隨機森林

集成學習方法之隨機森林 1 集成學習2 隨機森林的算法原理2.1 Sklearn API2.2 示例 1 集成學習 機器學習中有一種大類叫集成學習&#xff08;Ensemble Learning&#xff09;&#xff0c;集成學習的基本思想就是將多個分類器組合&#xff0c;從而實現一個預測效果更好的集成分類…

thinkphp6實現統一監聽并記錄所有執行的sql語句除查詢外

創建文件app/middleware/SqlLogger.php <?php namespace app\middleware;use think\facade\Db; use think\facade\Session;class SqlLogger {public function handle($request, \Closure $next){// 監聽所有SQL $request->ip()Db::listen(function($sql, $time) {if (p…

pytorch訓練可視化工具---TensorBoard

一、目的&#xff1a;為什么使用 TensorBoard 調控模型 使用 TensorBoard 可以幫我們&#xff1a; 實時查看 loss / acc 曲線 → 判斷是否過擬合、欠擬合&#xff1b; 對比不同模型或超參數的效果&#xff1b; 可視化模型結構 → 幫助調試模型設計&#xff1b; 查看權重/梯…

機器學習知識自然語言處理入門

一、引言&#xff1a;當文字遇上數學 —— 自然語言的數字化革命 在自然語言處理&#xff08;NLP&#xff09;的世界里&#xff0c;計算機要理解人類語言&#xff0c;首先需要將文字轉化為數學向量。早期的 One-Hot 編碼如同給每個詞語分配一個唯一的 “房間號”&#xff0c;例…

Linux-線程概念和控制

1.Linux線程概念 1.1什么是線程 ? 在?個程序?的?個執?路線就叫做線程&#xff08;thread&#xff09;。更準確的定義是&#xff1a;線程是“?個進程內部 的控制序列” ? ?切進程?少都有?個執?線程 ? 線程在進程內部運?&#xff0c;本質是在進程地址空間內運?…

【氮化鎵】低劑量率對GaN HEMT柵極漏電的影響

2024 年 2 月 22 日,中國科學院新疆理化技術研究所的Li等人在《IEEE ACCESS》期刊發表了題為《Degradation Mechanisms of Gate Leakage in GaN-Based HEMTs at Low Dose Rate Irradiation》的文章,基于實驗分析和 TCAD 仿真,研究了低劑量率輻照下基于 GaN 的 p 型柵高電子遷…

.NET Core 中 Swagger 配置詳解:常用配置與實戰技巧

隨著微服務架構和 RESTful API 的廣泛應用&#xff0c;API 文檔的管理和自動化生成成為了開發中的重要部分。Swagger&#xff08;現為 OpenAPI&#xff09;是一款功能強大的工具&#xff0c;它可以自動生成 API 文檔&#xff0c;并提供交互式 UI&#xff0c;幫助開發者、測試人…

海康工業相機白平衡比選擇器對應的值被重置后,如何恢復原成像

做項目的時候&#xff0c;有時候手抖&#xff0c;一不小心把一個成熟穩定的項目的相機配置&#xff0c;重置了&#xff0c;如何進行恢復呢&#xff0c;在不知道之前配置數據的情況下。 我在做項目的時候&#xff0c;為了讓這個相機成像穩定一點&#xff0c;尤其是做顏色檢測時…

【八股戰神篇】Java虛擬機(JVM)高頻面試題

目錄 專欄簡介 一 請解釋Java虛擬機(JVM)及其主要功能 延伸 1. JVM的基本概念 2. JVM的主要功能 二 對象創建的過程了解嗎 延伸 1.Java 創建對象的四種常見方式 三 什么是雙親委派模型 延伸 1.雙親委派機制的作用: 2.雙親委派模型的核心思想: 3.雙親委派模型的…

win10 上刪除文件夾失敗的一個原因:sqlYog 備份/導出關聯了該文件夾

在嘗試刪除路徑為.../bak/sql的文件時&#xff0c;系統提示無權限操作。然而&#xff0c;關閉SQLyog后&#xff0c;刪除操作成功完成。這表明SQLyog可能正在占用該文件&#xff0c;導致刪除權限受限。關閉SQLyog后&#xff0c;文件被釋放&#xff0c;刪除操作得以順利進行。建議…

Oracle中如何解決LATCH:CACHE BUFFERS LRU CHAIN

簡單來講&#xff0c;Oracle為了高效管理BUFFER CACHE主要使用以下2種LRU列&#xff1a; ?LRU列&#xff0c;又叫替換列&#xff08;replacement list&#xff09;&#xff0c;其中又分為主列和輔助列。 主列&#xff1a;已使用的緩沖區列&#xff0c;分為HOT和COLD區域。HOT區…

C++:迭代器

迭代器的本質&#xff1a;對象。 迭代器與指針類似&#xff0c;通過迭代器可以指向容器中的某個元素&#xff0c;還可以對元素進行操作。 迭代器統一規范了遍歷方式。不同的數據結構可以用統一的方式去遍歷。 接下來是一個自定義迭代器的代碼示例。 #include<iostream&g…

(4)Java虛擬線程與傳統線程對比

虛擬線程與傳統線程對比 &#x1f504; &#x1f4cb; 核心問題 Project Loom的虛擬線程與傳統線程在資源消耗上有何區別&#xff1f;如何設計一個支持百萬級并發的服務&#xff1f; &#x1f4ca; 資源消耗比較 &#x1f418; 傳統線程 &#x1f4cf; 每線程約1MB棧空間&am…

Java 單元測試框架比較:JUnit、TestNG 哪個更適合你?

Java 單元測試框架比較&#xff1a;JUnit、TestNG 哪個更適合你&#xff1f; 在 Java 開發領域&#xff0c;單元測試是保證代碼質量的重要環節。而選擇一個合適的單元測試框架&#xff0c;對于提升測試效率和代碼可靠性至關重要。本文將深入比較 JUnit 和 TestNG 這兩個主流的…

從零開始的抽獎系統創作(2)

我們接著進行抽獎系統的完善。 前面我們完成了 1.結構初始化&#xff08;統一結果返回之類的&#xff0c;還有包的分類&#xff09; 2.加密&#xff08;基于Hutool進行的對稱與非對稱加密&#xff09; 3.用戶注冊 接下來我們先完善一下結構&#xff08;統一異常處理&#…