Lietuvių

Įvaldykite React Context efektyviam būsenos valdymui savo programose. Sužinokite, kada naudoti Context, kaip jį efektyviai įdiegti ir išvengti dažniausių klaidų.

React Context: Išsamus vadovas

React Context yra galinga funkcija, leidžianti dalytis duomenimis tarp komponentų, aiškiai neperduodant rekvizitų per kiekvieną komponentų medžio lygį. Tai suteikia galimybę padaryti tam tikras reikšmes prieinamas visiems komponentams konkrečiame po medyje. Šis vadovas nagrinėja, kada ir kaip efektyviai naudoti React Context, kartu su geriausia praktika ir bendromis klaidomis, kurių reikia vengti.

Problemos supratimas: Rekvizitų gręžimas

Sudėtingose React programose galite susidurti su „rekvizitų gręžimo“ problema. Tai atsitinka, kai reikia perduoti duomenis iš tėvinio komponento giliai į įdėtąjį vaiko komponentą. Norėdami tai padaryti, turite perduoti duomenis per kiekvieną tarpinį komponentą, net jei tiems komponentams nereikia pačių duomenų. Tai gali sukelti:

Apsvarstykite šį supaprastintą pavyzdį:


function App() {
  const user = { name: 'Alice', theme: 'dark' };
  return (
    <Layout user={user} />
  );
}

function Layout({ user }) {
  return (
    <Header user={user} />
  );
}

function Header({ user }) {
  return (
    <Navigation user={user} />
  );
}

function Navigation({ user }) {
  return (
    <Profile user={user} />
  );
}

function Profile({ user }) {
  return (
    <p>Sveiki, {user.name}!
Theme: {user.theme}</p>
  );
}

Šiame pavyzdyje objektas user perduodamas per kelis komponentus, nors tik Profile komponentas iš tikrųjų jį naudoja. Tai klasikinis rekvizitų gręžimo atvejis.

React Context įvedimas

React Context suteikia galimybę išvengti rekvizitų gręžimo, padarydamas duomenis prieinamus bet kuriam komponentui po medyje, aiškiai neperduodant jų per rekvizitus. Jį sudaro trys pagrindinės dalys:

Kada naudoti React Context

React Context ypač naudingas dalijantis duomenimis, kurie laikomi „globaliais“ React komponentų medžiui. Tai gali būti:

Svarbūs svarstymai:

Kaip naudoti React Context: praktinis pavyzdys

Peržiūrėkime rekvizitų gręžimo pavyzdį ir išspręskime jį naudodami React Context.

1. Sukurkite kontekstą

Pirmiausia sukurkite kontekstą naudodami React.createContext(). Šis kontekstas saugos vartotojo duomenis.


// UserContext.js
import React from 'react';

const UserContext = React.createContext(null); // Numatytąją reikšmę galima nustatyti į null arba pradinį vartotojo objektą

export default UserContext;

2. Sukurkite tiekėją

Toliau apvyniokite savo programos šaknį (arba atitinkamą po medį) su UserContext.Provider. Perduokite objektą user kaip value rekvizitą tiekėjui.


// App.js
import React from 'react';
import UserContext from './UserContext';
import Layout from './Layout';

function App() {
  const user = { name: 'Alice', theme: 'dark' };
  return (
    <UserContext.Provider value={user}>
      <Layout />
    </UserContext.Provider>
  );
}

export default App;

3. Naudokite kontekstą

Dabar komponentas Profile gali pasiekti duomenis user tiesiogiai iš konteksto naudodamas kabliuką useContext. Daugiau jokio rekvizitų gręžimo!


// Profile.js
import React, { useContext } from 'react';
import UserContext from './UserContext';

function Profile() {
  const user = useContext(UserContext);

  return (
    <p>Sveiki, {user.name}!
Theme: {user.theme}</p>
  );
}

export default Profile;

Tarpiniams komponentams (Layout, Header ir Navigation) nebereikia gauti rekvizito user.


// Layout.js, Header.js, Navigation.js
import React from 'react';

function Layout({ children }) {
  return (
    <div>
      <Header />
      <main>{children}</main>
    </div>
  );
}

function Header() {
  return (<Navigation />);
}

function Navigation() {
  return (<Profile />);
}

export default Layout;

