„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Gemeinsamer Status zwischen unabhängigen React-Komponenten

Gemeinsamer Status zwischen unabhängigen React-Komponenten

Veröffentlicht am 07.08.2024
Durchsuche:888

Möchten Sie zeigen, wie Sie serialisierbare Daten zwischen React-Komponenten teilen können, z. B. Client-Komponenten in NextJS.

Wir haben wenige unabhängige Komponenten:

Example app UI

Lassen Sie uns ein Objekt erstellen, das den Anfangszustand enthält

export const state: { count: number } = { count: 0 };

Wir können Daten in einer Karte oder einer WeakMap speichern, der Status ist ein Schlüssel für den Zugriff darauf. Außerdem wird ein Abonnenten-Array benötigt.

const stateMap = new WeakMap();
const subscribers: (() => void)[] = [];

Jetzt schreiben wir einen Hook, um Datenänderungen zu abonnieren.

export function useCommonState(stateObj: T) {
  // more efficient than `useEffect` since we don't have any deps
  React.useInsertionEffect(() => {
    const cb = () => {
      const val = stateMap.get(stateObj);
      _setState(val!);
    };
    // subscribe to events
    subscribers.push(cb);

    return () => {
      subscribers.slice(subscribers.indexOf(cb), 1);
    };
  }, []);
}

Jetzt fügen wir Logik hinzu, die sich auf das Abrufen und Festlegen des Status bezieht

  // all instances of hook will point to same object reference
  const [state, _setState] = React.useState(() => {
    const val = stateMap.get(stateObj) as T;
    if (!val) {
      stateMap.set(stateObj, stateObj)
      return stateObj
    }
    return val
  });

  const setState = React.useCallback((newVal: object) => {
    // update value
    stateMap.set(stateObj, newVal);
    // notify all other hook instances
    subscribers.forEach((sub) => sub());
  }, []);

  return { state, setState };

Und jetzt kann es in 3 Komponenten verwendet werden wie

import { state as myState } from './state';
//...

const { state, setState } = useCommonState(myState);


// ...
Component A
Count: {state.count}

Final app

Sie können hier sehen, wie es funktioniert: https://stackblitz.com/~/github.com/asmyshlyaev177/react-common-state-example
Oder hier https://codesandbox.io/p/github/asmyshlyaev177/react-common-state-example/main
Oder in Github https://github.com/asmyshlyaev177/react-common-state-example

Schauen Sie sich meine Bibliothek für NextJS an, die auf diesem Prinzip basiert: https://github.com/asmyshlyaev177/state-in-url

Tnx zum Lesen.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/asmyshlyaev177/sharing-state-between-unlated-react-components-4aia?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3