Möchten Sie zeigen, wie Sie serialisierbare Daten zwischen React-Komponenten teilen können, z. B. Client-Komponenten in NextJS.
Wir haben einige unabhängige Komponenten:
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<object, object>(); const subscribers: (() => void)[] = [];
Jetzt schreiben wir einen Hook, um Datenänderungen zu abonnieren.
export function useCommonState<T extends object>(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<typeof stateObj>(() => { 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 wie
verwendet werden
import { state as myState } from './state'; //... const { state, setState } = useCommonState(myState); <button onClick={() => setState({ count: state.count + 1 })} className="p-2 border" > + </button> // ... Component A<div>Count: {state.count}</div>
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.
Das obige ist der detaillierte Inhalt vonGemeinsamer Status zwischen unabhängigen React-Komponenten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!