react使用useImperativeHandle示例詳解
1.前言
相比大家看到useImperativeHandle會感到十分陌生,但部分開源代碼經(jīng)常會出現(xiàn)它的身影,網(wǎng)上查閱的資料也是含糊不清。經(jīng)過一翻資料查詢,終于摸清了一點(diǎn),現(xiàn)在分享給各位爺。
2.useImperativeHandle初探
React官網(wǎng)的定義
useImperativeHandle
可以讓你在使用 ref
時(shí)自定義暴露給父組件的實(shí)例值。
個(gè)人理解
官網(wǎng)的話用大白話解析:useImperativeHandle的作用是將子組件的指定元素暴漏給父組件使用。也就是父組件可以訪問到子組件內(nèi)部的特定元素。
3.獲取元素的幾種方式
下面我將逐步介紹獲取元素的方式,進(jìn)而引出今天的主角useImperativeHandle。
3.1 useRef:獲取組件內(nèi)部元素
import {useRef} from "react" export default function() { //1. const ele = useRef() //3.獲取元素 const getElememntP = () => { console.log(ele.current) } return <div > <button onClick={()=>getElememntP()}>獲取p元素</button> //2. <p ref={ref}></p> </div> }
點(diǎn)擊按鈕,我們可以獲取到p元素。上面是useRef獲取元素的方法,先簡單小結(jié)下步驟
- 引入useRef,定義變量
- 在需要獲取的dom元素上使用ref進(jìn)行變量綁定
- 使用變量.current獲取對應(yīng)元素
3.2 forwardRef:父組件獲取子組件內(nèi)部的一個(gè)元素
上面的useRef在函數(shù)組件可以獲取自身組件內(nèi)部的元素,但是如果我們需要在父組件獲取或者操作兒子組件的一個(gè)元素,此時(shí)forwardRef就隨之出現(xiàn)了。
father.js
import {useRef} from "react" import Son from "./son" export default function(){ const eleP = useRef() const getElement = () => { console.log(eleP.current) } return <div> <button onClick={()=>getElement()}>點(diǎn)擊獲取子組件的p元素</button> <Son ref={eleP}/></div> }
son.js
import {forwardRef} from "react" export default forwardRef(function(props,ref){ return <div > <p ref={ref}></p> </div> })
父元素點(diǎn)擊按鈕后,可以獲取到兒子組件的p元素。
forwardRef在父組件獲取兒子組件內(nèi)部一個(gè)元素時(shí),操作如下。
- 父組件按照useRef的規(guī)則綁定到兒子組件上
- 兒子組件使用forwardRef包裹,并在函數(shù)組件傳遞的參數(shù)接收,第一個(gè)參數(shù)porps接收父組件傳遞的數(shù)據(jù),第二個(gè)ref接收的就是dom引用
- 在需要獲取兒子組件的元素上直接綁定ref的值
3.3 useImperativeHandle:父組件可以獲取/操作兒子組件多個(gè)元素
經(jīng)過上面層層遞進(jìn),終于來到我們今天的主角了,請大聲告訴我她的名字:是usexxxHandle。它可以在父組件內(nèi)部直接獲取兒子組件任意的dom元素對象。
father.js
import {useRef} from "react" import Son from "./son" export default function(){ const eleP = useRef() const getElement = () => { console.log(eleP.current.ele1.current) console.log(eleP.current.ele2.current) } return <div> <button onClick={()=>getElement()}>點(diǎn)擊獲取子組件元素</button> <Son ref={eleP}/></div> }
son.js
import {useRef,forwardRef,useImperativeHandle} from "react" export default forwardRef(function(props,ref){ const ele1 = useRef() const ele2 = useRef() useImperativeHandle(ref,()=>{ return {ele1,ele2} },[]) return <div > <h2 ref={ele1}></h2> <h3 ref={ele2}></h3> </div> })
結(jié)果
<h2></h2>
<h3></h3>
父組件點(diǎn)擊按鈕后,可以一次性獲取到多個(gè)標(biāo)簽元素,通過useImperativeHandle函數(shù)內(nèi)部返回的對象可以獲取對應(yīng)的標(biāo)簽。具體使用直接看例子就行,我列舉下useImperativeHandle的參數(shù)要求吧
useImperativeHandle(ref,()=>{ return {dom1,dom2} },[])
第一個(gè)參數(shù)是組件的第二個(gè)參數(shù)ref 第二個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),內(nèi)部返回的對象就是拋給父組件的元素對象 第三個(gè)參數(shù)是一個(gè)依賴數(shù)組,類似useEffect的依賴數(shù)組,如果依賴數(shù)組內(nèi)部傳遞的數(shù)據(jù)發(fā)生改變,就會重新觸發(fā)回調(diào)函數(shù)。
以上就是react使用useImperativeHandle示例詳解的詳細(xì)內(nèi)容,更多關(guān)于react使用useImperativeHandle的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
React路由渲染方式與withRouter高階組件及自定義導(dǎo)航組件應(yīng)用詳細(xì)介紹
這篇文章主要介紹了React路由三種渲染方式、withRouter高階組件、自定義導(dǎo)航組件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09React Native 搭建開發(fā)環(huán)境的方法步驟
本篇文章主要介紹了React Native 搭建開發(fā)環(huán)境的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10React組件如何優(yōu)雅地處理異步數(shù)據(jù)詳解
這篇文章主要為大家介紹了React組件如何優(yōu)雅地處理異步數(shù)據(jù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10前端 react 實(shí)現(xiàn)圖片上傳前壓縮(縮率圖)
這篇文章主要介紹了前端 react 實(shí)現(xiàn)圖片上傳前壓縮(縮率圖),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08React中項(xiàng)目路由配置與跳轉(zhuǎn)方法詳解
這篇文章主要為大家詳細(xì)介紹了React中項(xiàng)目路由配置與跳轉(zhuǎn)方法的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-08-082023年最新react面試題總結(jié)大全(附詳細(xì)答案)
React是一種廣泛使用的JavaScript庫,為構(gòu)建用戶界面提供了強(qiáng)大的工具和技術(shù),這篇文章主要給大家介紹了關(guān)于2023年最新react面試題的相關(guān)資料,文中還附有詳細(xì)答案,需要的朋友可以參考下2023-10-10