WHAT - React 元素接收的 ref 詳解

目錄

  • 1. ref 的基本概念
  • 2. 如何使用 ref
    • 2.1 基本用法
    • 2.2 類組件使用 createRef
  • 3. forwardRef 轉發 ref
  • 4. ref 的應用場景
  • 5. ref 和函數組件
  • 總結

在 React 中,ref(引用)用于訪問 DOM 元素或類組件實例。它允許我們直接與元素進行交互,而不需要依賴 React 的數據流。

下面是關于 React 元素接收 ref 的詳細解釋。

1. ref 的基本概念

React 中的 ref 主要有兩種類型:

  • 字符串 ref:React 16.3 之前的用法,已經被廢棄,不推薦使用。
  • 回調 ref:提供一個函數,將 ref 作為參數傳遞給該函數。可以訪問 DOM 元素或組件實例。
  • createRef()或者useRef():推薦的現代用法,允許創建一個 ref 對象,該對象可以用于訪問 DOM 元素或類組件實例。

2. 如何使用 ref

2.1 基本用法

函數組件為例:

import React, { useRef, useEffect } from 'react';const MyComponent = () => {const myRef = useRef<HTMLInputElement>(null);useEffect(() => {if (myRef.current) {myRef.current.focus(); // 聚焦到 input 元素}}, []);return <input ref={myRef} />;
};export default MyComponent;

在這個例子中,我們使用了 useRef 鉤子創建一個 ref,并將它傳遞給一個 <input> 元素。這樣,myRef.current 就指向該 input 元素,我們可以在 useEffect 中直接操作 DOM。

這里有一個技巧,前面提過 ref 支持接收回調函數,因此我們可以讓代碼更加簡潔:

import React, { useCallback } from 'react';const MyComponent = () => {const myRef = useCallback((node) => node?.focus(), [])return <input ref={myRef} />;
};export default MyComponent;

它的工作原理如下:

  • 當 DOM 節點添加到屏幕時,React 會以 DOM 節點作為參數調用該函數。
  • 當 DOM 節點被移除時,React 會以 null 調用該函數。

2.2 類組件使用 createRef

在類組件中,我們通常使用 React.createRef() 來創建 ref

import React, { Component } from 'react';class MyComponent extends Component {private myRef = React.createRef<HTMLInputElement>();componentDidMount() {if (this.myRef.current) {this.myRef.current.focus();}}render() {return <input ref={this.myRef} />;}
}export default MyComponent;

3. forwardRef 轉發 ref

如果你要在函數組件中使用 ref,并且希望該 ref 被傳遞到子組件中,你需要使用 React.forwardRef 來轉發 ref

import React, { forwardRef, useImperativeHandle, useRef } from 'react';interface CustomInputProps {label: string;
}const CustomInput = forwardRef<HTMLInputElement, CustomInputProps>((props, ref) => {const inputRef = useRef<HTMLInputElement>(null);// 允許父組件操作子組件的方法useImperativeHandle(ref, () => ({focus: () => {if (inputRef.current) {inputRef.current.focus();}}}));return (<div><label>{props.label}</label><input ref={inputRef} /></div>);
});export default CustomInput;

在這個例子中,CustomInput 是一個函數組件,它通過 forwardRef 接收外部的 ref。我們通過 useImperativeHandle 將自定義的方法(如 focus)暴露給父組件。

在父組件使用時:

import React, { useRef } from 'react';
import CustomInput from './CustomInput';const ParentComponent = () => {const inputRef = useRef<{ focus: () => void }>(null);return (<div><CustomInput ref={inputRef} label="Username" /><button onClick={() => inputRef.current?.focus()}>Focus Input</button></div>);
};export default ParentComponent;

4. ref 的應用場景

  • 訪問 DOM 元素:如上述例子,ref 允許你直接訪問 DOM 元素并操作其屬性,例如聚焦、滾動、選擇文本等。
  • 與第三方庫集成:很多第三方庫(如 D3.js 或 jQuery)需要直接操作 DOM 元素,這時 ref 就非常有用。
  • 獲取組件實例:雖然不推薦直接訪問組件實例,但如果需要,可以通過 ref 來訪問類組件的實例方法。

5. ref 和函數組件

默認情況下,ref 只能用于類組件或 DOM 元素。如果你嘗試將 ref 直接傳遞給一個函數組件,React 會給出警告,表示函數組件無法接收 ref。為了讓函數組件能夠接收 ref,你需要使用 React.forwardRef

總結

  • ref 是 React 中訪問 DOM 或組件實例的一種方式。
  • 函數組件無法直接使用 ref,需要使用 React.forwardRef 轉發 ref
  • ref 可以配合 useImperativeHandle 定制暴露給父組件的接口。
  • ref 對于與第三方庫集成和直接操作 DOM 元素非常有用。

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

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

相關文章

【QT】QT的消息盒子和對話框(自定義對話框)

QT的消息盒子和對話框&#xff08;自定義對話框&#xff09; 一、消息盒子QMessageBox1、彈出警告盒子示例代碼&#xff1a;現象&#xff1a; 2、致命錯誤盒子示例代碼&#xff1a;現象&#xff1a; 3、幫助盒子示例代碼&#xff1a;現象&#xff1a; 4、示例代碼&#xff1a; …

依靠視頻設備軌跡回放平臺EasyCVR構建視頻監控,為幼教連鎖園區安全護航

一、項目背景 幼教行業連鎖化發展態勢越發明顯。在此趨勢下&#xff0c;幼兒園管理者對于深入了解園內日常教學與生活情況的需求愈發緊迫&#xff0c;將這些數據作為提升管理水平、優化教育服務的重要依據。同時&#xff0c;安裝監控系統不僅有效緩解家長對孩子在校安全與生活…

Stable Diffusion+Pyqt5: 實現圖像生成與管理界面(帶保存 + 歷史記錄 + 刪除功能)——我的實驗記錄(結尾附系統效果圖)

目錄 &#x1f9e0; 前言 &#x1f9fe; 我的需求 &#x1f527; 實現過程&#xff08;按功能一步步來&#xff09; &#x1f6b6;?♂? Step 1&#xff1a;基本圖像生成界面 &#x1f5c3;? Step 2&#xff1a;保存圖片并顯示歷史記錄 &#x1f4cf; Step 3&#xff1a…

量子計算未來的潛力和挑戰

據麥肯錫預測&#xff0c;到 2035 年或 2040 年&#xff0c;量子計算市場規模可能增長至約 800 億美元。目前&#xff0c;許多量子比特技術正競相成為首臺通用、無差錯量子計算機的基礎&#xff0c;但仍面臨諸多挑戰。 我們將探討量子計算的未來前景、潛力&#xff0c;以及它對…

ArcGIS 給大面內小面字段賦值

文章目錄 引言:地理數據處理中的自動化賦值為何重要?實現思路模型實現關鍵點效果實現步驟1、準備數據2、執行3、完成4、效果引言:地理數據處理中的自動化賦值為何重要? 在地理信息系統(GIS)的日常工作中,空間數據的屬性字段賦值是高頻且關鍵的操作,例如在土地利用規劃…

如何打通虛擬化-容器環境并保障流量安全?SmartX VCCI 方案升級!

為了提升資源利用率、交付效率和業務靈活性&#xff0c;不少企業用戶都在推進從傳統架構向云原生架構的演進&#xff0c;并采用虛擬機與容器共存的混合模式支持多種業務系統。由于兩個環境在業務交互層面形成高度耦合&#xff0c;企業需要具備簡單、高效方案&#xff0c;實現虛…

stable diffusion 量化加速點

文章目錄 一、導出為dynamic shape1)函數講解(函數導出、輸出檢查)2)代碼展示二、導出為static shape1)函數講解(略)2)代碼展示三、序列化為FP32測速1)測速2)代碼四、序列化為FP16測速1)測速2)代碼同上五、發現并解決解決CLIP FP16溢出,并測速1)如何找到溢出的算子…

