Hooks 的 useImperativeHandle 怎么用?

Hook 第 1 篇

序言:

搞懂Hooks的第一篇,犄角旮旯的也捋清楚,目標(biāo)要打通 React 這塊的源碼!

ref 的使用

普通的類組件有實(shí)例所以可以用過(guò) React.createRef() 掛載到節(jié)點(diǎn)或組件上,然后通過(guò) this 獲取到該節(jié)點(diǎn)或組件。

class RefTest extends React.Component{
    constructor(props){
        super(props);
        this.myRef=React.createRef();
    }
    componentDidMount(){
        console.log(this.myRef.current);
    }
    render(){
        return <input ref={this.myRef}/>
    }
}

useImperativeHandle 的使用

正常情況下 ref 是不能掛在到函數(shù)組件上的,因?yàn)楹瘮?shù)組件沒(méi)有實(shí)例,但是 useImperativeHandle 為我們提供了一個(gè)類似實(shí)例的東西。它幫助我們通過(guò) useImperativeHandle 的第 2 個(gè)參數(shù),所返回的對(duì)象的內(nèi)容掛載到 父組件的 ref.current 上。

forwardRef會(huì)創(chuàng)建一個(gè)React組件,這個(gè)組件能夠?qū)⑵浣邮艿?ref 屬性轉(zhuǎn)發(fā)到其組件樹(shù)下的另一個(gè)組件中。

import React, { forwardRef, useImperativeHandle, useEffect, useRef } from 'react'

const TestRef = forwardRef((props, ref) => {
  useImperativeHandle(ref, () => ({
    open() {
      console.log("open")
    }
  }))
})

function App () {
  const ref = useRef()
  useEffect(() => {
    ref.current.open()
  },[])
  
  return(
    <>
      <div>石小陽(yáng)</div>
      <TestRef ref={ref}></TestRef>
    </>
  )
}
export default App

最后結(jié)果打印出了open。


result
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容