React Ref 和 React forwardRef

来源:https://www.cnblogs.com/dejunwang/archive/2019/11/02/11782484.html
-Advertisement-
Play Games

React Ref 和 React.forwardRef的使用 ...


  1. Ref 和Dom,Ref是reference(引用)的簡寫。

    1. 能力:大多數情況下,props前遞可以解決一切問題,但是依然有需要觸達React實例或者Dom節點的情況,這時候應該使用React Ref。
    2. 使用:
      1. 用來處理立即執行的動畫。
      2. 用來處理非受控組件的焦點,什麼是受控/非受控組件參考文章
      3. 用來與第三方庫對接,我知道的有d3 或者 cocos。
  2. React.forwardRef((props,ref)=><Compnent>)

    1. 簡而言之就是自動透傳引用(Ref),能讓組件接收傳過來的ref, 向下(或者說向前)傳遞Ref。
      const FancyButton = React.forwardRef((props, ref) => (
        <button ref={ref} className="FancyButton">
          {props.children}
        </button>
      ));
      
      // You can now get a ref directly to the DOM button:
      const ref = React.createRef();
      <FancyButton ref={ref}>Click me!</FancyButton>;  
    2. 上述代碼的解釋:

      1. 首先創建了一個ref, 這個ref的目的就是抓到孫子組件中的input節點
      2. 通過組件屬性把ref傳給子組件<FancyButton>
      3. 子組件通過React.forwardRef透傳props和ref,這裡ref才是我們要註意的點。
      4. 參數ref賦值給孫子組件<button>
      5. 這個ref就能抓到孫子組件的實例。
  3. React.forwardRef((props, ref)=><Componnet>)在高階組件中的使用:

    1. 比如我們寫一個列印前後屬性的高階組件logProps,這個高階組件能夠透傳ref
       1 function logProps(Component) {
       2   class LogProps extends React.Component {
       3     componentDidUpdate(prevProps) {
       4       console.log('old props:', prevProps);
       5       console.log('new props:', this.props);
       6     }
       7 
       8     render() {
       9       const {forwardedRef, ...rest} = this.props;
      11       // 把常規屬性"forwardedRef"作為ref賦值給傳過來的Component組件
      12       return <Component ref={forwardedRef} {...rest} />;
      13     }
      14   }
      15 
      16   // 註意React.forwardRef提供的第二個參數ref.
      17   // 我們可以把ref作為一個常規屬性"forwardedRef"傳給LogProps這個組件
      18   // 就可以跟實例綁定.
      19   return React.forwardRef((props, ref) => {
      20     return <LogProps {...props} forwardedRef={ref} />;
      21   });
      22 }

       


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • CSS的元素顯示模式 1. 什麼是元素顯示模式 作用:網頁的標簽非常多,在不同的地方會用到不同類型的標簽,瞭解他們的特點可以更好的佈局我們的網頁 元素的顯示模式就是元素(標簽)以什麼樣的方式進行顯示,比如 自己獨占一行,比如一行可以放多個 HTML元素一般分為塊元素和行內元素兩種類型 2. 塊元素 ...
  • 品牌管理 分析 1. 獲取到 id 和 name ,直接從 data 上面獲取 2. 組織出一個對象 3. 把這個對象,調用 數組的 相關方法,添加到 當前 data 上的 list 中 4. 註意:在Vue中,已經實現了數據的雙向綁定,每當我們修改了 data 中的數據,Vue會預設監聽到數據的改 ...
  • vue組件是什麼: 組件是可復用的 Vue 實例,組件可以進行任意次數的復用 vue組件創建方式有3種: 組件的da'ta必須作為一個函數,返回對象 ...
  • python day 21 2019/11/02 [TOC] 學習資料來自老男孩與尚學堂 1. HTML 1.1 常見的HTML元素 1. HTML的作用:定義整個頁面"長"成什麼樣,相當於網站的骨架。 2. HTML搭骨架的標簽: 2.1. 標題標簽: h1~h6 2.2. 容器標簽: div : ...
  • var str = 'fdhfgcsaedvcfhgfh'; var index = str.indexOf('f'); // 字元出現的位置 var num = 0; // 這個字元出現的次數 while(index !== -1) { console.log(index); // 列印字元串出現 ...
  • 用時間戳來計算倒計時 時間戳:當前時間距離1970年1月1日一共過了多少毫秒。 得到當前時間以及結束時間的時間戳,二者相減即是剩餘的毫秒數,將剩餘毫秒數轉化成 時 分 秒 即是倒計時。 function countDown(Time) { var nowTime = +new Date(); //當 ...
  • JavaScript的深淺複製 為什麼有深複製、淺複製? JavaScript中有兩種數據類型,基本數據類型如 、`null boolean number string Object`。簡單數據類型只存儲在記憶體中的 棧區 ,複製的時候是值傳遞給新的索引。而複雜數據類型由棧區和 堆區 共同儲存,棧區執 ...
  • 已經使用uni app開發併發布了一個跨端小程式啦,嘻嘻嘻!
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...