Maison > interface Web > js tutoriel > Utilisation avancée de React Refs : normalisation, clonage et liaison

Utilisation avancée de React Refs : normalisation, clonage et liaison

Mary-Kate Olsen
Libérer: 2024-11-07 00:43:03
original
398 Les gens l'ont consulté

React Refs advanced usage: normalization, cloning and linking

React Ref est considéré comme une trappe de secours dans la documentation officielle. Dans cet article, j'examinerai les méthodes avancées d'utilisation de React Mutable Ref Object telles que la normalisation, la liaison et le clonage.

Normalisation et clonage

La normalisation signifie rendre quelque chose de plus régulier. Dans le cas de React, cela signifie avoir une référence cohérente et accessible dans le composant enveloppé avec forwardRef. Comment faire quelque chose avec un paramètre ref à l'intérieur du composant ?

const Component = forwardRef<HTMLDivElement, unknown>((props, ref) => {
    // ? will not work!
    useEffect(() => {
        ref.current.focus()
    }, []);
    return <div ref={ref}>Hello, world!</div>;
});

Component.displayName = 'ComponentName';
Copier après la connexion

Cet extrait n'est pas possible pour deux raisons :

  • Le paramètre ref peut être non défini, lorsqu'il n'est pas fourni par le développeur.

  • Nous ne savons pas quel type de référence nous obtenons, ce n'est peut-être pas seulement un objet de référence mutable, mais aussi une fonction (ref de rappel). Qui n'a pas de propriété actuelle.

Voici un hook React qui résout le problème. Il prend toutes les références possibles fournies par l'utilisateur et émet toujours un objet de référence mutable, nous fournissant ainsi la cohérence requise.

import type {ForwardedRef, MutableRefObject} from 'react';
import {useImperativeHandle, useRef} from 'react';

// generic type will be resolved by the compiler
const useNormalizeRef = <TElement>(
    externalRef: ForwardedRef<TElement>
): MutableRefObject<TElement | null> => {
    // create a Mutable Ref Object for internal use
    const internalRef = useRef<TElement | null>(null);

    // this hook connects internal and external references
    useImperativeHandle<TElement | null, TElement | null>(
        externalRef,
        () => internalRef.current,
        []
    );

    return internalRef;
};
Copier après la connexion

Voici comment utiliser ce crochet

const Component = forwardRef<HTMLDivElement, unknown>((props, ref) => {
    // create an internal clone of the prop with a consistent type
    const internalRef = useNormalizeRef(ref);

    useEffect(() => {
        // access Mutable Ref Object normally
        internalRef.current!.focus();
    }, [internalRef]);

    return <div ref={ref}>Hello, world!</div>;
});

Component.displayName = 'Component';
Copier après la connexion

Enchaînement

Parfois, nous devons lier deux références existantes au lieu d'en créer une nouvelle. Voici comment le mettre en œuvre.

import type {ForwardedRef, MutableRefObject} from 'react';
import {useImperativeHandle} from 'react';

export const useLinkRefs = <TElement>(
    externalRef: ForwardedRef<TElement>,
    internalRef: MutableRefObject<TElement | null>
) => {
    useImperativeHandle<TElement | null, TElement | null>(externalRef, () => internalRef.current, [
        internalRef,
    ]);
};
Copier après la connexion

Bon codage !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal