Eesti

Avastage Reacti useEvent hook, võimas tööriist stabiilsete sündmuste käsitlejate viidete loomiseks dünaamilistes Reacti rakendustes, parandades jõudlust ja vältides tarbetuid ümberrenderdusi.

React useEvent: Stabiilsete sündmuste käsitlejate viidete saavutamine

Reacti arendajad seisavad sageli silmitsi väljakutsetega sündmuste käsitlejatega tegelemisel, eriti stsenaariumides, mis hõlmavad dünaamilisi komponente ja sulgendeid. useEvent hook, suhteliselt uus lisand Reacti ökosüsteemi, pakub nendele probleemidele elegantse lahenduse, võimaldades arendajatel luua stabiilseid sündmuste käsitlejate viiteid, mis ei käivita tarbetuid ümberrenderdusi.

Probleemi mõistmine: Sündmuste käsitlejate ebastabiilsus

Reactis renderdatakse komponente uuesti, kui nende propsid või olek muutuvad. Kui sündmuse käsitleja funktsioon edastatakse propina, luuakse vanemkomponendi igal renderdamisel sageli uus funktsiooni eksemplar. See uus funktsiooni eksemplar, isegi kui sellel on sama loogika, loetakse Reacti poolt erinevaks, mis viib selle saava alamkomponendi uuesti renderdamiseni.

Vaatleme seda lihtsat näidet:


import React, { useState } from 'react';

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

  const handleClick = () => {
    console.log('Klõpsati vanemkomponendist:', count);
    setCount(count + 1);
  };

  return (
    

Loendur: {count}

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

Selles näites luuakse handleClick uuesti igal ParentComponent'i renderdamisel. Isegi kui ChildComponent võiks olla optimeeritud (nt kasutades React.memo), renderdatakse see siiski uuesti, kuna onClick prop on muutunud. See võib põhjustada jõudlusprobleeme, eriti keerukates rakendustes.

Tutvustame useEvent'i: Lahendus

useEvent hook lahendab selle probleemi, pakkudes sündmuse käsitleja funktsioonile stabiilse viite. See eraldab sündmuse käsitleja tõhusalt oma vanemkomponendi ümberrenderdustsüklitest.

Kuigi useEvent ei ole sisseehitatud Reacti hook (seisuga React 18), saab seda hõlpsasti implementeerida kohandatud hookina või pakutakse seda mõnes raamistikus ja teegis nende utiliitide komplekti osana. Siin on levinud implementatsioon:


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

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

  // useLayoutEffect on siin sünkroonsete uuenduste jaoks ülioluline
  useLayoutEffect(() => {
    ref.current = fn;
  });

  return useCallback(
    (...args: Parameters): ReturnType => {
      return ref.current(...args);
    },
    [] // Sõltuvuste massiiv on taotluslikult tühi, tagades stabiilsuse
  ) as T;
}

export default useEvent;

Selgitus:

useEvent'i kasutamine praktikas

Nüüd refaktoreerime eelmise näite, kasutades useEvent'i:


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

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

  // useLayoutEffect on siin sünkroonsete uuenduste jaoks ülioluline
  useLayoutEffect(() => {
    ref.current = fn;
  });

  return useCallback(
    (...args: Parameters): ReturnType => {
      return ref.current(...args);
    },
    [] // Sõltuvuste massiiv on taotluslikult tühi, tagades stabiilsuse
  ) as T;
}

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

  const handleClick = useEvent(() => {
    console.log('Klõpsati vanemkomponendist:', count);
    setCount(count + 1);
  });

  return (
    

Loendur: {count}

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

Mähkides handleClick'i useEvent'iga, tagame, et ChildComponent saab sama funktsiooni viite üle ParentComponent'i renderduste, isegi kui count'i olek muutub. See hoiab ära ChildComponent'i tarbetud ümberrenderdused.

useEvent'i kasutamise eelised

useEvent'i kasutusjuhud

Alternatiivid ja kaalutlused

Kuigi useEvent on võimas tööriist, on olemas alternatiivseid lähenemisviise ja kaalutlusi, mida meeles pidada:

Rahvusvahelistumise ja ligipääsetavuse kaalutlused

Reacti rakenduste arendamisel globaalsele publikule on oluline arvestada rahvusvahelistumise (i18n) ja ligipääsetavusega (a11y). useEvent ise ei mõjuta otseselt i18n-i ega a11y-d, kuid see võib kaudselt parandada nende komponentide jõudlust, mis käsitlevad lokaliseeritud sisu või ligipääsetavuse funktsioone.

Näiteks, kui komponent kuvab lokaliseeritud teksti või kasutab ARIA atribuute vastavalt praegusele keelele, võib selle komponendi sees olevate sündmuste käsitlejate stabiilsuse tagamine takistada tarbetuid ümberrenderdusi keele muutumisel.

Näide: useEvent lokaliseerimisega


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

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

  // useLayoutEffect on siin sünkroonsete uuenduste jaoks ülioluline
  useLayoutEffect(() => {
    ref.current = fn;
  });

  return useCallback(
    (...args: Parameters): ReturnType => {
      return ref.current(...args);
    },
    [] // Sõltuvuste massiiv on taotluslikult tühi, tagades stabiilsuse
  ) as T;
}

const LanguageContext = createContext('en');

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

  const handleClick = useEvent(() => {
    console.log('Nupule klõpsati keeles', language);
    // Soorita mingi tegevus vastavalt keelele
  });

  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';
      }
    }

    //Simuleeri keelevahetust
    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;

Selles näites kuvab LocalizedButton'i komponent teksti vastavalt praegusele keelele. Kasutades useEvent'i handleClick'i käsitleja jaoks, tagame, et nupp ei renderdu tarbetult uuesti keele muutumisel, parandades jõudlust ja kasutajakogemust.

Kokkuvõte

useEvent hook on väärtuslik tööriist Reacti arendajatele, kes soovivad optimeerida jõudlust ja lihtsustada komponentide loogikat. Pakkudes stabiilseid sündmuste käsitlejate viiteid, hoiab see ära tarbetud ümberrenderdused, parandab koodi loetavust ja suurendab Reacti rakenduste üldist tõhusust. Kuigi see pole sisseehitatud Reacti hook, muudavad selle lihtne implementatsioon ja olulised eelised selle väärtuslikuks lisandiks iga Reacti arendaja tööriistakasti.

Mõistes useEvent'i põhimõtteid ja selle kasutusjuhte, saavad arendajad ehitada jõudluslikumaid, hooldatavamaid ja skaleeritavamaid Reacti rakendusi globaalsele publikule. Ärge unustage alati mõõta jõudlust ja arvestada oma rakenduse spetsiifiliste vajadustega enne optimeerimistehnikate rakendamist.