useRef、forwardRef、useImperativeHandle獲取子組件數(shù)據(jù)

實例圖片.png

useRef
useRef 返回一個可變的 ref 對象,其 .current 屬性被初始化為傳入的參數(shù)(initialValue)。返回的 ref 對象在組件的整個生命周期內(nèi)保持不變。

useImperativeHandle
useImperativeHandle 可以讓你在使用 ref 時自定義暴露給父組件的實例值。

forwardRef
React.forwardRef 會創(chuàng)建一個React組件,這個組件能夠?qū)⑵浣邮艿膔ef 屬性轉(zhuǎn)發(fā)到其組件樹下的另一個組件中。

父組件代碼:

import { useState, useEffect, useRef } from "react";
import * as React from "react";
import "./index.less";
import { Button } from "antd";
import Child from "./Child";

const GetChildDataPage = () => {
  // 獲取子組件實例的ref
  const childRef = useRef<any>();

  return (
    <div className="get-child-data-page">
      <Button
        onClick={() => {
          console.log(childRef.current.getData());
        }}
      >
        獲取子組件數(shù)據(jù)
      </Button>
      <Child ref={childRef} />
    </div>
  );
};
export default GetChildDataPage;

子組件

import { useState } from "react";
import * as React from "react";
import "./index.less";

// React.forwardRef 接受渲染函數(shù)作為參數(shù)。React 將使用 props 和 ref 作為參數(shù)來調(diào)用此函數(shù)。此函數(shù)應(yīng)返回 React 節(jié)點(diǎn)。
const Child = (props: any, ref: any) => {
  const [json] = useState(
    '{"showGridLevelMgr": "1","gridLevelMgrRequired": "1","gridMap": "1"}'
  );

  // 暴露組件的方法 接受外部獲取的ref
  React.useImperativeHandle(ref, () => ({
    // 構(gòu)造ref的獲取數(shù)據(jù)方法
    getData: () => {
      return json;
    },
  }));

  return (
    <div
      style={{
        padding: 12,
        border: "1px solid black",
        width: 200,
        height: 200,
        marginTop: 20
      }}
    >
      我是子組件數(shù)據(jù):{json}
    </div>
  );
};
// forwardRef這個組件能夠?qū)⑵浣邮艿?ref 屬性轉(zhuǎn)發(fā)到其組件樹下
export default React.forwardRef(Child);

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容