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

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)編寫我們的邏輯來(lái)處理 多個(gè) ref 綁定元素實(shí)例的場(chǎng)景。(函數(shù)的靈活性)

實(shí)現(xiàn)

  • 編寫一個(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 編寫一個(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)文章

  • 詳解使用WebPack搭建React開(kāi)發(fā)環(huán)境

    詳解使用WebPack搭建React開(kāi)發(fā)環(huán)境

    這篇文章主要介紹了詳解使用WebPack搭建React開(kāi)發(fā)環(huán)境,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • react以create-react-app為基礎(chǔ)創(chuàng)建項(xiàng)目

    react以create-react-app為基礎(chǔ)創(chuàng)建項(xiàng)目

    這篇文章主要介紹了react以create-react-app為基礎(chǔ)創(chuàng)建項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • React項(xiàng)目經(jīng)驗(yàn)總結(jié)及遇到的坑

    React項(xiàng)目經(jīng)驗(yàn)總結(jié)及遇到的坑

    這篇文章主要介紹了React項(xiàng)目經(jīng)驗(yàn)總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • 40行代碼把Vue3的響應(yīng)式集成進(jìn)React做狀態(tài)管理

    40行代碼把Vue3的響應(yīng)式集成進(jìn)React做狀態(tài)管理

    這篇文章主要介紹了40行代碼把Vue3的響應(yīng)式集成進(jìn)React做狀態(tài)管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • ReactNative支付密碼輸入框?qū)崿F(xiàn)詳解

    ReactNative支付密碼輸入框?qū)崿F(xiàn)詳解

    這篇文章主要為大家介紹了ReactNative支付密碼輸入框?qū)崿F(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • react中JSX的注意點(diǎn)詳解

    react中JSX的注意點(diǎn)詳解

    這篇文章主要為大家詳細(xì)介紹了react中JSX的注意點(diǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 使用webpack5從0到1搭建一個(gè)react項(xiàng)目的實(shí)現(xiàn)步驟

    使用webpack5從0到1搭建一個(gè)react項(xiàng)目的實(shí)現(xiàn)步驟

    這篇文章主要介紹了使用webpack5從0到1搭建一個(gè)react項(xiàng)目的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 再次談?wù)揜eact.js實(shí)現(xiàn)原生js拖拽效果引起的一系列問(wèn)題

    再次談?wù)揜eact.js實(shí)現(xiàn)原生js拖拽效果引起的一系列問(wèn)題

    React 起源于 Facebook 的內(nèi)部項(xiàng)目,因?yàn)樵摴緦?duì)市場(chǎng)上所有 JavaScript MVC 框架,都不滿意,就決定自己寫一套,用來(lái)架設(shè) Instagram 的網(wǎng)站.本文給大家介紹React.js實(shí)現(xiàn)原生js拖拽效果,需要的朋友一起學(xué)習(xí)吧
    2016-04-04
  • React.memo?React.useMemo對(duì)項(xiàng)目性能優(yōu)化使用詳解

    React.memo?React.useMemo對(duì)項(xiàng)目性能優(yōu)化使用詳解

    這篇文章主要為大家介紹了React.memo?React.useMemo對(duì)項(xiàng)目性能優(yōu)化的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • react 組件傳值的三種方法

    react 組件傳值的三種方法

    這篇文章主要介紹了react 組件傳值的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評(píng)論