Interpretation und Verwendung verschiedener React-State-Manager

Interpretation und Verwendung verschiedener React-State-Manager

Zunächst müssen wir wissen, was ein Zustandsmanager ist und was er tut.

Wenn wir dieselben Eigenschaften auf mehreren Seiten verwenden, können wir den Status-Manager verwenden, um diese Status in einer separaten externen Datei zu speichern, sodass wir sie jederzeit problemlos abrufen können, wenn wir sie verwenden möchten.

React unterscheidet sich etwas von Vue. React verfügt nicht über eine eigene exklusive Methode zur Statusverwaltung. Es verwendet tatsächlich einen js-bezogenen Statusmanager. Wir müssen bedenken, dass Ansichten Statusänderungen verursachen können und Statusänderungen dazu führen können, dass Ansichten erneut gerendert werden.

Nachdem wir so lange geredet haben: Wie verwenden wir den State Manager in React?

Redux glänzt

Die Vorgängertechnologie von Redux ist Flux, welches Flux sehr ähnlich, aber nicht exakt dasselbe ist. Beide legen fest, dass die Aktualisierungslogik des Modells auf einer Ebene konzentriert sein sollte (Store in Flux, Reducer in Redux). Redux verfügt jedoch nicht über das Konzept eines Dispatchers, sondern verlässt sich auf reine Funktionen als Ereignishandler. Außerdem ändert Redux Ihre Daten nicht, sondern gibt zum Aktualisieren des Status ein neues Objekt zurück.

Schauen wir uns zunächst einige Eigenschaften von Redux an.

1. speichern:

Ein Ort zum Speichern von Daten/Zuständen, den man sich als Container vorstellen kann. Denken Sie daran, dass es in der gesamten Anwendung nur einen Store geben kann.

importiere { createStore } von 'redux'
Konstantenspeicher = erstelleSpeicher(fn)

2. Staat:

Sie können sich den Status als Instanzobjekt des Stores vorstellen. Er enthält alle Status im Statusmanager und ist eine Sammlung aller Daten/Status zu einem bestimmten Zeitpunkt.

const state = store.getState()

3. Aktion

Eine der wichtigsten Eigenschaften in Redux. Die einzige Möglichkeit, den Status des Stores zu ändern, besteht darin, eine Aktion zu übermitteln . Eine Aktion ist ein Objekt mit einem Typattribut, das normalerweise als Schlüsselwert der Übermittlung verwendet wird.

const Aktion = {
    Typ: 'ADD_TODO',
    payload: 'Learc Redux' //Die Nutzlast wird hier als Parameter übergeben, Sie können es leer lassen}

4. speichern.versand():

Die einzige Möglichkeit, eine Aktion zu übermitteln, besteht darin, sie auf diese Weise an den Statusmanager zu übermitteln. Unabhängig davon, welche anderen Tools zur Statusverwaltung später verwendet werden, läuft alles auf dies hinaus.

speichern.Versand({
    Typ: „ADD_TODO“
})

5. Reduzierstück:

Nach dem Empfang der Aktion muss der Speicher einen neuen Status zurückgeben, damit sich die Ansicht ändert. Der Berechnungsprozess dieses Status wird als Reduzierer bezeichnet.

Ein Reducer ist eine Funktion, die den aktuellen Status und die aktuelle Aktion akzeptiert und einen neuen Status zurückgibt.

const Reducer = (Zustand = {
  Anzahl: 10 //Setze den Anfangswert für die Eigenschaft im Status. Da der Statusmanager nach jeder Aktualisierung gelöscht wird, können wir den letzten gespeicherten Wert vom lokalen Speicherort als Anfangswert abrufen.}, action) => {
  Schalter (Aktion.Typ) {
    Fall 'REDUCE':
          // Hier können wir sehen, dass wir den Aktionstypwert als Schlüsselwert für die Suche verwenden. Beim Versenden können wir die auszuführende Operation basierend auf der Beurteilung dieser Schlüsselwerte finden. return { ...state, count: state.count - action.payload }
          // Entsprechend den Anforderungen der Aktion geben wir ein neues Statusobjekt basierend auf dem ursprünglichen Status zurück, ohne den ursprünglichen Status zu ändern.
    Fall 'ADD':
      return { ...Zustand, Anzahl: Zustand.Anzahl + Aktion.Nutzlast }
   
    Standard:
      Rückgabezustand;
  }
}
 
Standard-Reducer exportieren

Sie können sehen, dass wir das neue Statusobjekt über die ES6-Syntax zurückgeben. Scheint Ihnen diese Methode etwas kompliziert und zu niedrig angesetzt zu sein? Dann führen wir einen neuen Weg ein, führen zuerst die unveränderliche Komponente ein

Diese Methode implementiert tatsächlich eine tiefe Kopie in JS, die eine tiefe Kopie des ursprünglichen Statusobjekts erstellt. Auf diese Weise wirken sich Änderungen am neuen Statusobjekt nicht auf den ursprünglichen Status aus. Ist das nicht großartig? ! !

Garn hinzufügen unveränderlich -S

Anwendung:

importiere { Map } von 'immutable' //Führe die Map-Funktion ein const user = (state = Map({ //Verwende Map, um den Status vollständig zu kopieren
  isLogin: localStorage.getItem('isLogin') === 'true',    
  Token: localStorage.getItem('Token') || '',
  Administratorname: localStorage.getItem('Administratorname') || '',
  Rolle: localStorage.getItem('Rolle') * 1 || 1
}), Aktion) => {
  Schalter (Aktion.Typ) {
    Fall 'CHANGE_LOGIN_STATE':
      return state.set('isLogin', action.payload) //Schreibe Case 'CHANGE_TOKEN' im Set-Modus:
      Rückgabewert: status.set('token', aktion.nutzlast)
    Fall 'CHANGE_ADMIN_NAME':
      Rückgabewert: status.set('Administratorname', Aktion.Nutzlast)
    Fall 'CHANGE_ROLE':
      Rückgabewert: status.set('Rolle', Aktion.Nutzlast)
    Standard:
      Rückgabestatus
  }
}

Standardbenutzer exportieren
Zustand => {
    zurückkehren {
        adminname: state.getIn(['user', 'adminname']), // Den Wert mit der Methode get abrufen, die Parameter haben dieses Format // Die Bedeutung des ersten Parameters: Benutzer im Statusmanager // Die Bedeutung des zweiten Parameters: der Status/das Attribut mit dem Namen adminname}
}

6. Entwurfsstatus-Manager

Erstens können wir basierend auf der Idee der modularen Entwicklung mehrere Arten von Statusmanagern in einem Projekt entwerfen und sie schließlich zu einem zusammenführen. Beispielsweise den Status von Waren, den Status von Benutzerinformationen usw.

importiere { createStore, combineReducers } von "redux";
// Diese combineReducers-Methode ist der Schlüssel zur modularen Entwicklung. Sie hilft uns, alle Statusmanager der Module zusammenzuführen. importiere pro von './modules/pro'
App aus „./modules/app“ importieren
 
const reducer = combineReducers({ //Alle von Untermodulen erstellten Reducer in diesem Reducer konzentrieren
  Pro, App
})
 
const store = createStore(Reduzierer)
 
Standardspeicher exportieren

Hilfe bei der Interpretation der Bühne

Wir müssen eines wissen. Wenn wir den Status zu einem bestimmten Zeitpunkt abrufen oder ändern möchten, generiert der State Manager Store ein Statusinstanzobjekt für uns, und wir können mit diesem Instanzobjekt arbeiten. Statusänderungen führen zu Änderungen in der Ansicht. Da Benutzer jedoch nicht auf den Status, sondern nur auf die Ansicht zugreifen können, müssen Statusänderungen auch durch die Ansicht verursacht werden! ! ! Die Aktion ist eigentlich eine von der Ansicht gesendete Benachrichtigung. Wenn der Benutzer die Ansicht ändert, wird diese Benachrichtigung gesendet, um dem Programm mitzuteilen, dass der Status geändert werden muss.

//Wir können es so verstehen: Die Beziehung zwischen Versand, Aktion und Geschäft kann als Postamt, Post und Empfänger betrachtet werden.
//Wir möchten einen Brief (Aktion) verschicken, um unseren Freunden (Empfängern) mitzuteilen, dass wir einen Job gefunden haben und die Hilfe der Post benötigen (Versand). Wenn uns die Post hilft, die Post an den Empfänger zuzustellen, erhält der Empfänger die Informationen, die ich übermitteln möchte, und nimmt entsprechende Änderungen vor.
//Wenn wir Dispatch aufrufen, finden wir die entsprechende E-Mail über den Typ (Schlüsselwert) und senden sie an den Store

Wie wird der State-Manager verwendet?

// Sie können den Statusmanager in der Komponente über den Provider „verknüpfen“ und eine Verbindung herstellen. Nachdem die Verknüpfung erfolgreich war, können Sie die Zustände und Methoden im Statusmanager verwenden. // /src/xxx/index.jsx
importiere {connect} von 'react-redux'
 
Funktion App (Requisiten) {
    ...
}
Standardmäßig exportieren verbinden(mapStateToProps, mapDispatchToProps)(App)
     
// /index.js
importiere {Provider} von 'react-redux'
App aus „./App.jsx“ importieren
Importiere Store „./store/index.js“
     
ReactDom.render (
    <Reagieren.StrictMode>
        <Anbieter-Store = {Store}>
            <App />
        </Anbieter>
    </React.StrickMode>
)
 
//Sie können auch die High-Order-Funktion des Dekorators @connect @withRouter verwenden
 
//Früher wurden die entsprechenden Daten aus dem Statusbaum entnommen und dann mithilfe der connect()-Methode der react-redux-Klasse Home extends React.Component { über Props an die Komponente übergeben.
    //....
}
Standardmäßig exportieren verbinden (Status => ({todos: Status.todos})) (Home);
 
