"local" global state
State manager naudojimas
Situacija:
- Komponentų/hook'ų dekompozicijos metu keliams komponentams reikia
state. Bet jis nereikalingas aukštesniam (išoriniams) kodui - Iš
Reactribotumo , mums reikia iškeltistateuž komponento ribų (pvz į parent), tam kad galetume tai realizuoti keliams komponentams.
Sprendimas:
- Mes turi sukurti lokalų
contexttiems komponentams. Tokiu budu jie gali panaudotistate, be jo iškėlimo į kitus komponentus.
Buvo:
graph TD; STATE-->APP; APP-->componentA; APP-->componentB;
Tapo:
graph TD; APP-->componentA; APP-->componentB; componentB-->STATE; STATE-->componentA;
Context pajungimas. Provider - kad butu galima pasiekti context
const trackModal = useTrackModal();konteksto sukūrimas<trackModalContext. Provider value={trackModal}>wrapas provideris
import { createContext } from "react"; import { useTrackModal } from "../hooks/use-track-modal"; type TrackModalContext = ReturnType<typeof useTrackModal>; export const trackModalContext = createContext<TrackModalContext | null>(null); export function TrackModalProvider({ children, }: { children: React. ReactNode; }) { const trackModal = useTrackModal(); return ( <trackModalContext.Provider value={trackModal}> {children} </trackModalContext.Provider> ); }
Context tipas
TrackModalContext | null>(null)null reikia dėl default reikšmės
import { createContext } from "react"; import { Track } from "../../App"; type TrackModalContext = { close: () => void; createClick: () => void; isOpenModal: boolean; selectedCell: number; selected Track: Track; trackClick: (track: Track) => void; }; export const trackModalContext = createContext<TrackModalContext | null>(null);
Context panaudojimas
export default function App() { return ( <TrackModalProvider> <AppContent /> </TrackModalProvider> ) }
Vienas komponentas (hook - modal valdymas)
const context = useContext(trackModalContext);pasinaudojamecontextif (!context) {jeigu kontektsto nėra.throw new Error.Fail fastmetodas, esant klaidai, kuo greičiau išeiti. nereikia kiekviena karta tikrinti ar context yra. Grazinamassnull
import { useContext } from "react"; import {trackModalContext } from "../components/track-modal-context"; export function useTracksModalOpen() { const context = useContext(trackModalContext); if (!context) { throw new Error( "useTracksModalOpen must be used within a TrackModalProvider" ); } return { createClick: context.createClick,| cellClick: context.cellClick, trackClick: context.trackClick, } }
Kitas komponentas (visa logika)
import { useContext } from "react"; import { useTrack Form } from "../hooks/use-track-form"; import {trackModalContext } from "./track-modal-context"; export function TrackModal() { const context = useContext(trackModalContext); if (!context) { throw new Error("useTracks Modal must be used within a TrackModalProvider"); } const { cellclick, close, createClick, isOpenModal, selectedCell, selectedTrack, trackClick, } context; ...
local context, nes iš išorės neturi prie jo prieigos
Privalumai:
- patikimumo padidinimas
- kodo aiškumo padidinimas
- smulkmenų užslėpimas padidina perpanaudojimą. Išorinis kodas neturi prieigos prie duomenų
Trūkumai
- nepatogus konteksto naudojimas
- nepatogus provider
Perpanaudojimo pavizdys
export default function App() { return ( <TrackModalProvider> <AppContent /> </TrackModalProvider> <TrackModalProvider> <AppContent /> </TrackModalProvider> ) }
Galima apjungti:
- kontekstas duoda didesni perpanaudojimas
- state manager patogumas