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

React自定義Hook-useForkRef的具體使用

 更新時(shí)間:2022年03月07日 09:54:21   作者:明里人  
本文主要介紹了React自定義Hook-useForkRef的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

開(kāi)篇

使用過(guò) React 技術(shù)棧的同學(xué)相信都使用過(guò) ref 傳遞給 render 中的元素,而在使用 React 封裝組件時(shí),會(huì)有這樣一個(gè)場(chǎng)景:

組件將 props.children 作為 render 內(nèi)容;組件內(nèi)部會(huì)創(chuàng)建 ref 綁定到 props.children 上。

我們知道,元素上只能綁定一個(gè) ref 屬性引用,但對(duì)于上面這個(gè)場(chǎng)景,props.children 上可能已經(jīng)存在一個(gè) ref 屬性,而組件內(nèi)部定義的 ref 也會(huì)綁定到 props.children 上。
我們要想一種方式,將兩者的 ref 都可以生效于元素上。

思路

首先我們回顧一下 React 創(chuàng)建 ref 的方式:

  • React.createRef():React 16.3 版本提供的 class 創(chuàng)建 ref 方式;
  • React.useRef():React Hooks 提供的 函數(shù)組件 創(chuàng)建 ref 方式;
  • 回調(diào) Refs:傳遞一個(gè)函數(shù)作為元素的 ref 屬性,此函數(shù)接收 React 組件實(shí)例或 HTML DOM 元素作為參數(shù)。

綜合考慮,既然 回調(diào) Refs 允許我們傳遞一個(gè)函數(shù),并且接收元素實(shí)例作為這個(gè)函數(shù)的參數(shù),那我們就可以定義一個(gè)這樣的函數(shù),在函數(shù)內(nèi)編寫(xiě)我們的邏輯來(lái)處理 多個(gè) ref 綁定元素實(shí)例的場(chǎng)景。(函數(shù)的靈活性)

實(shí)現(xiàn)

  • 編寫(xiě)一個(gè)函數(shù)(閉包函數(shù)),接收 props.children.ref 和 組件內(nèi) ref 作為參數(shù);
  • 函數(shù)(閉包函數(shù))需要 return 返回一個(gè)函數(shù),這個(gè)函數(shù)將作為 回調(diào) Refs 去作用于元素;
  • 在 return 的這個(gè)函數(shù)中,將函數(shù)參數(shù)(元素引用)綁定到 props.children.ref 和 組件內(nèi) ref 上。

上代碼:

function forkRef(refA, refB) {
? return refValue => {
? ? setRef(refA, refValue);
? ? setRef(refB, refValue);
? };
}

function setRef(ref, value) {
? if (typeof ref === 'function') {
? ? ref(value);
? } else if (ref) {
? ? ref.current = value;
? }
}

在 setRef 中會(huì)針對(duì)創(chuàng)建 ref 的方式做不同處理,比如:React.createRef 和 React.useRef 創(chuàng)建的 ref 是一個(gè)具有 current 屬性的對(duì)象。

使用:

const nodeRef = React.useRef(null); // 組件內(nèi)部的 ref

const handleRef = forkRef(props.children.ref, nodeRef);

const childrenProps = { ref: handleRef };

return React.cloneElement(children, childrenProps);

自定義 Hook - useForkRef

在 Hook 函數(shù)組件中,我們可以借助于 React.memo() 優(yōu)化一下 forkRef() 的邏輯,避免每次組件更新時(shí)都創(chuàng)建一個(gè)新的閉包函數(shù)。
下面我們使用 TS 編寫(xiě)一個(gè) useForkRef:

import * as React from 'react';

interface MutableRefObject<T> {
? current: T;
}

type Ref<T> = ((instance: T | null) => void) | MutableRefObject<T> | null;

export function setRef(ref: Ref<unknown>, value: unknown) {
? if (typeof ref === 'function') {
? ? ref(value);
? } else if (ref) {
? ? ref.current = value;
? }
}

export default function useForkRef(refA: Ref<unknown>, refB: Ref<unknown>) {
? return React.useMemo(() => {
? ? if (refA == null && refB == null) {
? ? ? return null;
? ? }
? ? return (refValue: unknown) => {
? ? ? setRef(refA, refValue);
? ? ? setRef(refB, refValue);
? ? };
? }, [refA, refB]);
}

使用:

