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

解決react-connect中使用forwardRef遇到的問題

 更新時間:2023年05月12日 08:48:49   作者:半糖氣泡。  
這篇文章主要介紹了解決react-connect中使用forwardRef遇到的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

react-connect使用forwardRef遇到的問題

項目場景

之前獨立的兩個tab,  tab1和tab2,  由于需求變更,  要把這兩個tab都放到一個tab4下, 變化大概是從圖1變?yōu)閳D2

原因

子組件用了使用了connect, 相當于把forwardRef隔離了,導致父組件拿不到想要的方法, 所以需要把forwardRef 透傳給使用了connect 的子組件  

問題描述

tip:  該文章以下內容中說的子組件指tab1和tab2,  父組件指tab4

tab1和tab2組件都有"更新數(shù)據(jù)"按鈕,將他們合并為tab4里面之后,"更新數(shù)據(jù)"按鈕已經變成了父組件(tab4)的內容, 但是由于按鈕的onClick事件中的邏輯太復雜,  所以點擊事件沒有挪出來重新寫到父組件里。

也就是:按鈕在父組件中,  按鈕的點擊事件在子組件里寫。

子組件和父組件都是用函數(shù)組件 + Hook 寫的, 并且子組件中都用了connect,  此時父組件想調用子組件的點擊事件方法,  該怎么拿到子組件里的方法呢?

解決方案

tip:  我的項目使用的是umi2

利用Hoc(高階組件)透傳ref

import React, { forwardRef, useImperativeHandle, useState, useEffect } from 'react';
import { connect } from 'dva'
const Children = (props) => {
  const { refInstance } = props
  const [text, setText] = useState('子組件:Children')
  const functionA = () => {
    console.log('c2方法')
    setText('ref改變了')
  }
  useImperativeHandle(refInstance, () => ({
    functionA,
    text,
  }))
return (
    <div>
      {text}
    </div>
)}
const newA =  connect((state) => {
  return {
    list: state.list,
  }
})(Children)
// 使用Hoc 透傳 ref
export default forwardRef((props, ref) => <newA  {...props} refInstance={ref} />);

React.forwardRef的使用說明

React.forwardRef

forwardRef實際上就是當父組件需要得到子組件元素時,可以利用forwardRef來實現(xiàn)。

該方法接受一個有額外ref參數(shù)的react組件函數(shù),不調用該方法,普通的組件函數(shù)是不會獲得該參數(shù)的。

應用場景

ref 的作用是獲取實例,可能是 DOM 實例,也可能是 ClassComponent 的實例。

但問題來了

如果目標組件是一個 FunctionComponent 的話,是沒有實例的(PureComponent),此時用 ref 去傳遞會報錯

React.forwardRef 會創(chuàng)建一個React組件,這個組件能夠將其接受的 ref 屬性轉發(fā)到其組件樹下的另一個組件中。這種技術并不常見,但在以下兩種場景中特別有用:

  • 轉發(fā) refs 到 DOM 組件
  • 在高階組件中轉發(fā) refs

實例:

點擊搜索按鈕時,讓文本輸入框處于聚焦狀態(tài)

1、普通用法:

import React, { Component } from 'react'
export default class App extends Component {
? mytext=null
? render() {
? ? return (
? ? ? <div>
? ? ? ? <button type="button" onClick={()=>{
? ? ? ? ? console.log(this.mytext);
? ? ? ? ? this.mytext.current.focus()
? ? ? ? ? this.mytext.current.value="2222"
? ? ? ? }}>獲取焦點</button>
? ? ? ? <Child callback={(el)=>{
? ? ? ? ? console.log(el);、
? ? ? ? ? //el是臨時變量,用全局的去接這個值
? ? ? ? ? this.mytext=el
? ? ? ? ? //console.log(el.current);
? ? ? ? }}/>
? ? ? </div>
? ? )
? }
}
class Child extends Component {
? mytext = React.createRef();
? //組件渲染完了執(zhí)行
? componentDidMount() {
? ? this.props.callback(this.mytext);
? }
? render() {
? ? return (
? ? ? <div style={{background:"yellow"}}>
? ? ? ? <input defaultValue="1111" ref={this.mytext}></input>
? ? ? </div>
? ? );
? }
}

