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

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

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

react-connect使用forwardRef遇到的問題

項(xiàng)目場(chǎng)景

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

原因

子組件用了使用了connect, 相當(dāng)于把forwardRef隔離了,導(dǎo)致父組件拿不到想要的方法, 所以需要把forwardRef 透?jìng)鹘o使用了connect 的子組件  

問題描述

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

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

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

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

解決方案

tip:  我的項(xiàng)目使用的是umi2

利用Hoc(高階組件)透?jìng)鱮ef

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 透?jìng)?ref
export default forwardRef((props, ref) => <newA  {...props} refInstance={ref} />);

React.forwardRef的使用說明

React.forwardRef

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

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

應(yīng)用場(chǎng)景

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

但問題來了

如果目標(biāo)組件是一個(gè) FunctionComponent 的話,是沒有實(shí)例的(PureComponent),此時(shí)用 ref 去傳遞會(huì)報(bào)錯(cuò)

React.forwardRef 會(huì)創(chuàng)建一個(gè)React組件,這個(gè)組件能夠?qū)⑵浣邮艿?ref 屬性轉(zhuǎn)發(fā)到其組件樹下的另一個(gè)組件中。這種技術(shù)并不常見,但在以下兩種場(chǎng)景中特別有用:

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

實(shí)例:

點(diǎn)擊搜索按鈕時(shí),讓文本輸入框處于聚焦?fàn)顟B(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"
? ? ? ? }}>獲取焦點(diǎn)</button>
? ? ? ? <Child callback={(el)=>{
? ? ? ? ? console.log(el);、
? ? ? ? ? //el是臨時(shí)變量,用全局的去接這個(gè)值
? ? ? ? ? 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"
? ? ? }}>獲取焦點(diǎn)</button>
? ? ? <Child ref={this.mytext}/>
? ? ? </div>
? ? )
? }
}
//這里Child是函數(shù)式組件
const Child=forwardRef((props,ref)=>{
? ? return (
? ? ? <div>
? ? ? ? <input defaultValue="11111" ref={ref}></input>
? ? ? </div>
? ? );
})

總結(jié)

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

相關(guān)文章

  • react組件中過渡動(dòng)畫的問題解決

    react組件中過渡動(dòng)畫的問題解決

    這篇文章主要為大家介紹了react組件中過渡動(dòng)畫的問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • React服務(wù)端渲染原理解析與實(shí)踐

    React服務(wù)端渲染原理解析與實(shí)踐

    這篇文章主要介紹了React服務(wù)端渲染原理解析與實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • antd?table動(dòng)態(tài)修改表格高度的實(shí)現(xiàn)

    antd?table動(dòng)態(tài)修改表格高度的實(shí)現(xiàn)

    本文主要介紹了antd?table動(dòng)態(tài)修改表格高度的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 使用React?Redux實(shí)現(xiàn)React組件之間的數(shù)據(jù)共享

    使用React?Redux實(shí)現(xiàn)React組件之間的數(shù)據(jù)共享

    在復(fù)雜的React應(yīng)用中,組件之間的數(shù)據(jù)共享是必不可少的,為了解決這個(gè)問題,可以使用React?Redux來管理應(yīng)用的狀態(tài),并實(shí)現(xiàn)組件之間的數(shù)據(jù)共享,在本文中,我們將介紹如何使用React?Redux實(shí)現(xiàn)Count和Person組件之間的數(shù)據(jù)共享,需要的朋友可以參考下
    2024-03-03
  • React Hook的使用示例

    React Hook的使用示例

    這篇文章主要介紹了React Hook的使用示例,幫助大家更好的理解和學(xué)習(xí)使用React,感興趣的朋友可以了解下
    2021-04-04
  • 淺談react路由傳參的幾種方式

    淺談react路由傳參的幾種方式

    這篇文章主要介紹了淺談react路由傳參的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • React函數(shù)組件和類組件的區(qū)別及說明

    React函數(shù)組件和類組件的區(qū)別及說明

    這篇文章主要介紹了React函數(shù)組件和類組件的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • React中父子組件通信詳解

    React中父子組件通信詳解

    這篇文章主要介紹了React中父子組件通信詳解,在父組件中,為子組件添加屬性數(shù)據(jù),即可實(shí)現(xiàn)父組件向子組件通信,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • React簡(jiǎn)便獲取經(jīng)緯度信息的方法詳解

    React簡(jiǎn)便獲取經(jīng)緯度信息的方法詳解

    在現(xiàn)代的Web應(yīng)用程序中,獲取用戶的地理位置信息是一項(xiàng)常見的需求,本文我們將介紹如何在React應(yīng)用程序中簡(jiǎn)便地獲取用戶的經(jīng)緯度信息,需要的可以參考下
    2023-11-11
  • 解決React報(bào)錯(cuò)Property 'X' does not exist on type 'HTMLElement'

    解決React報(bào)錯(cuò)Property 'X' does not 

    這篇文章主要為大家介紹了解決React報(bào)錯(cuò)Property 'X' does not exist on type 'HTMLElement',有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論