const nodeRef = React.useRef<HTMLElement>(null); // 組件內(nèi)部的 ref
const handleRef = useForkRef(children.ref, nodeRef);

const childrenProps: any = { ref: handleRef };
React.cloneElement(children, childrenProps)

到此這篇關(guān)于React自定義Hook-useForkRef的具體使用的文章就介紹到這了,更多相關(guān)React Hook-useForkRe內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解React如何使用??useReducer???高階鉤子來(lái)管理狀態(tài)

    詳解React如何使用??useReducer???高階鉤子來(lái)管理狀態(tài)

    useReducer是React中的一個(gè)鉤子,用于替代?useState來(lái)管理復(fù)雜的狀態(tài)邏輯,本文將詳細(xì)介紹如何在React中使用?useReducer高階鉤子來(lái)管理狀態(tài),感興趣的可以了解下
    2025-02-02
  • React新擴(kuò)展函數(shù)setState與lazyLoad及hook介紹

    React新擴(kuò)展函數(shù)setState與lazyLoad及hook介紹

    這篇文章主要介紹了React新擴(kuò)展函數(shù)setState與lazyLoad及hook,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12
  • React中常見(jiàn)的TypeScript定義實(shí)戰(zhàn)教程

    React中常見(jiàn)的TypeScript定義實(shí)戰(zhàn)教程

    這篇文章主要介紹了React中常見(jiàn)的TypeScript定義實(shí)戰(zhàn),本文介紹了Fiber結(jié)構(gòu),F(xiàn)iber的生成過(guò)程,調(diào)和過(guò)程,以及 render 和 commit 兩大階段,需要的朋友可以參考下
    2022-10-10
  • React?組件性能最佳優(yōu)化實(shí)踐分享

    React?組件性能最佳優(yōu)化實(shí)踐分享

    這篇文章主要介紹了React組件性能最佳優(yōu)化實(shí)踐分享,React組件性能優(yōu)化的核心是減少渲染真實(shí)DOM節(jié)點(diǎn)的頻率,減少Virtual?DOM比對(duì)的頻率,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-09-09
  • 使用Node搭建reactSSR服務(wù)端渲染架構(gòu)

    使用Node搭建reactSSR服務(wù)端渲染架構(gòu)

    這篇文章主要介紹了使用Node搭建reactSSR服務(wù)端渲染架構(gòu),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 關(guān)于react useState更新異步問(wèn)題

    關(guān)于react useState更新異步問(wèn)題

    這篇文章主要介紹了關(guān)于react useState更新異步問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

    2022-08-08
  • react源碼中的生命周期和事件系統(tǒng)實(shí)例解析

    react源碼中的生命周期和事件系統(tǒng)實(shí)例解析

    這篇文章主要為大家介紹了react源碼中的生命周期和事件系統(tǒng)實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 你知道怎么基于?React?封裝一個(gè)組件嗎

    你知道怎么基于?React?封裝一個(gè)組件嗎

    這篇文章主要為大家詳細(xì)介紹了React如何封裝一個(gè)組件,使用antd的divider組件來(lái)講解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Javascript之提高React性能的技巧

    Javascript之提高React性能的技巧

    一些剛開(kāi)始學(xué)習(xí) React,或者從其他框架轉(zhuǎn)入 React 的開(kāi)發(fā)者,一開(kāi)始可能不會(huì)太關(guān)注性能。因?yàn)樾枰恍r(shí)間來(lái)發(fā)現(xiàn)新學(xué)習(xí)的框架的性能缺點(diǎn)。這篇文章主要介紹提高React性能的技巧,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • 基于React封裝一個(gè)層次模糊效果的容器組件

    基于React封裝一個(gè)層次模糊效果的容器組件

    這篇文章主要為大家詳細(xì)介紹了如何基于React封裝一個(gè)層次模糊效果的容器組件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03

最新評(píng)論

扎赉特旗| 兴安盟| 宜川县| 铜川市| 来安县| 邵阳县| 化州市| 永春县| 霍山县| 尚义县| 开阳县| 衡山县| 阿城市| 方山县| 观塘区| 西畴县| 岳阳县| 崇礼县| 衡南县| 九台市| 达州市| 阳城县| 大新县| 清苑县| 轮台县| 池州市| 广元市| 高碑店市| 兴山县| 巴彦淖尔市| 新竹市| 金华市| 辛集市| 昭平县| 松桃| 万年县| 都江堰市| 偏关县| 南昌县| 石门县| 习水县|