7-openwrt-one通過web頁面配置訪客網絡、無線中繼等功能

前幾個章節一直在介紹編譯、分區之類的,都還沒正常開始使用這個路由器的wifi。默認wifi是沒有啟動的,前面還是通過手動修改uci配置啟動的,這個章節介紹下官方web頁面的使用。特別是訪客網絡、無線中繼 1、開啟wifi,配置wifi基本信息 我們使用有線連接路由器,通過192.168.…

AcWing 6099. 座位

原題目鏈接 問題描述 有 n 頭奶牛&#xff08;n ≥ 5&#xff09;&#xff0c;編號為 1 ~ n&#xff0c;按照某種順序圍著一張圓桌坐成一圈。 奶牛之間存在如下的朋友關系&#xff1a; 如果兩頭奶牛相鄰&#xff0c;則它們是朋友&#xff1b;如果兩頭奶牛之間只隔著一頭奶…

44、Spring Boot 詳細講義(一)

Spring Boot 詳細講義 目錄 Spring Boot 簡介Spring Boot 快速入門Spring Boot 核心功能Spring Boot 技術棧與集成Spring Boot 高級主題Spring Boot 項目實戰Spring Boot 最佳實踐總結 一、Spring Boot 簡介 1. Spring Boot 概念和核心特點 1.1、什么是 Spring Boot&#…

