Lietuvių

Susipažinkite su React useEvent kabliuku – galingu įrankiu, skirtu kurti stabilias įvykių doroklių nuorodas dinamiškose React programose, gerinant našumą ir išvengiant nereikalingų pervaizdavimų.

React useEvent: Stabilių įvykių doroklių nuorodų pasiekimas

React programuotojai dažnai susiduria su iššūkiais dirbdami su įvykių dorokliais, ypač scenarijuose, apimančiuose dinamiškus komponentus ir uždaras sritis (closures). useEvent kabliukas, palyginti nesenas papildymas React ekosistemoje, siūlo elegantišką šių problemų sprendimą, leidžiantį programuotojams sukurti stabilias įvykių doroklių nuorodas, kurios nesukelia nereikalingų pervaizdavimų.

Problemos supratimas: Įvykių doroklių nestabilumas

React aplinkoje, komponentai pervaizduojami, kai keičiasi jų savybės (props) ar būsena (state). Kai įvykio doroklio funkcija perduodama kaip savybė, dažnai su kiekvienu pagrindinio komponento pervaizdavimu sukuriama nauja funkcijos instancija. Ši nauja funkcijos instancija, net jei jos logika yra ta pati, React požiūriu laikoma skirtinga, o tai lemia ją gaunančio antrinio komponento pervaizdavimą.

Panagrinėkime šį paprastą pavyzdį:


import React, { useState } from 'react';

function ParentComponent() {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    console.log('Clicked from Parent:', count);
    setCount(count + 1);
  };

  return (
    

Count: {count}

); } function ChildComponent({ onClick }) { console.log('ChildComponent rendered'); return ; } export default ParentComponent;

Šiame pavyzdyje handleClick yra sukuriama iš naujo su kiekvienu ParentComponent pervaizdavimu. Net jei ChildComponent būtų optimizuotas (pvz., naudojant React.memo), jis vis tiek bus pervaizduojamas, nes onClick savybė pasikeitė. Tai gali sukelti našumo problemų, ypač sudėtingose programose.

Pristatome useEvent: Sprendimas

useEvent kabliukas išsprendžia šią problemą, suteikdamas stabilią nuorodą į įvykio doroklio funkciją. Jis efektyviai atsieja įvykio doroklį nuo jo pagrindinio komponento pervaizdavimo ciklo.

Nors useEvent nėra įtaisytasis React kabliukas (React 18 versijoje), jį galima lengvai įgyvendinti kaip pasirinktinį kabliuką arba, kai kuriose sistemose ir bibliotekose, jis pateikiamas kaip jų įrankių rinkinio dalis. Štai įprastas įgyvendinimas:


import { useCallback, useRef, useLayoutEffect } from 'react';

function useEvent any>(fn: T): T {
  const ref = useRef(fn);

  // UseLayoutEffect is crucial here for synchronous updates
  useLayoutEffect(() => {
    ref.current = fn;
  });

  return useCallback(
    (...args: Parameters): ReturnType => {
      return ref.current(...args);
    },
    [] // The dependency array is intentionally empty, ensuring stability
  ) as T;
}

export default useEvent;

Paaiškinimas:

useEvent naudojimas praktikoje

Dabar, pertvarkykime ankstesnį pavyzdį naudojant useEvent:


import React, { useState, useCallback, useRef, useLayoutEffect } from 'react';

function useEvent any>(fn: T): T {
  const ref = useRef(fn);

  // UseLayoutEffect is crucial here for synchronous updates
  useLayoutEffect(() => {
    ref.current = fn;
  });

  return useCallback(
    (...args: Parameters): ReturnType => {
      return ref.current(...args);
    },
    [] // The dependency array is intentionally empty, ensuring stability
  ) as T;
}

function ParentComponent() {
  const [count, setCount] = useState(0);

  const handleClick = useEvent(() => {
    console.log('Clicked from Parent:', count);
    setCount(count + 1);
  });

  return (
    

Count: {count}

); } function ChildComponent({ onClick }) { console.log('ChildComponent rendered'); return ; } export default ParentComponent;

