React hooks - forwardRef+useImperativeHandle

forwardRef+useImperativeHandle

        • React.forwardRef用法
        • useImperativeHandle用法
          • 第三個參數的用法
        • React.forwardRef與useImperativeHandle配合使用
        • 注意事項

React.forwardRef用法

1.創建一個 能夠接受到ref屬性的React 組件。
ref 用來獲取實例,但函數組件不存在實例,所以ref無法獲取函數式組件的實例

React.forwardRef((props, ref) => {子函數組件})
useImperativeHandle用法
  1. 按需向外暴露成員
  2. 控制成員暴露的粒度
    ref 獲取 DOM 實例,會全面暴露 DOM 實例上的 API,導致外部使用 ref 時自由度太大。使用useImperativeHandle控制 ref 暴露顆粒度,只暴露主要的功能函數。
useImperativeHandle(ref, createHandle, [deps])
useImperativeHandle(ref, () => 自定義ref對象, [依賴項數組])

// 第一個參數為父組件傳遞的 ref
// 第二個參數是一個函數,子組件將自己內部的方法或值作為對象返回,并自動綁定到父組件定義的并傳給子組件的 ref 上
// 第三個參數是函數依賴的值(可選),createHandle中用到的子組件內部定義的變量也需要作為依賴項

第三個參數的用法
  1. 空數組:只在子組件首次被渲染時,執行 useImperativeHandle 中的 fn 回調,從而把 return 的對象作為父組件接收到的 ref。
  2. 依賴項數組:子組件首次被渲染時,會依賴項改變時,會執行 useImperativeHandle 中的 fn 回調,從而讓父組件通過 ref 能拿到依賴項的新值。
  3. 省略依賴項數組(省略第三個參數):此時,子組件內任何 state 的變化,都會導致回調的重新執行,因為每次state改變都會讓函數組件rendered,會重新調用一次回調
React.forwardRef與useImperativeHandle配合使用

React.forwardRef()包裹子組件
子組件中使用useImperativeHandle 向外按需暴露子組件內的成員
父組件中使用childRef.current調用暴露出來的值的方法

