React Refs penggunaan lanjutan: normalisasi, pengklonan dan pemautan

Mary-Kate Olsen
Lepaskan: 2024-11-07 00:43:03
asal
292 orang telah melayarinya

React Refs advanced usage: normalization, cloning and linking

React Ref dianggap sebagai pintu keluar dalam dokumen rasmi. Dalam artikel ini, saya akan menyemak cara lanjutan menggunakan React Mutable Ref Object seperti penormalan, memaut dan pengklonan.

Normalisasi dan pengklonan

Penormalan bermaksud menjadikan sesuatu lebih teratur. Dalam kes React, ini bermakna mempunyai ref yang konsisten dan boleh diakses dalam Komponen yang dibalut dengan forwardRef. Bagaimana untuk melakukan sesuatu dengan parameter ref di dalam komponen?

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

Component.displayName = 'ComponentName';
Salin selepas log masuk

Coretan ini tidak boleh dilakukan atas dua sebab:

  • parameter ref mungkin tidak ditentukan, apabila tidak disediakan oleh pembangun.

  • Kami tidak tahu jenis rujukan yang kami peroleh, ia mungkin bukan sekadar Objek Ref Boleh Ubah, tetapi juga fungsi (rujuk balik). Yang tidak mempunyai harta semasa.

Berikut ialah cangkuk React yang membetulkan isu tersebut. Ia mengambil semua rujukan yang disediakan pengguna yang mungkin dan sentiasa mengeluarkan Objek Ref Boleh Berubah, dengan itu memberikan kami konsistensi yang diperlukan.

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;
};
Salin selepas log masuk

Berikut ialah cara menggunakan cangkuk ini

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';
Salin selepas log masuk

Memautkan

Kadangkala kita perlu memautkan dua rujukan sedia ada dan bukannya membuat rujukan baharu. Berikut ialah cara untuk melaksanakannya.

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,
    ]);
};
Salin selepas log masuk

Selamat mengekod!

Atas ialah kandungan terperinci React Refs penggunaan lanjutan: normalisasi, pengklonan dan pemautan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!