最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React forwardRef的使用方法及注意點(diǎn)

 更新時(shí)間:2021年06月13日 09:26:45   作者:等下吃什么?  
React.forwardRef的API中ref必須指向dom元素而不是React組件,通過一段示例代碼給大家介紹了React forwardRef使用方法及注意點(diǎn)還有一些特殊情況分析,感興趣的朋友跟隨小編一起看看吧

之前使用react.forwardRef始終無法應(yīng)用于react高階組件中,最近終于搗鼓出來了,于是記錄下來。關(guān)鍵點(diǎn)就是React.forwardRef的API中ref必須指向dom元素而不是React組件。

React.forwardRef使用示例

下面就是應(yīng)用到React組件的錯(cuò)誤示例:

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

這就是我之前經(jīng)常犯的錯(cuò)誤, 這里的ref是無法生效的。

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

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

作用與注意點(diǎn)

  1. 父組件創(chuàng)建一個(gè)ref對(duì)象,綁定給子組件中的Dom元素或class組件
  2. 函數(shù)組件是沒有實(shí)例的
  3. 高階組件需做特殊處理

父組件獲取子組件中Dom元素實(shí)例

在這里插入圖片描述

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

const Home = () => {
  // 創(chuàng)建一個(gè)Ref對(duì)象
  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會(huì)作為第二個(gè)參數(shù),接收傳進(jìn)來的ref屬性
 * e.g.
 * <Content count={count} user={user} ref={connectRef}>
 *
 * @param props - {count, user}
 * @param ref   - connectRef
 * */
const Content = (props, ref) => {
  return (
    <div>
   	  {/* 把ref綁定給傳進(jìn)來的ref ≈ ref={connectRef} */}
      <input type="password" ref={ref} />
    </div>
  )
};

export default forwardRef(Content);

父組件獲取子組件中class組件實(shí)例

在這里插入圖片描述

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

const Home = () => {
  // 創(chuàng)建一個(gè)Ref對(duì)象
  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會(huì)作為第二個(gè)參數(shù),接收傳進(jìn)來的ref屬性
 * e.g.
 * <Content count={count} user={user} ref={connectRef}>
 *
 * @param props - {count, user}
 * @param ref   - connectRef
 * */
const Content = (props, ref) => {
  return (
    <div>
      {/* 把ref綁定給傳進(jìn)來的ref ≈ ref={connectRef} */}
      <Header ref={ref} />  {/* class組件 */}
		
      {/* <Footer ref={ref} /> 函數(shù)組件是沒有實(shí)例的,所以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>
    )
  }
};

高階組件中的特殊情況

高階組件會(huì)把所有接收到的props,傳遞給被包裝的組件(透?jìng)鳎?br /> ref 和 key 類似,不是一個(gè)prop,所以不會(huì)透?jìng)?,ref會(huì)綁定到外層的包裝容器上

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

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

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

      在 Hoc1外面 用React.forwardRef()對(duì)ref做處理,用props來傳遞ref
      0. 在高階組件外面包裹forwardRef,攔截獲取ref,增加一個(gè)props(xxx={ref}),真實(shí)組件通過props.xxx獲取
      1. 使用時(shí)傳 ref={XXXX}  // 和第二種方法不同的地方
      2. 用forwardRef的第二個(gè)參數(shù)獲取 ref
      3. 增加一個(gè)新的props,用來向下轉(zhuǎn)發(fā)ref  e.g. forwardedRef={ref}
      4. 真實(shí)組件中綁定 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的第二個(gè)入?yún)⒖梢越邮誶ef,在Hoc外層對(duì)ref做處理
      export default React.forwardRef((props, ref) => {
        const Wrapper = React.memo(Content);  // Hoc

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

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

  0. 使用時(shí)就用一個(gè)props來保存ref
  1. 使用時(shí)傳 xxx={ref}  // 和第一種方法的不同點(diǎn)
  2. 真實(shí)組件中綁定 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的使用方法及注意點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于React forwardRef使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redux DevTools不能顯示數(shù)據(jù)問題

    Redux DevTools不能顯示數(shù)據(jù)問題

    這篇文章主要介紹了Redux DevTools不能顯示數(shù)據(jù)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • React?Native?的動(dòng)態(tài)列表方案探索詳解

    React?Native?的動(dòng)態(tài)列表方案探索詳解

    這篇文章主要為大家介紹了React?Native?的動(dòng)態(tài)列表方案探索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 在React項(xiàng)目中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的錨點(diǎn)目錄定位

    在React項(xiàng)目中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的錨點(diǎn)目錄定位

    錨點(diǎn)目錄定位功能在長(zhǎng)頁面和文檔類網(wǎng)站中非常常見,它可以讓用戶快速定位到頁面中的某個(gè)章節(jié),本文講給大家介紹一下React項(xiàng)目中如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的錨點(diǎn)目錄定位,文中有詳細(xì)的實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-09-09
  • react實(shí)現(xiàn)antd線上主題動(dòng)態(tài)切換功能

    react實(shí)現(xiàn)antd線上主題動(dòng)態(tài)切換功能

    這篇文章主要介紹了react實(shí)現(xiàn)antd線上主題動(dòng)態(tài)切換功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • React項(xiàng)目build打包頁面空白的解決方案

    React項(xiàng)目build打包頁面空白的解決方案

    React項(xiàng)目執(zhí)行build命令后,在本地服務(wù)器打開頁面是空白的,本文主要介紹了React項(xiàng)目build打包頁面空白的解決方案,感興趣的可以了解一下
    2023-08-08
  • 在react-router4中進(jìn)行代碼拆分的方法(基于webpack)

    在react-router4中進(jìn)行代碼拆分的方法(基于webpack)

    這篇文章主要介紹了在react-router4中進(jìn)行代碼拆分的方法(基于webpack),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • React之如何在Suspense中優(yōu)雅地請(qǐng)求數(shù)據(jù)

    React之如何在Suspense中優(yōu)雅地請(qǐng)求數(shù)據(jù)

    Suspense 是 React 中的一個(gè)組件,直譯過來有懸掛的意思,能夠?qū)⑵浒漠惒浇M件掛起,直到組件加載完成后再渲染,本文詳細(xì)介紹了如何在Suspense中請(qǐng)求數(shù)據(jù),感興趣的小伙伴可以參考閱讀本文
    2023-04-04
  • react?app?rewrited替代品craco使用示例

    react?app?rewrited替代品craco使用示例

    這篇文章主要為大家介紹了react?app?rewrited替代品craco使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React Hooks - useContetx和useReducer的使用實(shí)例詳解

    React Hooks - useContetx和useReducer的使用實(shí)例詳解

    這篇文章主要介紹了React Hooks - useContetx和useReducer的基本使用,本文通過實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • 詳解React項(xiàng)目中eslint使用百度風(fēng)格

    詳解React項(xiàng)目中eslint使用百度風(fēng)格

    這篇文章主要介紹了React項(xiàng)目中eslint使用百度風(fēng)格,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

玛沁县| 常宁市| 章丘市| 阳朔县| 邵东县| 赞皇县| 龙口市| 温泉县| 浏阳市| 石泉县| 抚松县| 武夷山市| 托克托县| 古交市| 琼海市| 都匀市| 修文县| 西青区| 扬州市| 广水市| 舞阳县| 名山县| 丁青县| 平谷区| 察隅县| 安西县| 金堂县| 九江市| 塘沽区| 松潘县| 温州市| 新乐市| 阳东县| 婺源县| 化隆| 揭东县| 登封市| 定襄县| 潮州市| 怀远县| 尼木县|