<!-- const Child: React.FC = () => { -->
<!-- 被包裝的函數式組件不再是 React.FC 類型,接收兩個參數 props 和轉發過來的 ref -->
const Child = React.forwardRef((props, ref) => { const [count, setCount] = useState(0)const add = (step: number) => {setCount((prev) => (prev += step))}// 1. 向外暴露一個空對象// useImperativeHandle(ref, () => ({}))// 2. 向外暴露一個對象,其中包含了 name 和 age 兩個屬性// useImperativeHandle(ref, () => ({ name: 'liulongbin', age: 22 }))// 3.向外暴露 count 的值和 setCount 函數// useImperativeHandle(ref, () => ({ count, setCount }))// 4.控制成員暴露的粒度,向外暴露reset方法,內部寫死只能設置count為0,外部不能隨意寫入countuseImperativeHandle(ref, () => ({ count, reset:()=>setCount(0) }))return (<><h3>Child 子組件 {count}</h3><button onClick={() => add(-1)}>-1</button><button onClick={() => add(1)}>+1</button></>)
} 

當子組件沒有使用useImperativeHandle暴露出自己的任何東西時childRef.current為null
當向外暴露{}時,childRef.current為{}
當向外暴露{ name: ‘liulongbin’, age: 22 }時,childRef.current為{ name: ‘liulongbin’, age: 22 }

export const Father: React.FC = () => {const childRef = useRef<count: number, setCount: (value: number)>()const onShowRef = () => {console.log(childRef.current) }// 重置按鈕的點擊事件處理函數const onReset = () => {// childRef.current?.setCount(0) // 可以設置count為任何值childRef.current?.reset() // 只能設置count為0} return (<><h1>Father 父組件</h1>{/* 點擊按鈕,打印 ref 的值 */}<button onClick={onShowRef}>show Ref</button>{/* 點擊按鈕,重置數據為 0 */}<button onClick={onReset}>重置</button><hr /><Child ref={childRef} /></>)
} 
注意事項

1:不要濫用 ref,可以通過 prop 實現,就不應該使用 ref。 僅在你沒法通過 prop 來表達時才使用 ref:例如,滾動到指定節點、聚焦某個節點、觸發一次動畫,以及選擇文本等等。
2:不應該從一個 Model 組件暴露出 {open, close} 這樣的命令式句柄,最好是像 這樣,將 isOpen 作為一個 prop。副作用可以幫你通過 prop 來暴露一些命令式的行為。

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

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

相關文章

bugku 網絡安全事件應急響應

開啟靶場&#xff1a; 開始實驗&#xff1a; 使用Xshell登錄服務器&#xff0c;賬號及密碼如上圖。 1、提交攻擊者的IP地址 WP: 找到服務器日志路徑&#xff0c;通常是在/var/log/&#xff0c;使用cd /var/log/&#xff0c;ls查看此路徑下的文件. 找到nginx文件夾。 進入ng…

hyperopt、optuna、gridsearch、randomsearch自動調參

開始使?hyperopt進??動調參 algo partial(tpe.suggest, n_startup_jobs1) best fmin(lightgbm_factory, space, algoalgo, max_evals20, pass_expr_memo_ctrlNone) RMSE lightgbm_factory(best) print(‘best :’, best) print(‘best param after transform :’) argsD…

【Jenkins】Centos7安裝Jenkins(環境:JDK11,tomcat9,maven3.8)

目錄 Jenkins部署環境Maven安裝1.上傳安裝包2.解壓3.配置Maven環境變量4.使配置文件立即生效5.校驗Maven安裝6.Maven配置阿里云倉庫7.Maven配置依賴下載位置 Git安裝安裝監測安裝 JDK17安裝1.查看舊版本JDK2.卸載舊版本JDK3.查看是否卸載干凈4.創建java目錄5.下載JDK11安裝包6.…

“開源與閉源大模型:數據隱私、商業應用與社區參與的多維比較“

開源大模型和閉源大模型各有其優勢和局限&#xff0c;它們在數據隱私、商業應用和社區參與方面的表現也各有不同。以下是對這三個方面進行的分析&#xff1a; 方向一&#xff1a;數據隱私 開源大模型&#xff1a; 優點&#xff1a;開源模型通常允許用戶和開發者查看和修改代…

Excel中Lookup函數

#Excel查找函數最常用的是Vlookup&#xff0c;而且是經常用其精確查找。Lookup函數的強大之處在于其“二分法”的原理。 LOOKUP&#xff08;查找值&#xff0c;查找區域&#xff08;Vector/Array&#xff09;&#xff0c;[返回結果區域]&#xff09; 為什么查找區域必須升序/…

一種處理checked exception的方法

一種處理checked exception的方法 在網上看到的一種處理異常的方法 public abstract class Try<V> {private Try() {}public abstract Boolean isSuccess();public abstract Boolean isFailure();public abstract void throwException();public abstract Throwable getMe…

【UE HTTP】“BlueprintHTTP Server - A Web Server for Unreal Engine”插件使用記錄

1. 在商城中下載“BlueprintHTTP Server - A Web Server for Unreal Engine”插件 該插件的主要功能有如下3點&#xff1a; &#xff08;1&#xff09;監聽客戶端請求。 &#xff08;2&#xff09;可以將文件直接從Unreal Engine應用程序提供到Web。 &#xff08;3&#xff…

Antd Vue項目引入TailwindCss之后出現svg icon下移,布局中的問題解決方案

目錄 1. 現象&#xff1a; 2. 原因分析&#xff1a; 3. 解決方案&#xff1a; 寫法一&#xff1a;擴展Preflight 寫法二&#xff1a; 4. 禁用 Preflight 1. 現象&#xff1a; Antd Vue項目引入TailwindCss之后出現svg icon下移&#xff0c;不能對齊顯示的情況&#xff0…

k8s筆記 | Prometheus安裝

kube-prometheus 基于github安裝 選擇對應的版本 這里選擇 https://github.com/prometheus-operator/kube-prometheus/tree/release-0.11 下載修改為國內鏡像源 image: quay.io 改為 quay.mirrors.ustc.edu.cn image: k8s.gcr.io 改為 lank8s.cn 創建 prometheus-ingres…

在AndroidStudio創建虛擬手機DUB-AI20

1.DUB-AI20介紹 DUB-AL20是華為暢享9全網通機型。 華為暢享9采用基于Android 8.1定制的EMUI 8.2系統&#xff0c;最大的亮點是配置了1300萬AI雙攝、4000mAh大電池以及AI人臉識別功能&#xff0c;支持熄屏快拍、笑臉抓拍、聲控拍照、手勢拍照等特色的拍照功能&#xff0c;支持移…

Windows安裝mingw32/w64

1.下載 MinGW-w64 WinLibs - GCCMinGW-w64 compiler for Windows Releases niXman/mingw-builds-binaries (github.com) MinGW-w64、UCRT 和 MSVCRT 是 Windows 平臺上常用的 C/C 運行庫&#xff0c;它們有以下不同點&#xff1a; MinGW-w64&#xff1a;是一個基于 GCC 的…

Edge瀏覽器報錯:Ref A Ref B: Ref C

今天發現微軟Edge瀏覽器非常頻繁的出現以下報錯&#xff1a;Ref A: 0BF6B9E03845450C8E6A6C31006AD7B9 Ref B: BJ1EDGE1116 Ref C: 2024-05-23T12:41:30Z 通過搜索發現用如下問題解決&#xff1a; 1.打開Edge瀏覽器 2.進入設置選項 3.找到隱私、搜索和服務 4.關閉跟蹤防護后面…

【數據結構】【C語言】堆~動畫超詳細解讀!

目錄 1 什么是堆1.1 堆的邏輯結構和物理結構1.2 堆的訪問1.3 堆為什么物理結構上要用數組?1.4 堆數據上的特點 2 堆的實現2.1 堆類型定義2.2 需要實現的接口2.3 初始化堆2.4 銷毀堆2.5 堆判空2.6 交換函數2.7 向上調整(小堆)2.8 向下調整(小堆)2.9 堆插入2.10 堆刪除2.11 //堆…

微服務項目收獲和總結---第2,3天(分庫分表思想,文章業務)

①分庫分表思想 文章表一對一為什么要拆分&#xff1f;因為文章的內容會非常大&#xff0c;查詢效率會很低&#xff0c;我們經常操作文章的基本信息&#xff0c;不會很經常查詢文章內容。充分發揮高頻數據的操作效率。 ②freemarker和minIO 由于文章內容數據量過大&#xff0c…

git clone 出現的問題

問題: core源碼ref新API % git clone https://github.com/xxxx.git Cloning into core... remote: Enumerating objects: 58033, done. remote: Counting objects: 100% (1393/1393), done. remote: Compressing objects: 100% (750/750), done. error: 432 bytes of body are …

辦公自動化-Python如何提取Word標題并保存到Excel中?

辦公自動化-Python如何提取Word標題并保存到Excel中&#xff1f; 應用場景需求分析實現思路實現過程安裝依賴庫打開需求文件獲取word中所有標題去除不需要的標題創建工作簿和工作表分割標題功能名稱存入測試對象GN-TC需求標識符存入測試項標識存入需求標識符 完整源碼實現效果學…

Nginx學習與使用記錄

這里寫自定義目錄標題 定義域名&#xff08;本地&#xff09;Nginx的一下常用命令記錄win系統使用 .bat來啟動nginx配置 定義域名&#xff08;本地&#xff09; 本地定義域名不需要證書&#xff0c;直接更改hosts文件。 注意&#xff1a;在這個文件夾中是無法更改hosts文件的&…

Vue02-黑馬程序員學習筆記

一、今日學習目標 1.指令補充 指令修飾符v-bind對樣式增強的操作v-model應用于其他表單元素 2.computed計算屬性 基礎語法計算屬性vs方法計算屬性的完整寫法成績案例 3.watch偵聽器 基礎寫法完整寫法 4.綜合案例 &#xff08;演示&#xff09; 渲染 / 刪除 / 修改數量 …

一個簡約高級視差效果PR動態圖文開場視頻模板

這是一個高質量且易于定制的pr模板。具有模塊化結構&#xff0c;可以輕松更改內容。包括視頻教程&#xff0c;即使是新手小白也可以輕松套用模板制作視頻。 主要特點&#xff1a; 水平&#xff08;19201080&#xff09;和垂直&#xff08;10801920&#xff09;分辨率&#xff…

c語言:利用隨機函數產生20個[120, 834] 之間互不相等的隨機數, 并利用選擇排序法將其從小到大排序后輸出(每行輸出5個)

利用隨機函數產生20個[120, 834] 之間互不相等的隨機數&#xff0c; 并利用選擇排序法將其從小到大排序后輸出&#xff08;每行輸出5個&#xff09; 代碼如下&#xff1a; #include <stdio.h> #include <time.h> #include <stdlib.h> int shenchen(int a[…