91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

ForwardRef?useImperativeHandle方法怎么使用

發布時間:2023-03-21 16:17:24 來源:億速云 閱讀:244 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“ForwardRef useImperativeHandle方法怎么使用”,內容詳細,步驟清晰,細節處理妥當,希望這篇“ForwardRef useImperativeHandle方法怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、獲取Ref的方式

  • 使用字符串

  • 使用函數

  • 使用Ref對象(最常見)

  • 使用createRef

export class RefTest extends React.Component {
    currentDom: React.RefObject<HTMLDivElement> = React.createRef();
    currentChildren: React.LegacyRef<Children> = React.createRef();
    render() {
        console.log(this.currentChildren, this.currentDom);
    return (
        <>
            <div ref = { this.currentDom }>你好</div>
            <Children ref = { this.currentChildren}></Children>
        </>
       )
    }
}

ForwardRef?useImperativeHandle方法怎么使用

  • 使用useRef

export const RefTest = () => {
    const currentDom = useRef(null);
    const currentChildren = useRef(null);
    useEffect(() => {
        console.log(currentChildren, currentDom, '這里也可以打印出來了');
     },[])
   return (
   <>
       <div ref = { currentDom }>你好</div>
       <Children ref = { currentChildren }></Children>
   </>
    )
}

二、Ref實現組件通信

  • 既然ref可以獲取到子組件的實例,那么就可以拿到子組件上的狀態和方法,從而可以實現組件之間的通信

來個極簡版

ForwardRef?useImperativeHandle方法怎么使用

import React, { useEffect } from 'react';
class Son extends React.Component{
    state={
        sonValue:''
    }
    render(){
    return <div>
        <div>子組件的信息: {this.state.sonValue}</div>
        <div>對父組件說</div>
        <input onChange{(e)=>this.props.setFather(e.target.value)}/>
        </div>
    }
}
export default function Father(){
const [ fatherValue , setFatherValue ] = React.useState('')
const sonRef = React.useRef(null)
return <div>
    <div>父組件的信息: {fatherValue}</div>
    <div>對子組件說</div>
    <input onChange = { (e) => sonRef.current.setState( {sonValue: e.target.value})}/>
    <Son ref={sonRef} setFather={setFatherValue}/>
    </div>
}

ForwardRef?useImperativeHandle方法怎么使用

三、ForwardRef

  • 上面說的三種都是組件去獲取其DOM元素或者子組件的實例,當開發變得復雜時,我們可能有將ref跨層級捕獲的需求,也就是可以將ref進行轉發

比如跨層級獲取ref信息

ForwardRef?useImperativeHandle方法怎么使用

  • 來個例子, 我們希望能夠在GrandFather組件獲取到Son組件中

![圖片轉存失敗,建議將圖片保存下來直接上傳
        import React from 'react';
interface IProps {
    targetRef: React.RefObject<HTMLDivElement>
    otherProps: string
}
interface IGrandParentProps {
    otherProps: string
}
class Son extends React.Component<IProps> {
    constructor(props) {
        super(props);
        console.log(props,'son中的props');
     }
     render() {
         // 最終目標是獲取該DOM元素的信息
         return <div ref= { this.props.targetRef }>真正目的是這個</div>
     }
}
class Farther extends React.Component<IProps> {
    constructor(props) {
        super(props)
        console.log(props, 'father中的props');
    }
    render() {
        return (
        // 繼續將ref傳給Son
            <Son targetRef={this.props.targetRef} {...this.props} />
         )
    }
}
// 在這里使用了forwardRef, 相當于把傳入的ref轉發給Father組件
const ForwardRef = React.forwardRef((props: IGrandParentProps, ref: React.RefObject<HTMLDivElement>) 
    => <Farther targetRef={ref} {...props}/>)

 image.png(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5d49e7ff4ec940b28dcb3a780fd5c0a7~tplv-k3u1fbpfcp-watermark.image?)
export class GrandFather extends React.Component {
    currentRef:React.RefObject<HTMLDivElement> = React.createRef();
    componentDidMount() {
        // 獲取到的Ref信息
        console.log(this.currentRef, 'componentDidMount');
    }
    render() {
        return (
        <ForwardRef ref={this.currentRef} otherProps = '正常傳遞其他props' />
        )
    }
}
]()
  • 打印結果: 其實就是利用了forwardRef,把 ref 變成了可以通過 props 傳遞和轉發

ForwardRef?useImperativeHandle方法怎么使用

四、 useImperativeHandle

  • 上面我們一直說的都是獲取子組件的實例,但是實際上我們函數組件是沒有實例的,故我們需要借助useImperativeHandle, 使用forwardRef+useImperativeHandle就可以在函數組件中流暢地使用ref

  • useImperativeHandle可以傳入三個參數:

    • ref: 可以接受forwardRef傳入的ref

    • handleFunc: 返回值作為暴露給父組件的ref對象

    • deps: 依賴項,當依賴項改變的時候更新形成的ref對象

看完參數其實就能夠清楚地知道它的作用了,可以通過forwardRef+useImperativeHandle自定義獲取到的ref信息

再來兩個簡單例子:

import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from "react"
const ForwardItem = forwardRef((props, ref) => {
    const [sonValue, setSonValue] = useState('修改之前的值');
    useImperativeHandle(ref, () => ({
        setSonValue,
    }))
    return (
        <div>子組件的值: {sonValue}</div>
    )
})
export const Father = () => {
    const testRef = useRef(null);
    useEffect(() => {
        console.log(testRef.current, 'ref獲取到的信息')
     })
    const changeValue = () => {
        const DURATION = 2000;
        setTimeout(() => {
        testRef.current.setSonValue('我已經修改值啦')
        },DURATION)
    }
    return (
    <>
       <ForwardItem ref={ testRef }/>
       <button onClick={() => changeValue()}>2s后修改子組件ForwardItem的值</button>
    </>
    )
}
  • 父組件希望直接調用函數子組件的方法

    • 這里讓useImperativeHandle形成了有setSonValue的ref對象,然后再在父組件調用該方法

  • 父組件希望獲取到子組件的某個DOM元素

const ForwardItem = forwardRef((props, ref) => {
    const elementRef: RefObject<HTMLDivElement> = useRef();
    useImperativeHandle(ref, () => ({
        elementRef,
    }))
    return (
        <div ref = { elementRef }>我是一個子組件</div>
     )
})
export const Father = () => {
    const testRef = useRef(null);
    useEffect(() => {
        console.log(testRef.current, 'ref獲取到的信息')
     })
    return (
    <>
        <ForwardItem ref={ testRef }/>
    </>
    )
}

ForwardRef?useImperativeHandle方法怎么使用

讀到這里,這篇“ForwardRef useImperativeHandle方法怎么使用”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

台安县| 肇庆市| 武胜县| 扶余县| 澄江县| 东源县| 信阳市| 尼勒克县| 阜康市| 襄樊市| 西乌珠穆沁旗| 古交市| 石棉县| 太白县| 长垣县| 岳池县| 和硕县| 清河县| 东乡县| 平舆县| 常德市| 九寨沟县| 且末县| 土默特左旗| 荥阳市| 济源市| 荣成市| 津市市| 南汇区| 姜堰市| 甘德县| 夹江县| 平潭县| 辽阳县| 梁平县| 莱西市| 饶河县| 江安县| 嘉善县| 怀集县| 昌平区|