Apgaubdami handleClick su useEvent, užtikriname, kad ChildComponent gautų tą pačią funkcijos nuorodą per visus ParentComponent pervaizdavimus, net kai keičiasi count būsena. Tai apsaugo nuo nereikalingų ChildComponent pervaizdavimų.

useEvent naudojimo privalumai

useEvent panaudojimo atvejai

Alternatyvos ir svarstymai

Nors useEvent yra galingas įrankis, yra alternatyvių požiūrių ir svarstymų, kuriuos reikėtų turėti omenyje:

Tarptautinimo ir prieinamumo aspektai

Kuriant React programas pasaulinei auditorijai, labai svarbu atsižvelgti į tarptautinimą (i18n) ir prieinamumą (a11y). Pats useEvent tiesiogiai neveikia i18n ar a11y, tačiau jis gali netiesiogiai pagerinti komponentų, kurie tvarko lokalizuotą turinį ar prieinamumo funkcijas, našumą.

Pavyzdžiui, jei komponentas rodo lokalizuotą tekstą arba naudoja ARIA atributus, pagrįstus dabartine kalba, užtikrinimas, kad įvykių dorokliai tame komponente būtų stabilūs, gali užkirsti kelią nereikalingiems pervaizdavimams, kai keičiasi kalba.

Pavyzdys: useEvent su lokalizacija


import React, { useState, useContext, createContext, useCallback, useRef, useLayoutEffect } from 'react';

function useEvent any>(fn: T): T {
  const ref = useRef(fn);

  // UseLayoutEffect is crucial here for synchronous updates
  useLayoutEffect(() => {
    ref.current = fn;
  });

  return useCallback(
    (...args: Parameters): ReturnType => {
      return ref.current(...args);
    },
    [] // The dependency array is intentionally empty, ensuring stability
  ) as T;
}

const LanguageContext = createContext('en');

function LocalizedButton() {
  const language = useContext(LanguageContext);
  const [text, setText] = useState(getLocalizedText(language));

  const handleClick = useEvent(() => {
    console.log('Button clicked in', language);
    // Perform some action based on the language
  });

  function getLocalizedText(lang) {
      switch (lang) {
        case 'en':
          return 'Click me';
        case 'fr':
          return 'Cliquez ici';
        case 'es':
          return 'Haz clic aquí';
        default:
          return 'Click me';
      }
    }

    //Simulate language change
    React.useEffect(()=>{
        setTimeout(()=>{
            setText(getLocalizedText(language === 'en' ? 'fr' : 'en'))
        }, 2000)
    }, [language])

  return ;
}

function App() {
  const [language, setLanguage] = useState('en');

  const toggleLanguage = useCallback(() => {
    setLanguage(language === 'en' ? 'fr' : 'en');
  }, [language]);

  return (
    
      
); } export default App;

Šiame pavyzdyje LocalizedButton komponentas rodo tekstą, atsižvelgiant į dabartinę kalbą. Naudodami useEvent handleClick dorokliui, užtikriname, kad mygtukas nebūtų nereikalingai pervaizduojamas, kai keičiasi kalba, taip pagerindami našumą ir vartotojo patirtį.

Išvada

useEvent kabliukas yra vertingas įrankis React programuotojams, siekiantiems optimizuoti našumą ir supaprastinti komponentų logiką. Suteikdamas stabilias įvykių doroklių nuorodas, jis apsaugo nuo nereikalingų pervaizdavimų, pagerina kodo skaitomumą ir didina bendrą React programų efektyvumą. Nors tai nėra įtaisytasis React kabliukas, jo paprastas įgyvendinimas ir reikšmingi privalumai daro jį vertingu priedu bet kurio React programuotojo įrankių rinkinyje.

Suprasdami useEvent principus ir jo panaudojimo atvejus, programuotojai gali kurti našesnes, lengviau prižiūrimas ir labiau mastelį plečiančias React programas, skirtas pasaulinei auditorijai. Nepamirškite visada matuoti našumą ir atsižvelgti į konkrečius savo programos poreikius prieš taikydami optimizavimo technikas.