Heim > Web-Frontend > js-Tutorial > createStore in Zustand&#s source code explained.

createStore in Zustand&#s source code explained.

王林
Freigeben: 2024-09-07 06:36:02
Original
529 Leute haben es durchsucht

In diesem Artikel werden wir verstehen, wie der Quellcode von createStore in Zustand geschrieben ist/funktioniert.

createStore in Zustand

createStore wird aus Vanilla.ts exportiert und Sie finden dies am Ende der Datei.

export const createStore = ((createState) =>
  createState ? createStoreImpl(createState) : createStoreImpl) as CreateStore
Nach dem Login kopieren

createStore ist eine Pfeilfunktion, die einen Parameter namens createState akzeptiert. Wenn createState vorhanden ist, wird createStoreImpl(createState) aufgerufen.

createStoreImpl

const createStoreImpl: CreateStoreImpl = (createState) => {
  type TState = ReturnType<typeof createState>
  type Listener = (state: TState, prevState: TState) => void
  let state: TState
  const listeners: Set<Listener> = new Set()

  const setState: StoreApi<TState>['setState'] = (partial, replace) => {
    // TODO: Remove type assertion once https://github.com/microsoft/TypeScript/issues/37663 is resolved
    // https://github.com/microsoft/TypeScript/issues/37663#issuecomment-759728342
    const nextState =
      typeof partial === 'function'
        ? (partial as (state: TState) => TState)(state)
        : partial
    if (!Object.is(nextState, state)) {
      const previousState = state
      state =
        (replace ?? (typeof nextState !== 'object' || nextState === null))
          ? (nextState as TState)
          : Object.assign({}, state, nextState)
      listeners.forEach((listener) => listener(state, previousState))
    }
  }

  const getState: StoreApi<TState>['getState'] = () => state

  const getInitialState: StoreApi<TState>['getInitialState'] = () =>
    initialState

  const subscribe: StoreApi<TState>['subscribe'] = (listener) => {
    listeners.add(listener)
    // Unsubscribe
    return () => listeners.delete(listener)
  }

  const api = { setState, getState, getInitialState, subscribe }
  const initialState = (state = createState(setState, getState, api))
  return api as any
}
Nach dem Login kopieren

In unseren vorherigen Artikeln habe ich darüber geschrieben, wie setState und subscribe funktionieren. Wir werden die verbleibenden Funktionen wie getState, getInitialState, createState behandeln.

getState

getState gibt einfach den Status zurück, der oben in dieser createStoreImpl-Funktion deklariert ist.

const getState: StoreApi<TState>['getState'] = () => state
Nach dem Login kopieren

getInitialState

getInitialState gibt den InitialState zurück.

const getInitialState: StoreApi<TState>['getInitialState'] = () =>
    initialState
Nach dem Login kopieren

createState

createState wird verwendet, um die Statusvariable zu initialisieren.

const createStoreImpl: CreateStoreImpl = (createState) => {
Nach dem Login kopieren

createState ist ein Parameter in createStoreImpl. Lassen Sie uns einige Experimente anhand des Demobeispiels durchführen, das im Repo des Zustands bereitgestellt wird.

createStore in Zustand

Das ist im Grunde genau das, was Sie in „erstellen“ übergeben

// Create the store using Zustand
const useStore = create((set) => ({
  count: 1,
  inc: () => set((state) => ({ count: state.count + 1 })),
}));
Nach dem Login kopieren

Die Zustandsinitialisierung erfolgt in Vanilla.ts bei L93, obwohl „create“ ursprünglich aus React exportiert wurde, ruft „react.ts“ intern „createStore“ in Vanilla.ts auf.

Wie initialisiert der Aufruf von createState den Status?

  const initialState = (state = createState(setState, getState, api))
Nach dem Login kopieren

Der Trick besteht darin, die Pfeilfunktion createState aufzurufen. Aus dem obigen Codeausschnitt können Sie ersehen, dass createState mit setState, getState, api

aufgerufen wird

Lassen Sie uns mit diesen Informationen einige Experimente durchführen. Übergeben wir eine benutzerdefinierte Funktion namens test als Parameter ohne die Originalparameter.

createStore in Zustand

Das obige Bild zeigt die benutzerdefinierte Testfunktion, die ich hinzugefügt habe, um zu demonstrieren, wie die Parameter an die Funktion „createState“ übergeben werden.

Sehen wir uns nun diese interne Testfunktion in Aktion an. Damit wir auf diese Testfunktion zugreifen können, zeigt das folgende Beispiel, wie createStore mit diesem neu hinzugefügten Testparameter initialisiert werden kann.

// Create the store using Zustand
const useStore = create((set, get, api, test) => ({
  count: 1,
  inc: () => set((state) => ({ count: state.count + 1 })),
  test: () => test() 
}));
Nach dem Login kopieren

Da wir test in Vanilla.mjs wie unten gezeigt verfügbar gemacht haben, haben Sie Zugriff auf diese Funktion, wenn Sie die Erstellungsfunktion initialisieren

createStore in Zustand

Diese Testfunktion löse ich aus, wenn auf die Schaltfläche im Demo-Beispiel geklickt wird.

createStore in Zustand

Dies wiederum ruft die Testfunktion auf.

Dies ist die Verwendung einiger erweiterter JavaScript-Pfeilfunktionen. Außerdem haben wir gerade eine benutzerdefinierte Testfunktion hinzugefügt und in der Demo-App verwendet. Das ist cool.

Über uns:

Bei Think Throo haben wir die Mission, die Best Practices zu vermitteln, die von Open-Source-Projekten inspiriert sind.

Verzehnfachen Sie Ihre Programmierkenntnisse, indem Sie fortgeschrittene Architekturkonzepte in Next.js/React üben, die Best Practices erlernen und Projekte in Produktionsqualität erstellen.

Wir sind Open Source  –  https://github.com/thinkthroo/thinkthroo (Geben Sie uns einen Stern!)

Möchten Sie maßgeschneiderte Websysteme für Ihr Unternehmen erstellen? Kontaktieren Sie uns unter hello@thinkthroo.com

Über den Autor:

Hey, ich bin Ram. Ich bin ein leidenschaftlicher Softwareentwickler/OSS-Tüftler.

Schauen Sie sich meine Website an: https://www.ramunarasinga.com/

Referenzen:

  1. https://github.com/pmndrs/zustand/blob/main/src/vanilla.ts#L97

Das obige ist der detaillierte Inhalt voncreateStore in Zustand&#s source code explained.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage