Lietuvių

Išsamus React Context ir Props palyginimas būsenos valdymui, apimantis našumą, sudėtingumą ir geriausias praktikas globalių programų kūrimui.

React Context ir Props: teisingos būsenos paskirstymo strategijos pasirinkimas

Nuolat besikeičiančiame front-end kūrimo pasaulyje, teisingos būsenos valdymo strategijos pasirinkimas yra lemiamas kuriant palaikomas, mastelį atitinkančias ir našias React programas. Du pagrindiniai būsenos paskirstymo mechanizmai yra Props ir React Context API. Šiame straipsnyje pateikiamas išsamus jų palyginimas, analizuojant jų stipriąsias ir silpnąsias puses bei praktinius pritaikymus, siekiant padėti jums priimti pagrįstus sprendimus savo projektuose.

Props supratimas: komponentų komunikacijos pagrindas

Props (sutrumpinimas iš angl. properties – savybės) yra pagrindinis būdas perduoti duomenis iš tėvinio komponento į vaikinį React programose. Tai yra vienakryptis duomenų srautas, reiškiantis, kad duomenys keliauja žemyn komponentų medžiu. Props gali būti bet kokio JavaScript duomenų tipo, įskaitant eilutes, skaičius, logines reikšmes, masyvus, objektus ir net funkcijas.

Props privalumai:

Props trūkumai: Prop Drilling

Pagrindinis trūkumas, pasikliaujant tik props, yra problema, žinoma kaip „prop drilling“. Tai atsitinka, kai giliai įdėtam komponentui reikia prieigos prie duomenų iš tolimo protėvinio komponento. Duomenys turi būti perduodami per tarpinius komponentus, net jei tie komponentai tiesiogiai tų duomenų nenaudoja. Tai gali sukelti:

Prop Drilling pavyzdys:

Įsivaizduokite el. prekybos programą, kurioje vartotojo autentifikavimo raktas yra reikalingas giliai įdėtame komponente, pavyzdžiui, produkto detalių skiltyje. Jums gali tekti perduoti raktą per komponentus kaip <App>, <Layout>, <ProductPage> ir galiausiai į <ProductDetails>, net jei tarpiniai komponentai patys to rakto nenaudoja.


function App() {
  const authToken = "some-auth-token";
  return <Layout authToken={authToken} />;
}

function Layout({ authToken }) {
  return <ProductPage authToken={authToken} />;
}

function ProductPage({ authToken }) {
  return <ProductDetails authToken={authToken} />;
}

function ProductDetails({ authToken }) {
  // Use the authToken here
  return <div>Product Details</div>;
}

Pristatome React Context: būsenos dalijimasis tarp komponentų

React Context API suteikia būdą dalintis reikšmėmis, tokiomis kaip būsena, funkcijos ar net stiliaus informacija, su React komponentų medžiu, nereikalaujant rankiniu būdu perduoti props kiekviename lygyje. Jis sukurtas spręsti „prop drilling“ problemą, palengvinant globalių ar visos programos duomenų valdymą ir prieigą prie jų.

Kaip veikia React Context:

  1. Sukurkite kontekstą: Naudokite React.createContext(), kad sukurtumėte naują konteksto objektą.
  2. Tiekėjas (Provider): Apgaubkite savo komponentų medžio dalį su <Context.Provider>. Tai leidžia komponentams tame submedyje pasiekti konteksto reikšmę. Tiekėjo value prop nustato, kokie duomenys yra prieinami vartotojams.
  3. Vartotojas (Consumer): Naudokite <Context.Consumer> arba useContext hook, kad pasiektumėte konteksto reikšmę komponente.

React Context privalumai:

React Context trūkumai:

React Context naudojimo pavyzdys:

Grįžkime prie autentifikavimo rakto pavyzdžio. Naudodami context, galime pateikti raktą aukščiausiame programos lygmenyje ir pasiekti jį tiesiogiai <ProductDetails> komponente, neperduodant jo per tarpinius komponentus.


import React, { createContext, useContext } from 'react';

// 1. Create a Context
const AuthContext = createContext(null);

function App() {
  const authToken = "some-auth-token";
  return (
    // 2. Provide the context value
    <AuthContext.Provider value={authToken}>
      <Layout />
    </AuthContext.Provider>
  );
}

