欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

react-redux的connect與React.forwardRef結(jié)合ref失效的解決

 更新時間:2023年05月12日 08:59:11   作者:隨風丶逆風  
這篇文章主要介紹了react-redux的connect與React.forwardRef結(jié)合ref失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

react-redux的connect與React.forwardRef結(jié)合ref失效

開發(fā)中遇到connect包裹forwardRef組件后,ref引用失效,返回undefined的問題。

const CompA = React.forwardRef<OutputInterface, IProps>((props, ref) => {
? // ...
})
export default connect(mapStateToProps, mapDispatchToProps)(CompA);

原因

源碼:React.forwardRef

從下面截取的源碼中,可以看到forwardRef返回的是一個元素對象,包含了元素的類型REACT_FORWARD_REF_TYPE,以及渲染組件函數(shù)render方法,而connect需要的是組件,故透傳出現(xiàn)問題。

import {REACT_FORWARD_REF_TYPE, REACT_MEMO_TYPE} from 'shared/ReactSymbols';
export function forwardRef<Props, ElementType: React$ElementType>(
? render: (props: Props, ref: React$Ref<ElementType>) => React$Node,
) {
? // 省略邊界條件判斷
? const elementType = {
? ? $$typeof: REACT_FORWARD_REF_TYPE,
? ? render,
? };
? if (__DEV__) {
? ? let ownName;
? ? Object.defineProperty(elementType, 'displayName', {
? ? ? enumerable: false,
? ? ? configurable: true,
? ? ? get: function() {
? ? ? ? return ownName;
? ? ? },
? ? ? set: function(name) {
? ? ? ? ownName = name;
? ? ? ? if (!render.name && !render.displayName) {
? ? ? ? ? render.displayName = name;
? ? ? ? }
? ? ? },
? ? });
? }
? return elementType;
}

解決辦法

方法一:調(diào)用forwardRef返回值中的render方法 

const CompA = React.forwardRef<OutputInterface, IProps>((props, ref) => {
? // ...
})
// 直接通過render獲取渲染組件
export default connect(mapStateToProps, mapDispatchToProps)(CompA.render);

方法二:connect第4個參數(shù)可以設置{forwardRef: true}實現(xiàn)透傳 

const CompA = React.forwardRef<OutputInterface, IProps>((props, ref) => {
? // ...
})
// 直接通過render獲取渲染組件
export default connect(mapStateToProps, mapDispatchToProps, null, {
? forwardRef: true
})(CompA);

dva/redux的connect 和useRef/forwardRef混用的問題

因為要做table 滾動條高度緩存,所以用了umi-plugin-keep-alive插件,導致被包裹的子組件useffect失效。

故用父組件使用ref 調(diào)用子組件的getList方法實現(xiàn)頁面更新。 但是項目用的Dva,和useRef 一起用ref會失效。

解決方法

在connect 方法的第四個參數(shù)加 forwardRef: true,即可實現(xiàn)透傳效果,其余部分不變。

其余部分用法不變。

  • 父組件:

  • 子組件:

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • React函數(shù)式組件與類組件的不同你知道嗎

    React函數(shù)式組件與類組件的不同你知道嗎

    這篇文章主要為大家詳細介紹了React函數(shù)式組件與類組件的不同,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 淺談React雙向數(shù)據(jù)綁定原理

    淺談React雙向數(shù)據(jù)綁定原理

    在 React中是不存在雙向數(shù)據(jù)綁定的機制的,需要我們自己對其進行實現(xiàn)。本文主要介紹一下React雙向數(shù)據(jù)綁定,感興趣的可以了解一下
    2021-11-11
  • React項目配置prettier和eslint的方法

    React項目配置prettier和eslint的方法

    這篇文章主要介紹了React項目配置prettier和eslint的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • React?setState是異步還是同步原理解析

    React?setState是異步還是同步原理解析

    這篇文章主要為大家介紹了React?setState是異步還是同步原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • React?Native項目設置路徑別名示例

    React?Native項目設置路徑別名示例

    這篇文章主要為大家介紹了React?Native項目設置路徑別名實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 基于Webpack5 Module Federation的業(yè)務解耦實踐示例

    基于Webpack5 Module Federation的業(yè)務解耦實踐示例

    這篇文章主要為大家介紹了基于Webpack5 Module Federation的業(yè)務解耦實踐示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • react四種組件中DOM樣式設置方式詳解

    react四種組件中DOM樣式設置方式詳解

    這篇文章主要介紹了react之四種組件中DOM樣式設置方式,通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • JavaScript React如何修改默認端口號方法詳解

    JavaScript React如何修改默認端口號方法詳解

    這篇文章主要介紹了JavaScript React如何修改默認端口號方法詳解,文中通過步驟圖片解析介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 理解react中受控組件和非受控組件及應用場景

    理解react中受控組件和非受控組件及應用場景

    當涉及到React框架時,了解受控組件和非受控組件是非常重要的概念,本文主要介紹了理解react中受控組件和非受控組件及應用場景,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • React實現(xiàn)合成事件的源碼分析

    React實現(xiàn)合成事件的源碼分析

    React?中的事件,是對原生事件的封裝,叫做合成事件。抽象出一層合成事件,是為了做兼容,抹平不同瀏覽器之間的差異。本文將從事件綁定和事件觸發(fā)角度,帶大家解讀下源碼,感興趣的可以了解一下
    2022-12-12

最新評論