//Wenn Sie Dekoratoren verwenden, sieht es so aus, was nicht so kompliziert erscheint @connect(state => ({ todos: state.todos }))
Klasse Home erweitert React.Component {
    //....
}

Hier erklären wir diesen Ansatz:

Wir müssen den Statusmanager verknüpfen. Zuerst führen wir den Statusspeicher in die Eintragsdatei index.js des gesamten Projekts ein und übergeben den Speicher als Parameter über die Provider-Methode an die untergeordnete Komponente. Dies ähnelt der Art und Weise, wie die übergeordnete Komponente Werte an die untergeordnete Komponente übergibt.

Zweitens müssen wir die Komponente mithilfe des Statusmanagers über die höherwertige Connect-Funktion verbinden. Das Prinzip dieser höherwertigen Funktion besteht darin, eine Funktion als Parameter zu übergeben und eine andere Funktion zurückzugeben.

mapStateToProps:

Wie der Name schon sagt, geht es darum, die Zustandsdurchquerung im Zustand zu verarbeiten und in Requisiten einzufügen, sodass wir den Zustand im Requisitenparameterwert in der Funktionskomponente abrufen können.

mapDispatchToProps:

Speichern Sie die Übermittlungsmethode im Statusmanager in Props, damit wir den Status im Statusmanager in der Komponente ändern können.

const App = (Eigenschaften) => {
    // Die Komponente kann über Props direkt auf den Status props.adminname im State Manager zugreifen
    Eigenschaften.Anzahl
    props.bannerList
    Eigenschaften.reduceFn
    ...
}
Standardverbindung exportieren (
    // Sie können sehen, dass hier zwei Funktionen übergeben werden und zwei Funktionen zurückgegeben werden. Zustand => {
        zurückkehren {
            adminname: state.getIn(['user', 'adminname']), //So kann der Status gespeichert werden. Über die Anzahl werden wir später sprechen: state.app.count, //Der Parameter ist state. Wir übergeben die Eigenschaft count im App-State-Manager an count in props
            Bannerliste: state.pro.bannerList,
        }
    },
    Versand => {
        zurückkehren {
            reduceFn () { //Wir definieren hier eine ReduceFn, die die Dispatch-Methode enthält. Wir können die ReduceFn-Methode in Props verwenden, um die von „REDUCE“ übermittelten Informationen zu senden dispatch({
                    Typ: 'REDUCE',
                    Nutzlast: 5 //Nutzlast ist ein Parameter, er kann weggelassen werden})
            }
        }
    }
)(App)

Zusätzlich zu dieser grundlegenden Möglichkeit, den Status zu ändern, können wir auch einige Tools verwenden

Redux-Thunk, Redux-Saga

Verwendung von Redux-Thunk

//Thunk in store.js einführen und in den State-Manager einbinden import { createStore, combineReducers, applyMiddleware} from 'redux'
 
Thunk von „Redux-Thunk“ importieren
App aus „./modules/app“ importieren
importiere pro aus './modules/pro'
 
const Reducer = kombinierenReducers({
  App, Pro
})
//Thunk über applyMiddleware in den State-Manager einbinden const store = createStore(reducer, applyMiddleware(thunk))
 
Standardspeicher exportieren

Anschließend entwerfen wir eine separate Datei, um die Art und Weise der Statusänderung, einschließlich asynchroner Methoden, zu kapseln.

// .../store/actionCreator/pro.js
 
