Latviešu

Izpētiet React useEvent āķi – rīku stabilu notikumu apstrādātāju izveidei, lai uzlabotu veiktspēju un novērstu nevajadzīgu pārrenderēšanu dinamiskās React aplikācijās.

React useEvent: Stabilu notikumu apstrādātāju atsauču sasniegšana

React izstrādātāji bieži saskaras ar izaicinājumiem, strādājot ar notikumu apstrādātājiem, īpaši scenārijos, kas ietver dinamiskus komponentus un noslēgumus (closures). useEvent āķis, salīdzinoši nesens papildinājums React ekosistēmai, sniedz elegantu risinājumu šīm problēmām, ļaujot izstrādātājiem izveidot stabilas notikumu apstrādātāju atsauces, kas neizraisa nevajadzīgu pārrenderēšanu.

Problēmas izpratne: Notikumu apstrādātāju nestabilitāte

React komponenti tiek pārrenderēti, kad mainās to props vai stāvoklis (state). Kad notikuma apstrādātāja funkcija tiek nodota kā props, katrā vecākkomponenta renderēšanas reizē bieži tiek izveidota jauna funkcijas instance. Šo jauno funkcijas instanci, pat ja tai ir tāda pati loģika, React uzskata par atšķirīgu, kas noved pie bērnkomponenta, kurš to saņem, pārrenderēšanas.

Apsveriet šo vienkāršo piemēru:


import React, { useState } from 'react';

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

  const handleClick = () => {
    console.log('Noklikšķināts no Parent:', count);
    setCount(count + 1);
  };

  return (
    

Skaits: {count}

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

Šajā piemērā handleClick tiek atkārtoti izveidots katrā ParentComponent renderēšanas reizē. Pat ja ChildComponent varētu būt optimizēts (piemēram, izmantojot React.memo), tas joprojām tiks pārrenderēts, jo onClick prop ir mainījies. Tas var radīt veiktspējas problēmas, īpaši sarežģītās aplikācijās.

Iepazīstinām ar useEvent: Risinājums

useEvent āķis atrisina šo problēmu, nodrošinot stabilu atsauci uz notikuma apstrādātāja funkciju. Tas efektīvi atdala notikuma apstrādātāju no tā vecākkomponenta pārrenderēšanas cikla.

Lai gan useEvent nav iebūvēts React āķis (uz React 18 versiju), to var viegli ieviest kā pielāgotu āķi, vai dažos ietvaros un bibliotēkās tas tiek nodrošināts kā daļa no to utilītu kopas. Šeit ir izplatīta implementācija:


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

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

  // useLayoutEffect šeit ir būtisks sinhroniem atjauninājumiem
  useLayoutEffect(() => {
    ref.current = fn;
  });

  return useCallback(
    (...args: Parameters): ReturnType => {
      return ref.current(...args);
    },
    [] // Atkarību masīvs ir apzināti tukšs, nodrošinot stabilitāti
  ) as T;
}

export default useEvent;

Paskaidrojums:

useEvent izmantošana praksē

Tagad pārveidosim iepriekšējo piemēru, izmantojot useEvent:


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

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

  // useLayoutEffect šeit ir būtisks sinhroniem atjauninājumiem
  useLayoutEffect(() => {
    ref.current = fn;
  });

  return useCallback(
    (...args: Parameters): ReturnType => {
      return ref.current(...args);
    },
    [] // Atkarību masīvs ir apzināti tukšs, nodrošinot stabilitāti
  ) as T;
}

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

  const handleClick = useEvent(() => {
    console.log('Noklikšķināts no Parent:', count);
    setCount(count + 1);
  });

  return (
    

Skaits: {count}

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

Ietverot handleClick ar useEvent, mēs nodrošinām, ka ChildComponent saņem to pašu funkcijas atsauci starp ParentComponent renderēšanas reizēm, pat ja mainās count stāvoklis. Tas novērš nevajadzīgu ChildComponent pārrenderēšanu.

useEvent izmantošanas priekšrocības

useEvent pielietojuma gadījumi

Alternatīvas un apsvērumi

Lai gan useEvent ir spēcīgs rīks, ir arī alternatīvas pieejas un apsvērumi, kas jāpatur prātā:

Internacionalizācijas un pieejamības apsvērumi

Izstrādājot React aplikācijas globālai auditorijai, ir būtiski ņemt vērā internacionalizāciju (i18n) un pieejamību (a11y). Pats useEvent tieši neietekmē i18n vai a11y, bet tas var netieši uzlabot to komponentu veiktspēju, kas apstrādā lokalizētu saturu vai pieejamības funkcijas.

Piemēram, ja komponents parāda lokalizētu tekstu vai izmanto ARIA atribūtus, pamatojoties uz pašreizējo valodu, nodrošinot, ka notikumu apstrādātāji šajā komponentā ir stabili, var novērst nevajadzīgu pārrenderēšanu, mainoties valodai.

Piemērs: useEvent ar lokalizāciju


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

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

  // useLayoutEffect šeit ir būtisks sinhroniem atjauninājumiem
  useLayoutEffect(() => {
    ref.current = fn;
  });

  return useCallback(
    (...args: Parameters): ReturnType => {
      return ref.current(...args);
    },
    [] // Atkarību masīvs ir apzināti tukšs, nodrošinot stabilitāti
  ) as T;
}

const LanguageContext = createContext('en');

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

  const handleClick = useEvent(() => {
    console.log('Poga nospiesta', language, 'valodā');
    // Veic kādu darbību, pamatojoties uz valodu
  });

  function getLocalizedText(lang) {
      switch (lang) {
        case 'en':
          return 'Click me';
        case 'lv':
          return 'Noklikšķini šeit';
        case 'es':
          return 'Haz clic aquí';
        default:
          return 'Click me';
      }
    }

    // Simulē valodas maiņu
    React.useEffect(()=>{
        setTimeout(()=>{
            setText(getLocalizedText(language === 'en' ? 'lv' : 'en'))
        }, 2000)
    }, [language])

  return ;
}

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

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

  return (
    
      
); } export default App;

Šajā piemērā komponents LocalizedButton parāda tekstu, pamatojoties uz pašreizējo valodu. Izmantojot useEvent priekš handleClick apstrādātāja, mēs nodrošinām, ka poga netiek nevajadzīgi pārrenderēta, mainoties valodai, tādējādi uzlabojot veiktspēju un lietotāja pieredzi.

Noslēgums

useEvent āķis ir vērtīgs rīks React izstrādātājiem, kuri vēlas optimizēt veiktspēju un vienkāršot komponentu loģiku. Nodrošinot stabilas notikumu apstrādātāju atsauces, tas novērš nevajadzīgu pārrenderēšanu, uzlabo koda lasāmību un paaugstina React aplikāciju kopējo efektivitāti. Lai gan tas nav iebūvēts React āķis, tā vienkāršā implementācija un būtiskās priekšrocības padara to par vērtīgu papildinājumu jebkura React izstrādātāja rīku komplektam.

Izprotot useEvent pamatprincipus un tā pielietojuma gadījumus, izstrādātāji var veidot veiktspējīgākas, uzturamākas un mērogojamākas React aplikācijas globālai auditorijai. Atcerieties vienmēr izmērīt veiktspēju un apsvērt savas aplikācijas specifiskās vajadzības pirms optimizācijas tehniku pielietošanas.