React Hook父組件獲取子組件的數據/函數

来源:https://www.cnblogs.com/yuyuan-bb/archive/2019/09/06/11478837.html
-Advertisement-
Play Games

我們知道在react中,常用props實現子組件數據到父組件的傳遞,但是父組件調用子組件的功能卻不常用。文檔上說ref其實不是最佳的選擇,但是想著偷懶不學redux,在網上找了很多教程,要不就是hook的講的太少,要不就是父子組件傻傻分不清,於是只好再啃了一下文檔,就學了一下其它hook的api。 ...


我們知道在react中,常用props實現子組件數據到父組件的傳遞,但是父組件調用子組件的功能卻不常用。文檔上說ref其實不是最佳的選擇,但是想著偷懶不學redux,在網上找了很多教程,要不就是hook的講的太少,要不就是父子組件傻傻分不清,於是只好再啃了一下文檔,就學了一下其它hook的api。
在這裡我們需要用到useImperativeHandle這個api,其函數形式為

useImperativeHandle(ref, createHandle, [deps])

其實這個api也是ref的一種形式,但是相當於做了一定的優化,可以選擇讓子組件只暴露一定的api給父組件,根據在文檔和其他博客上給出的方法,一共有兩大步驟:

  1. 將ref傳遞到子組件中
  2. 需要使用forwardRef對子組件進行包裝

子組件MyWorldMap

 const mapRef = useRef(null);
    useImperativeHandle(ref, () => {

        return {
            //clickSwitch是子組件暴露的函數
            clickSwitch() {
             
                if(type == 1){
                    initChinaMap();
                    setType(2);
                }else{
                    initWordMap();
                    setType(1);
                }
              
            }
        }
    })

//你的return內容,註意ref

    return(
        <React.Fragment>

            <div id={"myWorldMap"} style={{ width: "800px", height: "400px" }}  ref={mapRef}></div>

        </React.Fragment>


    )
}


//最後要配合forwardRef
MyWorldMap = forwardRef(MyWorldMap);
export default MyWorldMap;

註:ref是子組件聲明的時候傳進來的,也就是

function MyWorldMap (props,ref){
//..你的代碼
}

//export...

其實官方文檔給出來的例子是:

function FancyInput(props, ref) {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => {
      inputRef.current.focus();
    }
  }));
  return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);

兩種方法都是可以的

父組件MyTrip

const myWordMapRef = useRef();

return(
  //省略一些代碼,註意ref
 <MyWorldMap proData = { myMapData} handleMapClick = {handleMapClick.bind(this)} ref={myWordMapRef}>

 </MyWorldMap>
<div className={styles["mapButton-wrap"]}>
       <ButtonGroup>
               <Button onClick={() => myWordMapRef.current.clickSwitch()}>Switch</Button>
               <Button onClick={()=>clickAll() }>All</Button>
        </ButtonGroup>
 </div>
)

現在你就可以在父組件裡面通過myWordMapRef.current.clickSwitch()調用函數了


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

-Advertisement-
Play Games
更多相關文章
  • 1、下載安裝包 官網下載地址:https://redisdesktop.com/pricing 官網下載需要付費使用 再此附上一個免費的破解版本,綠色安全可用 鏈接:https://pan.baidu.com/s/1K5Yd1OQ8nAofCl79Hp8r1A 提取碼:528k 下載完後後直接打開e ...
  • Ethink組件取值手冊一、取值Sql查詢配置中取值方式:所有可以對外過濾的組件都可以用id.output取值 就是取組件setOutput()里輸出的值 ,具體分為以下兩種:1)$p{OBJ_1.output}—用於sql語句中根據值的類型加引號 如:’安徽’2)$p[OBJ_1.output]—... ...
  • 修改so庫中的依賴名 在 "ArchLinuxArm" 上有一些針對 aarch64, arm, armeabi v7a 等Android常用架構的so庫可以下載,有時候可以省去很多編譯時間,且都是編譯optimize比較好的版本,而且基本都是最新版本的代碼編譯的。比如SuiteSparse就是例子 ...
  • 版權聲明:本文為xing_star原創文章,轉載請註明出處! 本文同步自http://javaexception.com/archives/207 ImageView設置rounded corner 到2019年,現在的圖片載入框架,幾乎都是Glide了。 最近的需求又碰到了要給圖片設置圓角,發現之 ...
  • 任務結果標簽 當 Gradle 執行一個任務時,它會在控制台和 Tooling API 根據任務結果給任務打標簽。 這些標簽是根據任務是否有操作,是否應該執行操作,是否執行了操作以及這些操作做了哪些改變 來標記的。 下麵是 Gradle 的標簽以及對應的條件 (無標簽)或者 EXECUTED 任務執 ...
  • 將string字元串轉換為array數組 NSArray *array = [Str componentsSeparatedByString:@","]; ==反向方法 將array數組轉換為string字元串 NSString *tempString = [mutableArray compone ...
  • ### 前言 我之前寫過一篇螢石雲的集成文章,很多人問我有沒有demo, 今天我再次總結一下, 並加個些功能。 - 集成步驟 - 視頻預覽播放 - 視頻放大縮小 - 視頻的質量切換 - 截圖 - 視頻載入細節 之前的文章大家可以看下麵的鏈接: https://mp.weixin.qq.com/s/V ...
  • 一、背景圖片練習 解釋:這個例子需要註意的是,我們背景圖片嵌套到另一個圖片之中。我們設計的註意點在於,怎麼定位到我們想定位到的地方。 總結:背景圖片就是一塊一塊的,我們想把塊的位置定位好(一般就是寬和高的相等),然後再對圖片在“塊”中進行位置調整就可以了 二、精靈圖 1.什麼是CSS精靈圖 CSS精 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...