// Diese Datei wird speziell zum Auslösen asynchroner Operationen verwendet. // Wenn das Thunk-Modul ausgeführt wird, hat die Funktion actionCreator einen Standardparameter für dispatch
// Mit diesem Dispatch kann der Reducer ausgelöst werden
// Manchmal müssen Sie beim asynchronen Auslösen Parameter übergeben. In diesem Fall können Sie eine actionCreator-Funktion innerhalb der Funktion const actions = { zurückgeben.
  getBannerListAction (Versand) {
    holen('http://121.89.205.189/api/banner/list')
    .then(res => res.json())
    .then(res => {
      versenden({
        Typ: 'CHANGE_BANNER_LIST',
        Nutzlast: res.data
      })
    })
  },
  getProListAction (Anzahl) { //Mit Parametern, gibt eine Funktion zurück, der Funktionsparameter ist standardmäßig dispatch
    Anzahl = Anzahl || 1
    Rückgabefunktion (Versand) {
      holen('http://121.89.205.189/api/pro/list?count=' + Anzahl)
      .then(res => res.json())
      .then(res => {
        versenden({
          Typ: 'CHANGE_PRO_LIST',
          Nutzlast: res.data
        })
      })
    }
  }
}
 
Standardaktionen exportieren

Die obigen Schritte können als Definition eines Aktionsobjekts betrachtet werden, das einige Dispatches zum Senden von Aktionen enthält. Wenn wir den Status in der Komponente ändern möchten, können wir die Funktion in diesem Objekt direkt verwenden. Die Funktion initiiert dann automatisch eine Anforderung und sendet die Aktion.

Dies ist auch an der Verwendung der folgenden von uns versendeten Komponenten (actions.getBannerListAction) ersichtlich. Tatsächlich handelt es sich dabei um die Form der Übermittlung einer Aktion, wir kapseln jedoch die Aktionsänderung und die asynchrone Anforderung.

Aktionen importieren aus „./store/actionCreator/pro“
const App = (Eigenschaften) => {
    // Auf props.reduceFn() kann direkt von props aus zugegriffen werden
    props.addFn()
    props.getBannerList()
    props.getProList()
}
 
const mapStateToProps = (Zustand) => {
  zurückkehren {
    Anzahl: Status.App.Anzahl,
    Bannerliste: state.pro.bannerList,
    proList: state.pro.proList
  }
}
 
const mapDispatchToProps = (Versand) => {
  zurückkehren {
    reduceFn () { //Ändere den Status auf die normale Weise dispatch({       
        Typ: 'REDUCE',
        Nutzlast: 5
      })
    },
    addFn () {
      versenden({
        Typ: 'ADD',
        Nutzlast: 5
      })
    },
    getBannerList () { //Ändern Sie den Status durch die Thunk-Methode dispatch(actions.getBannerListAction)
    },
    getProList () {
      Versand(Aktionen.getProListAction(2))
    }
  }
}
 
Standardmäßig exportieren verbinden(mapStateToProps, mapDispatchToProps)(App)

Die Verknüpfungsmethode ist genau die gleiche wie beim normalen React-Redux, und schließlich wird der Status durch das Versenden einer Aktion geändert

Verwendung von react-saga

Installieren Sie Redux-Saga

Garn hinzufügen Redux-Saga unveränderlich Redux-unveränderlich -S

Sie können sich Redux-Saga und Redux-Thunk als eine Möglichkeit vorstellen, Briefe zu versenden. Früher haben wir Briefe (Versand) mit dem Auto oder zu Fuß verschickt. Die Verwendung von Werkzeugen kann man als das Versenden von Briefen mit dem Zug oder Flugzeug betrachten.

importiere { createStore, combineReducers, applyMiddleware } von 'redux'
 
importiere createSagaMiddleware aus „redux-saga“
 
importiere mySaga von './mySaga' //Anweisungen für asynchrone Operationen importiere home von './modules/home'
App aus „./modules/app“ importieren
 
const Reducer = kombinierenReducers({
  App,
  heim
})
 
const sagaMiddleware = createSagaMiddleware() //Saga-Middleware generieren const store = createStore(reducer, applyMiddleware(sagaMiddleware))
//Eine Verbindung herstellen //Wie bei Thunk wird die Saga-Middleware in den State-Manager eingebunden. Anschließend können Sie den Status mit der Saga-Methode ändern sagaMiddleware.run(mySaga)
//ausführen: Senden // Hier ist eine mySage-Funktion, die als Funktion zum Ändern des Status des Export-Standardspeichers gekapselt ist

Als nächstes werden wir vorstellen, wie Saga den Zustand ändert

In redux-saga wird der Status mithilfe der Generatorfunktion geändert

importiere { call, put, takeLatest } von 'redux-saga/effects'
 
importiere { getBannerList, getProList } von '../api/home'
 
