中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

React forwardRef怎么用

發布時間:2021-06-15 09:54:24 來源:億速云 閱讀:470 作者:小新 欄目:開發技術

這篇文章主要介紹了React forwardRef怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

React.forwardRef使用示例

下面就是應用到React組件的錯誤示例:

const A=React.forwardRef((props,ref)=><B {...props} ref={ref}/>)

這就是我之前經常犯的錯誤, 這里的ref是無法生效的。

前面提到ref必須指向dom元素,那么正確方法就應用而生:

const  A=React.forwardRef((props,ref)=>(
<div ref={ref}>
<B {...props} />
</div>
))

作用與注意點

  1. 父組件創建一個ref對象,綁定給子組件中的Dom元素或class組件

  2. 函數組件是沒有實例的

  3. 高階組件需做特殊處理

父組件獲取子組件中Dom元素實例

React forwardRef怎么用

import React, { useRef } from 'react';
import Content from './content';

const Home = () => {
  // 創建一個Ref對象
  const connectRef = useRef(null);

  const handleFoucus = () => {
    const _ref = connectRef.current;
    _ref.focus();
  };

  return (
    <div>
        <button onClick={() => handleFoucus()}>
          使用子組件中DOM元素的方法
        </button>

        <Content ref={connectRef} />
    </div>
  );
};

export default Home;
import React, { forwardRef } from 'react';

/**
 * forwardRef包裹后,ref會作為第二個參數,接收傳進來的ref屬性
 * e.g.
 * <Content count={count} user={user} ref={connectRef}>
 *
 * @param props - {count, user}
 * @param ref   - connectRef
 * */
const Content = (props, ref) => {
  return (
    <div>
   	  {/* 把ref綁定給傳進來的ref ≈ ref={connectRef} */}
      <input type="password" ref={ref} />
    </div>
  )
};

export default forwardRef(Content);

父組件獲取子組件中class組件實例

React forwardRef怎么用

import React, { useRef } from 'react';
import Content from './content';

const Home = () => {
  // 創建一個Ref對象
  const connectRef = useRef(null);

  const handleAdd = () => {
    const _ref = connectRef.current;

    const { count } = _ref.state;
    _ref.setState({
      count: count + 1
    })
  };

  return (
    <div>
        <button onClick={() => handleAdd()}>
          使用子組件中class組件的屬性和方法
        </button>

        <Content ref={connectRef} />
    </div>
  );
};

export default Home;
import React, { forwardRef } from 'react';
import Header from './header';
import Footer from './footer';

/**
 * forwardRef包裹后,ref會作為第二個參數,接收傳進來的ref屬性
 * e.g.
 * <Content count={count} user={user} ref={connectRef}>
 *
 * @param props - {count, user}
 * @param ref   - connectRef
 * */
const Content = (props, ref) => {
  return (
    <div>
      {/* 把ref綁定給傳進來的ref ≈ ref={connectRef} */}
      <Header ref={ref} />  {/* class組件 */}
		
      {/* <Footer ref={ref} /> 函數組件是沒有實例的,所以connectRef.current: null */}
    </div>
  )
};

export default forwardRef(Content)
import React from 'react';

export default class Header extends React.Component {
  state = {
    count: 0
  };

  render() {
    return (
      <div>
        {this.state.count}
      </div>
    )
  }
};

高階組件中的特殊情況

高階組件會把所有接收到的props,傳遞給被包裝的組件(透傳)
ref 和 key 類似,不是一個prop,所以不會透傳,ref會綁定到外層的包裝容器上

/*
  處理ref
  e.g. Hoc1(Hoc2(Content))

  <Content ref={myRef} /> 給Content綁定的ref會綁定到Hoc1上,且不會繼續向下傳遞

  第一種方法 React.forwardRef ===============

      在 Hoc1外面 用React.forwardRef()對ref做處理,用props來傳遞ref
      0. 在高階組件外面包裹forwardRef,攔截獲取ref,增加一個props(xxx={ref}),真實組件通過props.xxx獲取
      1. 使用時傳 ref={XXXX}  // 和第二種方法不同的地方
      2. 用forwardRef的第二個參數獲取 ref
      3. 增加一個新的props,用來向下轉發ref  e.g. forwardedRef={ref}
      4. 真實組件中綁定 ref={props.forwardedRef}

      const Home = (props) => {
        const connectRef = useRef(null);

        return (
          <div>
            <Content ref={connectRef} />
          </div>
        );
      };

      // 被包裝組件
      const Content = (props) => {
        return (
          <div>
            <input type="password" ref={props.forwardedRef} />
          </div>
        );
      };


      // forwardRef的第二個入參可以接收ref,在Hoc外層對ref做處理
      export default React.forwardRef((props, ref) => {
        const Wrapper = React.memo(Content);  // Hoc

        // forwardRef包裹的是Wrapper
        // 需要在Wrapper中把ref向下傳遞給真實組件
        // Wrapper中增加一個props屬性,把ref對象作為props傳給子組件
        return <Wrapper {...props} forwardedRef={ref} />;
      });

  第二種方法 ==========

  0. 使用時就用一個props來保存ref
  1. 使用時傳 xxx={ref}  // 和第一種方法的不同點
  2. 真實組件中綁定 ref={props.xxx}

  const Home = (props) => {
    const connectRef = useRef(null);

    return (
      <div>
        <Content forwardedRef={connectRef} />
      </div>
    );
  };

  // 定義高階組件
  export const Hoc = (WrappedComponent) => {
    class Wrapper extends React.Component {
      render() {
        return <WrappedComponent {...props} />
      }
    }
  }

  // 被包裝的組件
  const Content = (props) => {
    return (
      <div>
        <input type="password" ref={props.forwardedRef} />
      </div>
    );
  };

  // 包裝過程
  export default Hoc(Content);

* */

感謝你能夠認真閱讀完這篇文章,希望小編分享的“React forwardRef怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

施甸县| 嘉荫县| 武隆县| 淄博市| 葵青区| 溆浦县| 陇西县| 沁源县| 吉林省| 鄂托克前旗| 凉城县| 顺平县| 鹿泉市| 靖州| 格尔木市| 合江县| 桓台县| 山东| 鹿邑县| 宁国市| 德惠市| 从江县| 成武县| 丰台区| 昌宁县| 栖霞市| 太原市| 安庆市| 亚东县| 成安县| 昭平县| 自治县| 招远市| 邹城市| 乌鲁木齐县| 永泰县| 民权县| 樟树市| 东兴市| 蒙山县| 阳春市|