function Layout({ children }) {
  return <ProductPage />;
}

function ProductPage({ children }) {
  return <ProductDetails />;
}

function ProductDetails() {
  // 3. Consume the context value
  const authToken = useContext(AuthContext);
  // Use the authToken here
  return <div>Product Details - Token: {authToken}</div>;
}

Context ir Props: detalus palyginimas

Štai lentelė, apibendrinanti pagrindinius Context ir Props skirtumus:

Savybė Props Context
Duomenų srautas Vienakryptis (iš tėvinio į vaikinį) Globalus (pasiekiamas visiems komponentams Provider viduje)
Prop Drilling Linkęs į prop drilling Pašalina prop drilling
Komponentų pakartotinis panaudojamumas Aukštas Potencialiai žemesnis (dėl priklausomybės nuo konteksto)
Našumas Paprastai geresnis (persikrauna tik komponentai, gaunantys atnaujintus props) Potencialiai prastesnis (persikrauna visi vartotojai, kai keičiasi konteksto reikšmė)
Sudėtingumas Žemesnis Aukštesnis (reikalingas Context API supratimas)
Testuojamumas Lengvesnis (galima tiesiogiai perduoti props testuose) Sudėtingesnis (reikia imituoti (mock) kontekstą)

Teisingos strategijos pasirinkimas: praktiniai aspektai

Sprendimas, ar naudoti Context, ar Props, priklauso nuo konkrečių jūsų programos poreikių. Štai keletas gairių, padėsiančių jums pasirinkti teisingą strategiją:

Naudokite Props, kai:

Naudokite Context, kai:

Geriausios React Context naudojimo praktikos:

Globalūs aspektai būsenos valdymui

Kuriant React programas globaliai auditorijai, būtina atsižvelgti į tai, kaip būsenos valdymas sąveikauja su internacionalizacija (i18n) ir lokalizacija (l10n). Štai keletas konkrečių dalykų, kuriuos reikėtų turėti omenyje:

Kalbos nustatymų valdymo su Context pavyzdys:


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

const LanguageContext = createContext({
  locale: 'en',
  setLocale: () => {},
});

function LanguageProvider({ children }) {
  const [locale, setLocale] = useState('en');

  const value = {
    locale,
    setLocale,
  };

  return (
    <LanguageContext.Provider value={value}>
      {children}
    </LanguageContext.Provider>
  );
}

function useLanguage() {
  return useContext(LanguageContext);
}

function MyComponent() {
  const { locale, setLocale } = useLanguage();

  return (
    <div>
      <p>Current Locale: {locale}</p>
      <button onClick={() => setLocale('en')}>English</button>
      <button onClick={() => setLocale('fr')}>French</button>
    </div>
  );
}

function App() {
  return (
    <LanguageProvider>
      <MyComponent />
    </LanguageProvider>
  );
}

Pažangios būsenos valdymo bibliotekos: daugiau nei Context

Nors React Context yra vertingas įrankis programos būsenai valdyti, sudėtingesnėms programoms dažnai naudinga naudoti specializuotas būsenos valdymo bibliotekas. Šios bibliotekos siūlo pažangesnes funkcijas, tokias kaip:

Keletas populiarių React būsenos valdymo bibliotekų:

Tinkamos būsenos valdymo bibliotekos pasirinkimas priklauso nuo konkrečių jūsų programos poreikių. Priimdami sprendimą, atsižvelkite į savo būsenos sudėtingumą, komandos dydį ir našumo reikalavimus.

Išvada: paprastumo ir mastelio derinimas

React Context ir Props yra abu esminiai įrankiai būsenai valdyti React programose. Props suteikia aiškų ir nedviprasmišką duomenų srautą, o Context pašalina „prop drilling“ ir supaprastina globalios būsenos valdymą. Suprasdami kiekvieno požiūrio stipriąsias ir silpnąsias puses bei laikydamiesi geriausių praktikų, galite pasirinkti tinkamą strategiją savo projektams ir kurti palaikomas, mastelį atitinkančias ir našias React programas globaliai auditorijai. Prisiminkite atsižvelgti į poveikį internacionalizacijai ir lokalizacijai priimdami būsenos valdymo sprendimus ir nedvejokite išbandyti pažangias būsenos valdymo bibliotekas, kai jūsų programa taps sudėtingesnė.