// redux-saga ---> Muss mit der Generatorfunktion verwendet werden function * getBannerListAction() {
  const res = yield call(getBannerList) //Aufruf - Funktion „yield put“ aufrufen ({
    Typ: 'CHANGE_BANNER_LIST',
    Nutzlast: res.data
  })
}
Funktion * getProListAction (Aktion) {
  const res = yield call(getProList, Aktion.Nutzlast)
  Rendite setzen({
    Typ: 'CHANGE_PRO_LIST',
    Nutzlast: res.data
  })
}
 
Funktion * meineSaga () {
  Ergebnis: takeLatest('REQUEST_BANNER_LIST', getBannerListAction)
  Ergebnis: takeLatest('REQUEST_PRO_LIST', getProListAction)
}
 
Standardmäßig mySaga exportieren

Wenn Sie das oben Gesagte nicht verstehen, haben Sie keine Angst. Schauen Sie hier

// In der Datei mysaga definieren wir die Sendemethode import { takeLatest } from 'redux-saga/effects'
// takeLatest --- Aufgaben zuweisen; unten. Wir definieren den Schlüssel und weisen ihm Ereignisse zu. Diese Ereignisse sind die Funktionen, die von der Funktion store.dispatch() verwendet werden. * getProListAction (Aktion){
  const res = yield call(getProList, Aktion.Nutzlast)
  Rendite setzen({
    Typ: 'CHANGE_PRO_LIST',
    Nutzlast: res.data
  })
}
Funktion * meineSaga () {
  Ergebnis: takeLatest('REQUEST_PRO_LIST', getProListAction)
}
 
// Wenn wir den Status in Zukunft ändern möchten, müssen wir dafür nicht store.dispatch() verwenden. // Wir können dafür den in dieser Datei definierten Schlüsselwert verwenden. // Wir definieren eine benutzerdefinierte Funktion im Connect der Komponente wie folgt und rufen hier die Änderungsmethode dispatch direkt entsprechend dem Schlüsselwert auf => {
    Versand ({ Typ: 'REQUEST_PRO_LIST'})
}
 
 
// setzen, aufrufen
// call ---> bedeutet aufrufen // put ---> bedeutet pushen, die aktuelle Aktion zur nächsten auszuführenden Aktion (Warteschlange) verschieben.
 
Rendite Put (Aktion)
Aufruf ausführen (fn)

Das Obige ist mein Verständnis der häufig verwendeten Statusmanager in React basierend auf verschiedenen Dokumenten. Wenn es Fehler gibt, hoffe ich, dass Sie darauf hinweisen können, damit wir gemeinsam Fortschritte erzielen können.

Zusätzlich zu den oben genannten Statusmanagern gibt es noch einige andere Tools auf dem Markt, z. B. MobX, Umi und Dva. Wenn ich Zeit habe, werde ich sie sortieren und mit Ihnen teilen.

Dies ist das Ende dieses Artikels über die Interpretation verschiedener Statusmanager in React. Weitere relevante Inhalte zum React-Statusmanager finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Untersuchung der drei zugrunde liegenden Mechanismen der globalen Statusverwaltung von React
  • Zusammenfassung der drei Regeln für die React-Statusverwaltung
  • Beispiel für die Verwendung der Statusverwaltungsmethode von Vue in React

<<:  Analyse und Lösung der Ursache für den Verlust des Webseitenstils durch das automatische Ausfüllen von Formularen durch den Browser

>>:  Fünf Möglichkeiten zum automatischen Seitensprung in HTML

Artikel empfehlen

Detaillierte Erklärung des MySQL-Datenbank-LIKE-Operators in Python

Der LIKE-Operator wird in der WHERE-Klausel verwe...

Dieser Artikel zeigt Ihnen das Prinzip der MySQL Master-Slave-Synchronisation

Inhaltsverzeichnis Kurze Analyse des MySQL Master...

Der Prozess der Installation von Docker im Linux-System

In diesem Blog führe ich Sie in einfachen Schritt...

Hexadezimale Farbcodes (vollständig)

Rot und Pink und ihre Hexadezimalcodes. #990033 #...

Detaillierte Erklärung zur SQL-Injection - Sicherheit (Teil 2)

Sollte dieser Artikel Fehler enthalten oder du An...

So sichern Sie MySQL unter Linux automatisch remote

Vorwort: Ganz gleich, ob wir es für den Eigengebr...

So bereinigen Sie den von Docker belegten Speicherplatz

Docker nimmt viel Platz ein. Immer wenn wir Conta...

Detaillierte Schritte zur Remotebereitstellung einer MySQL-Datenbank unter Linux

Remotebereitstellung der MySQL-Datenbank unter Li...

Eine ausführliche Zusammenfassung der Überlegungen zu MySQL-Zeiteinstellungen

Existiert die Zeit wirklich? Manche Menschen glau...