Išplėstinis naudojimas ir geriausia praktika

1. Konteksto derinimas su useReducer

Norėdami geriau valdyti būseną, galite derinti React Context su kabliuku useReducer. Tai leidžia valdyti būsenos atnaujinimus nuspėjamesniu ir prižiūrimu būdu. Kontekstas pateikia būseną, o reduktorius apdoroja būsenos perėjimus, pagrįstus išsiųstais veiksmais.


// ThemeContext.js
import React, { createContext, useReducer } from 'react';

const ThemeContext = createContext();

const initialState = { theme: 'light' };

const themeReducer = (state, action) => {
  switch (action.type) {
    case 'TOGGLE_THEME':
      return { ...state, theme: state.theme === 'light' ? 'dark' : 'light' };
    default:
      return state;
  }
};

function ThemeProvider({ children }) {
  const [state, dispatch] = useReducer(themeReducer, initialState);

  return (
    <ThemeContext.Provider value={{ ...state, dispatch }}>
      {children}
    </ThemeContext.Provider>
  );
}

export { ThemeContext, ThemeProvider };




// ThemeToggle.js
import React, { useContext } from 'react';
import { ThemeContext } from './ThemeContext';

function ThemeToggle() {
  const { theme, dispatch } = useContext(ThemeContext);

  return (
    <button onClick={() => dispatch({ type: 'TOGGLE_THEME' })}>
      Perjungti temą (Dabartinė: {theme})
    </button>
  );
}

export default ThemeToggle;




// App.js
import React from 'react';
import { ThemeProvider } from './ThemeContext';
import ThemeToggle from './ThemeToggle';

function App() {
  return (
    <ThemeProvider>
      <div>
        <ThemeToggle />
      </div>
    </ThemeProvider>
  );
}

export default App;

2. Keli kontekstai

Galite naudoti kelis kontekstus savo programoje, jei norite valdyti skirtingus globalių duomenų tipus. Tai padeda išlaikyti atskirus rūpesčius ir pagerina kodo organizavimą. Pavyzdžiui, galite turėti UserContext vartotojo autentifikavimui ir ThemeContext programos temai valdyti.

3. Našumo optimizavimas

Kaip minėta anksčiau, konteksto pakeitimai gali sukelti pakartotinį atvaizdavimą naudojamuose komponentuose. Norėdami optimizuoti našumą, apsvarstykite šiuos dalykus:

4. Pasirinktinių kabliukų naudojimas konteksto prieigai

Sukurkite pasirinktinius kabliukus, kad įkapsuliuotumėte logiką, skirtą prieigai prie konteksto reikšmių ir jų atnaujinimui. Tai pagerina kodo skaitomumą ir prižiūrimumą. Pavyzdžiui:


// useTheme.js
import { useContext } from 'react';
import { ThemeContext } from './ThemeContext';

function useTheme() {
  const context = useContext(ThemeContext);
  if (!context) {
    throw new Error('useTheme must be used within a ThemeProvider');
  }
  return context;
}

export default useTheme;




// MyComponent.js
import React from 'react';
import useTheme from './useTheme';

function MyComponent() {
  const { theme, dispatch } = useTheme();

  return (
    <div>
      Dabartinė tema: {theme}
      <button onClick={() => dispatch({ type: 'TOGGLE_THEME' })}>
        Perjungti temą
      </button>
    </div>
  );
}

export default MyComponent;

Bendros klaidos, kurių reikia vengti

React Context alternatyvos

Nors React Context yra vertingas įrankis, jis ne visada yra geriausias sprendimas. Apsvarstykite šias alternatyvas:

Išvada

React Context yra galinga funkcija, skirta dalytis duomenimis tarp komponentų be rekvizitų gręžimo. Norint sukurti prižiūrimas ir našias React programas, būtina suprasti, kada ir kaip ją efektyviai naudoti. Laikydamiesi šiame vadove aprašytos geriausios praktikos ir vengdami dažniausių klaidų, galite panaudoti React Context, kad pagerintumėte savo kodą ir sukurtumėte geresnę vartotojo patirtį. Nepamirškite įvertinti savo konkrečių poreikių ir apsvarstyti alternatyvas prieš nuspręsdami, ar naudoti Context.

React Context: Išsamus vadovas | MLOG