配置mac mini M4 的一些軟件

最近更換了 mac mini M4 &#xff0c;想要重新下載配置軟件 &#xff0c;記錄一下。 Homebrew是什么&#xff1f; homebrew是一款Mac OS平臺下的軟件包管理工具&#xff0c;擁有安裝、卸載、更新、查看、搜索等功能。通過簡單的指令可以實現包管理&#xff0c;而不用關心各種…

網絡空間安全(54)CSRF

一、定義與原理 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;全稱為跨站請求偽造&#xff0c;也被稱為One Click Attack或Session Riding&#xff0c;縮寫為CSRF或XSRF。它是一種網絡安全漏洞&#xff0c;攻擊者通過偽造用戶的請求&#xff0c;利用用戶…

分布式文件存儲系統FastDFS

文章目錄 1 分布式文件存儲1_分布式文件存儲的由來2_常見的分布式存儲框架 2 FastDFS介紹3 FastDFS安裝1_拉取鏡像文件2_構建Tracker服務3_構建Storage服務4_測試圖片上傳 4 客戶端操作1_Fastdfs-java-client2_文件上傳3_文件下載4_獲取文件信息5_問題 5 SpringBoot整合 1 分布…

安裝了VM Tools,仍無法復制拖動-解決方案

今天在安裝ubuntu時遇到了困擾許久的問題&#xff0c;安裝了VM Tools&#xff0c;仍無法拖動主機文件到虛擬機&#xff0c;主要有兩種原因并對應解決辦法。 1.相關虛擬機設置選項卡中-客戶機隔離-兩個功能沒有勾選 解決方案&#xff1a;勾選重啟虛擬機即可 2.&#xff08;這個…

Jmeter分布式測試啟動

代理客戶端配置 打開jmeter.properties文件&#xff0c;取消注釋并設置端口&#xff08;如server_port1099&#xff09;&#xff0c; 并添加server.rmi.ssl.disabletrue禁用SSL加密。 &#xff08;Linux系統&#xff09;修改jmeter-server文件中的RMI_HOST_DEF為代理機實際IP。…

火語言RPA--Oracle-導入數據表格

【組件功能】&#xff1a;導入特定的表格數據到包含同樣字段的數據表 將表格對象數據通過數據庫操作對象導入到指定數據庫。 配置預覽 配置說明 源表格 表格來源有“來自表格對象”和“來自表達式”2種&#xff0c;表達式支持DataTable類型變量。 對象 對應來自表格對象&…

Java的Selenium的特殊元素操作與定位之驗證碼

1.使用OCR技術識別驗證 步驟&#xff1a; 截取整個網頁的截圖。 定位驗證碼圖片元素。 根據驗證碼圖片的位置和大小&#xff0c;從截圖中裁剪出驗證碼圖片。 使用OCR工具&#xff08;如Tesseract&#xff09;識別驗證碼圖片中的文本。 2.手動處理驗證碼 步驟&#xff1a;…

OpenStack Yoga版安裝筆記(十七)安全組筆記

一、安全組與iptables的關系 OpenStack的安全組&#xff08;Security Group&#xff09;默認是通過Linux的iptables實現的。以下是其主要實現原理和機制&#xff1a; 安全組與iptables的關系 OpenStack的安全組規則通過iptables的規則鏈實現。每條安全組規則會被轉換為相應的i…

starrocks split函數和trino split函數差異性

在trino419和starrocks3.2.8中分別執行下面這兩條sql,出來的結果是不一樣的 select split(,,,)[1] as t1 select coalesce(split(,,&#

Spring Data JPA中的List底層:深入解析ArrayList的奧秘!!!

&#x1f31f; Spring Data JPA中的List底層&#xff1a;深入解析ArrayList的奧秘 &#x1f4a1; 你是否好奇過&#xff0c;為什么Spring Data JPA的查詢方法返回的List<T>總是默認為ArrayList&#xff1f;本文將通過技術原理解析、驗證實驗和性能優化指南&#xff0c;為…