2、使用forwardRef

import React, { Component,forwardRef } from 'react'
export default class App_forwardRef extends Component {
? mytext=React.createRef()
? render() {
? ? return (
? ? ? <div>
? ? ? <button type="button" onClick={()=>{
? ? ? ? console.log(this.mytext);
? ? ? ? this.mytext.current.value="2222"
? ? ? }}>獲取焦點</button>
? ? ? <Child ref={this.mytext}/>
? ? ? </div>
? ? )
? }
}
//這里Child是函數(shù)式組件
const Child=forwardRef((props,ref)=>{
? ? return (
? ? ? <div>
? ? ? ? <input defaultValue="11111" ref={ref}></input>
? ? ? </div>
? ? );
})

總結

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

相關文章

  • React?Hooks useReducer?逃避deps組件渲染次數(shù)增加陷阱

    React?Hooks useReducer?逃避deps組件渲染次數(shù)增加陷阱

    這篇文章主要介紹了React?Hooks?之?useReducer?逃避deps后增加組件渲染次數(shù)的陷阱詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • React-router 4 按需加載的實現(xiàn)方式及原理詳解

    React-router 4 按需加載的實現(xiàn)方式及原理詳解

    本篇文章主要介紹了React-router 4 按需加載的實現(xiàn)方式及原理詳解,非常具有實用價值,需要的朋友可以參考下
    2017-05-05
  • react進階教程之異常處理機制error?Boundaries

    react進階教程之異常處理機制error?Boundaries

    在react中一旦出錯,如果每個組件去處理出錯情況則比較麻煩,下面這篇文章主要給大家介紹了關于react進階教程之異常處理機制error?Boundaries的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • 淺談React Native 中組件的生命周期

    淺談React Native 中組件的生命周期

    本篇文章主要介紹了淺談React Native 中組件的生命周期,非常具有實用價值,需要的朋友可以參考下
    2017-09-09
  • React Native中導航組件react-navigation跨tab路由處理詳解

    React Native中導航組件react-navigation跨tab路由處理詳解

    這篇文章主要給大家介紹了關于React Native中導航組件react-navigation跨tab路由處理的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • react中value與defaultValue的區(qū)別及說明

    react中value與defaultValue的區(qū)別及說明

    這篇文章主要介紹了react中value與defaultValue的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • React錯誤邊界Error Boundaries詳解

    React錯誤邊界Error Boundaries詳解

    錯誤邊界是一種React組件,這種組件可以捕獲發(fā)生在其子組件樹任何位置的JavaScript錯誤,并打印這些錯誤,同時展示降級UI,而并不會渲染那些發(fā)生崩潰的子組件樹
    2022-12-12
  • 在React中使用SVG的幾種方式

    在React中使用SVG的幾種方式

    在React中,SVG(Scalable?Vector?Graphics)的使用非常普遍,因為它們提供了可伸縮的矢量圖形,這對于現(xiàn)代Web應用來說是非常重要的,以下是幾種常見的在React中使用SVG的方法,每種方法都有其特定的用例和最佳實踐,需要的朋友可以參考下
    2024-11-11
  • 使用React?Router?v6?添加身份驗證的方法

    使用React?Router?v6?添加身份驗證的方法

    這篇文章主要介紹了使用React?Router?v6?進行身份驗證完全指南,本文將演示如何使用React?Router?v6創(chuàng)建受保護的路由以及如何添加身份驗證,需要的朋友可以參考下
    2022-05-05
  • ahooks解決React閉包問題方法示例

    ahooks解決React閉包問題方法示例

    這篇文章主要為大家介紹了ahooks解決React閉包問題方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論

平阳县| 林芝县| 桃园县| 广丰县| 泸水县| 蚌埠市| 许昌县| 榆林市| 荔波县| 遂平县| 卓尼县| 游戏| 丹凤县| 法库县| 旅游| 错那县| 龙川县| 巴南区| 越西县| 连江县| 维西| 宿迁市| 玛沁县| 基隆市| 和硕县| 额敏县| 库车县| 宁南县| 通化县| 扶绥县| 咸宁市| 射阳县| 钟山县| 大余县| 盐亭县| 文化| 永昌县| 乌审旗| 荣成市| 新竹县| 襄垣县|