reagieren von Facebook ist eine sehr schöne Bibliothek zum Erstellen von Benutzeroberflächen. Das einzige Problem ist, dass React egal ist, wie Ihre Anwendung mit den Daten umgeht. Die meisten Menschen verwenden React als V in MV*. So führte Facebook ein Muster namens Flux ein, das einen funktionalen Ansatz für die Datenhandhabung in einer App verleiht. Dieses Tutorial gibt eine kurze Einführung in das Flussmuster und zeigt, wie Sie eine Note erstellen, die die App mit React und Flux -Architektur nimmt.
Key Takeaways
- Fluss ist ein von Facebook eingeführter Muster, das einen funktionalen Ansatz für die Datenhandhabung in einer App verleiht und React durch die Erstellung von Benutzeroberflächen ergänzt. Es basiert auf unidirektionalen Datenfluss durch Schlüsselkomponenten wie Speicher und Aktionen.
- Das Tutorial bietet ein Beispiel für das Erstellen einer Notizen-App mit React, Flux und Node.js. Die App ist in verschiedene Komponenten unterteilt, wie NoteApp, Notelistbox, Notelist, Note, NotecreationBox und TextArea.
- reag und reflux werden auf dem Server verwendet, um Komponenten sowohl auf der Client- als auch auf der Serverseite zu rendern. Diese Technik ermöglicht die Erstellung isomorpher Apps, die auf dem Server rendern und sich auch als einseitige Apps verhalten.
- In der Flux -Architektur wird der Zustand der Anwendung in Geschäften gespeichert. Wenn eine Aktion stattfindet, sendet sie Daten an den Dispatcher, der diese Daten dann an den entsprechenden Speicher sendet. Der Store aktualisiert seinen Zustand und gibt ein Änderungsereignis aus, wodurch alle React-Komponenten nach Änderungen im Store zu hören sind, um sich zu aktualisieren und neu zu rendern.
Ein Primer auf Fluss
Fluss basiert auf dem unidirektionalen Datenfluss. Wir haben zwei Schlüsselkomponenten im Flussmuster:
- speichert: Eine Speicherkomponente speichert, wie der Name schon sagt, die Anwendungsdaten.
- Aktionen: Neue Daten fließen durch Aktionen in die Geschäfte. Speichern Sie sich auf Aktionen und erledigen Sie einige Aufgaben (z. B. Daten ändern), wenn Aktionen aufgerufen werden. Dies hält den Datenfluss unidirektional.
Um das Konzept zu verstärken, nehme wir ein Beispiel in der realen Welt. In einer App -App -App können Sie beispielsweise die folgende Anordnung haben:
- Ein Geschäft namens Notestore, der eine Liste von Notizen speichert.
- Sie können eine Aktion namens CreateNote haben. Der Store Notestore hört die Aktion CreateNote und aktualisiert seine Liste mit einer neuen Notiz, wenn die Aktion aufgerufen wird. Die Daten fließen nur durch Aktionen in den Speicher.
- Der Notestore löst ein Ereignis aus, wenn sich seine Daten ändert. Ihre React -Komponente, sagen NotelistComponent, hört dieses Ereignis an und aktualisiert die Liste der in der Ansicht angegebenen Notizen. So fließen die Daten aus dem Geschäft.
Der Datenfluss kann also wie folgt visualisiert werden:
Der größte Vorteil des Flussmusters besteht darin, dass Ihre Anwendungsdaten flach bleiben. Da Mutation nur durch Aktionen durchgeführt werden kann, ist es einfacher zu verstehen, wie sich die Datenänderung auf die gesamte Anwendung auswirkt.
Hinweis:
Wenn Sie Facebooks Leitfaden zum Fluss durchlaufen haben, haben Sie möglicherweise das Konzept eines Dispatcher bemerkt. Ein Dispatcher ist eine Registrierung von Rückernläufen in die Geschäfte. Wenn eine Aktion aufgerufen wird, antwortet der Dispatcher darauf und sendet die zugehörigen Daten an alle registrierten Geschäfte. Speichern Sie sich dann den Aktionsart und führen Sie Aufgaben entsprechend aus.
Der obige Prozess wurde durch eine Bibliothek namens Reflux stark vereinfacht. Es entfernt das Konzept der Disponenten, indem es die Aktionen hörbar macht. In Reflux können Geschäfte also direkt auf Aktionen anhören und auf ihre Aufruf reagieren.
Um das Flussmuster vollständig zu verstehen
Einrichten einer Entwicklungsumgebung
Wir werden React und Reflux als Knotenmodule verwenden und Browserify verwenden, um sie auch auf der Client -Seite verfügbar zu machen. Also, hier ist, wie wir die Umgebung einrichten:
Wir werden Browserify verwenden, um unsere React -Komponenten, Aktionen und Speichern in ein Client -Seite .js -Paket zu bündeln. -
Wir werden eine Grunzwache verwenden, um Änderungen in den oben genannten Komponenten zu erkennen und jedes Mal, wenn eine Änderung eintritt, neu zu erfassen. -
grunn nodemon wird verwendet, um den Server neu zu starten, wenn eine .jsx- oder .js -Datei geändert wird, sodass Sie sie nicht manuell tun müssen. -
Sie können den Code von GitHub herunterladen und grunnfile.js öffnen, um mehr über die Aufgaben zu lesen. Sobald Sie das Repo auf Ihrem Computer haben, können Sie einfach die NPM -Installation ausführen, um die erforderlichen Knotenmodule zu installieren. Führen Sie die folgenden Befehle aus und beginnen Sie mit der Entwicklung:
grunt watch
grunt nodemon
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Die App ist unter https: // localhost: 8000 zugänglich und funktioniert wie folgt:
in der App
arbeiten
Beginnen wir mit verschiedenen Komponenten der App. So können wir unsere Benutzeroberfläche in verschiedene Komponenten einteilen:
Hier ist, was jede Komponente tut:
- noteApp: Dies ist die Stammkomponente, die aus zwei untergeordneten Komponenten besteht: NotelistBox und NotEcreationBox.
- NotelistBox: hat einen einzelnen Kinderkomponenten -Notelist. Es ruft eine Liste von Notizen aus dem Flux Store ab und gibt sie an den Notelist weiter.
- NOTELIST: Verantwortlich für die Rendern jeder Notizkomponente. Übergibt ein Notizobjekt an jede Note -Komponente.
- Hinweis: Zeigt die Details für ein einzelnes Notizelement an. In diesem Fall zeigen wir nur den Titel an. Sie können problemlos andere Details wie Datum, Untertitel usw. anzeigen
- NotecreationBox: Diese Komponente macht eine Textbereichskomponente und übergibt, falls vorhanden.
- textarea: Bietet eine textarea, um Benutzereingaben zu akzeptieren. Übergibt den Notiztext zum Speichern an NotecreationBox.
Aktionen erstellen
Verwenden wir Reflux, um einige Aktionen zu erstellen. Wenn Sie Aktionen/Notakaten.js öffnen, können Sie sehen, wie Aktionen erstellt werden. Hier ist der Ausschnitt:
grunt watch
grunt nodemon
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
reflux.createActions wird verwendet, um Aktionen zu erstellen. Wir exportieren diese Aktionen, um sie in unseren Komponenten zu verwenden.
Store erstellen
Wir haben einen einzelnen Laden namens Notestore, der eine Reihe von Notizen unterhält. Der folgende Code wird zum Erstellen des Speichers verwendet (Stores/Notestore.js):
<span>var Reflux = require('reflux');
</span>
<span>var NoteActions = Reflux.createActions([
</span> <span>'createNote',
</span> <span>'editNote'
</span><span>]);
</span>
module<span>.exports = NoteActions;</span>
Nach dem Login kopieren
Wie Sie sehen, hören wir uns zwei Aktionen, CreateNote und EditNote, innerhalb der Init -Methode an. Wir registrieren auch Rückrufe, um auszuführen, wenn Aktionen aufgerufen werden. Der Code zum Hinzufügen/Aktualisieren einer Notiz ist ziemlich einfach. Wir stellen auch Getter aus, um die Liste von Notizen abzurufen. Schließlich wird das Geschäft so exportiert, damit er in unserer Komponente verwendet werden kann.
Komponenten erstellen
Alle unsere React -Komponenten befinden sich im React-/Komponentenverzeichnis. Ich habe bereits die Gesamtstruktur der Benutzeroberfläche gezeigt. Sie können den heruntergeladenen Quellcode überprüfen, um mehr über jede Komponente zu erfahren. Hier zeige ich Ihnen das Schlüsselsache (d. H. Wie unsere Komponenten Aktionen aufrufen und mit dem Geschäft interagieren).
NotelistBox:
Diese Komponente erhält eine Liste von Notizen von Notestore und füttert sie an die NOTELIST -Komponente, die dann die Notizen rendert. So sieht die Komponente aus:
<span>var Reflux = require('reflux');
</span><span>var NoteActions = require('../actions/NoteActions');
</span>
<span>var _notes = []; //This is private notes array
</span>
<span>var NoteStore = Reflux.createStore({
</span> <span>init: function() {
</span> <span>// Here we listen to actions and register callbacks
</span> <span>this.listenTo(NoteActions.createNote, this.onCreate);
</span> <span>this.listenTo(NoteActions.editNote, this.onEdit);
</span> <span>},
</span> <span>onCreate: function(note) {
</span> _notes<span>.push(note); //create a new note
</span>
<span>// Trigger an event once done so that our components can update. Also pass the modified list of notes.
</span> <span>this.trigger(_notes);
</span> <span>},
</span> <span>onEdit: function(note) {
</span> <span>// Update the particular note item with new text.
</span> <span>for (var i = 0; i < _notes.length; i++) {
</span> <span>if(_notes[i]._id === note._id) {
</span> _notes<span>[i].text = note.text;
</span> <span>this.trigger(_notes);
</span> <span>break;
</span> <span>}
</span> <span>}
</span> <span>},
</span>
<span>//getter for notes
</span> <span>getNotes: function() {
</span> <span>return _notes;
</span> <span>},
</span>
<span>//getter for finding a single note by id
</span> <span>getNote: function(id) {
</span> <span>for (var i = 0; i < _notes.length; i++) {
</span> <span>if(_notes[i]._id === id) {
</span> <span>return _notes[i];
</span> <span>}
</span> <span>}
</span> <span>}
</span><span>});
</span>
module<span>.exports = NoteStore; //Finally, export the Store</span>
Nach dem Login kopieren
Wenn die Komponenten montiert, hören wir uns das Ereignis des Notestore -Veränderungen an. Dies wird immer dann ausgestrahlt, wenn in der Notizenliste eine Mutation vorhanden ist. Unsere Komponente hört dieses Ereignis so, dass sie die Notizen im Falle einer Änderung neu erstellen kann. Die folgende Zeile registriert einen Hörer:
<span>var React = require('react');
</span><span>var NoteList = require('./NoteList.jsx');
</span><span>var NoteStore = require('../../stores/NoteStore');
</span>
<span>var NoteListBox = React.createClass({
</span> <span>getInitialState: function() {
</span> <span>return { notes: NoteStore.getNotes() };
</span> <span>},
</span> <span>onChange: function(notes) {
</span> <span>this.setState({
</span> <span>notes: notes
</span> <span>});
</span> <span>},
</span> <span>componentDidMount: function() {
</span> <span>this.unsubscribe = NoteStore.listen(this.onChange);
</span> <span>},
</span> <span>componentWillUnmount: function() {
</span> <span>this.unsubscribe();
</span> <span>},
</span> <span>render: function() {
</span> <span>return (
</span> <span><div className="col-md-4">
</span> <span><div className="centered"><a href="" onClick={this.onAdd}>Add New</a></div>
</span> <span><NoteList ref="noteList" notes={this.state.notes} onEdit={this.props.onEdit} />
</span> <span></div>
</span> <span>);
</span> <span>}
</span><span>});
</span>
module<span>.exports = NoteListBox;</span>
Nach dem Login kopieren
Wenn also eine Änderung der Veränderung der Komponente aufgerufen wird. Diese Methode empfängt eine aktualisierte Notizliste und ändert den Status.
<span>this.unsubscribe = NoteStore.listen(this.onChange);</span>
Nach dem Login kopieren
als this.state.notes wird als Requisite an den Notelist übergeben, wenn der Staat den Notelist erneut verändert.
Schließlich schreiben wir dies.
So bleibt der Notelist immer auf dem neuesten Stand, indem sie sich das Change-Ereignis des Geschäfts anhört. Lassen Sie uns nun sehen, wie eine Notiz erstellt/bearbeitet wird.
NotecrionBox:
schauen Sie sich die folgende Methode der NotecreationBox an:
grunt watch
grunt nodemon
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Diese Methode wird aufgerufen, wenn die Schaltfläche Speichern gespeichert wird. Es akzeptiert Notetext als seinen ersten Parameter. Wenn eine ID als zweiter Parameter übergeben wird, wissen wir, dass dies eine Bearbeitungsoperation ist und die Aktionsnotnaktionen aufrufen.Editnote (). Andernfalls generieren wir eine ID für die neue Notiz und rufen nameactions.createNote () auf. Denken Sie daran, dass unser Notestore diese Aktionen hört. Abhängig von der Aktion wird geeigneter Store -Rückruf ausgeführt. Sobald die Daten mutiert sind, löst der Store ein Änderungsereignis aus und unsere Komponenten -Notelist aktualisiert sich.
So fließt die Daten in das System und gehen anschließend in einer fluxenbasierten Anwendung aus.
Warum Reaging auf dem Server verwenden
Sie fragen sich vielleicht, warum ich React und Reflux auf dem Server verwendet habe. Eine der coolen Merkmale von React ist, dass die Komponenten sowohl auf dem Client als auch auf dem Server gerendert werden können. Mit dieser Technik können Sie isomorphe Apps erstellen, die auf dem Server rendern und sich auch als einseitige Apps verhalten. Dies ist zwar möglicherweise nicht für eine Notiz -App erforderlich, können dieses Setup leicht verwenden, um komplexe isomorphe Apps in Zukunft zu erstellen.
Ich ermutige Sie, den Quellcode durchzugehen und ihn weiter zu verbessern, da viel Raum für Verbesserungen vorhanden ist. Wenn Sie Fragen haben, lassen Sie es mich in Kommentaren wissen.
Danke fürs Lesen!
häufig gestellte Fragen zum Erstellen einer Notizen-App mit React und Flux
Welche Rolle spielt der Fluss beim Erstellen einer Notizen-App mit React? Es ergänzt die Komponenten von Reacts komponierbarer Ansicht mithilfe eines unidirektionalen Datenflusss. Im Zusammenhang mit der Erstellung einer Notizen-App spielt Flux eine entscheidende Rolle bei der Verwaltung des Datenflusss. Es stellt sicher, dass sich die Daten in eine Richtung bewegt, von Aktionen bis hin zu Speichern und dann zu den Ansichten. Dies macht die App vorhersehbarer und einfacher zu verstehen, da sie die Komplexität der Datenaustausch zwischen Komponenten und die Verwirrung der Zwei-Wege-Datenbindung vermeidet. ? React ist dafür verantwortlich, Ansichten zu rendern und auf Benutzereingaben zu reagieren, während Flux den Datenfluss der Anwendung verwaltet. Wenn ein Benutzer mit den React -Komponenten interagiert (z. B. Hinzufügen einer neuen Note), löst er eine Aktion aus. Diese Aktion aktualisiert den Store (die zentralen Daten der App) über einen Dispatcher. Das Geschäft gibt dann ein Änderungsereignis ab, wodurch die React-Komponenten bei Bedarf aktualisiert und neu erstellt werden können.
Was sind die Schlüsselkomponenten der Flussarchitektur? Aktionen sind Nutzlast von Informationen, die Daten aus der Anwendung an den Dispatcher senden. Der Dispatcher ist eine Art zentraler Hub, der alle Datenfluss in der Anwendung verwaltet. Die Geschäfte enthalten den Anwendungszustand und die Logik und werden vom Dispatcher aktualisiert. Schließlich hören Sie Ansichten (React-Komponenten) auf Änderungen in den Filialen und rendern Sie sich neu, wenn diese Änderungen auftreten. Im Fluss wird der Zustand Ihrer Anwendung normalerweise in Geschäften gespeichert. Wenn eine Aktion auftritt (wie beim Hinzufügen eines neuen Note), werden Daten an den Dispatcher gesendet. Der Dispatcher sendet diese Daten dann an den entsprechenden Speicher. Der Store aktualisiert seinen Staat und gibt ein Änderungsereignis aus. Alle React-Komponenten, die nach Änderungen im Store hören, aktualisieren und rendern sich neu und reflektieren den neuen Zustand der Anwendung. 🎜>
Flussarchitektur hilft bei der Aufrechterhaltung der Skalierbarkeit der Notiz-App, indem ein klarer und vorhersehbarer Datenfluss bereitgestellt wird. Dies erleichtert das Verständnis und die Änderung der App, wenn sie in Komplexität wächst. Der unidirektionale Datenfluss stellt sicher, dass sich Änderungen in einem Teil der App nicht unerwartet auf andere Teile auswirken, die Wahrscheinlichkeit von Fehler verringern und die App leichter zu testen und zu debuggen. ANTER-APP-APP mit React und Fluss? Wenn ein Benutzer mit einer React -Komponente interagiert (z. B. Klicken auf eine Schaltfläche, um eine neue Note hinzuzufügen), löst er eine Aktion aus. Diese Aktion sendet Daten an den Dispatcher, der den entsprechenden Speicher aktualisiert. Der Speicher emittiert dann ein Änderungsereignis, wodurch ein Hörreakt-Komponenten aktualisiert und neu erstellt werden kann. -Mit React und Flux erstellte App -App kann mit verschiedenen Testbibliotheken und Frameworks erfolgen. Für React -Komponenten für Einheitstests können Bibliotheken wie Scherz oder Enzym verwendet werden. Zum Testen der Flussaktionen und Geschäfte können Sie Scherz zusammen mit Bibliotheken wie Redux-Mock-Store oder Flux-Mock-Store verwenden. End-to-End-Tests können mit Tools wie Zypressen oder Puppenspielern durchgeführt werden. Mit React und Fluss können mit verschiedenen Werkzeugen durchgeführt werden. Mit der Erweiterung von React Developer Tools für Chrome und Firefox können Sie die React -Komponentenhierarchie, Requisiten und den Zustand inspizieren. Für den Debuggenfluss können Sie Aktionen protokollieren und Änderungen an der Konsole angeben oder ein Tool wie Redux Devtools verwenden, wenn Sie Redux als Flux -Implementierung verwenden.
Kann ich beim Erstellen meiner Notizen-App-App andere Bibliotheken oder Frameworks mit React und Flux verwenden? Sie können beispielsweise eine Routing-Bibliothek wie React Router für die Navigation, eine Testbibliothek wie Scherz zum Testen oder eine UI-Bibliothek wie Material-UI zum Styling Ihrer App verwenden. Die Auswahl der Bibliotheken oder Frameworks hängt von Ihren spezifischen Anforderungen und Vorlieben ab. Die mit React und Flux erstellte Notiz-App-App kann verschiedene Strategien beinhalten. Eine gemeinsame Strategie besteht darin, sicherzustellen, dass Komponenten bei Bedarf nur bei Bedarf wieder rendern, indem Status und Requisiten sorgfältig verwaltet und Reacts PureComponent verwendet werden oder gegebenenfalls komponentupdate werden. Andere Strategien umfassen möglicherweise die Optimierung der anfänglichen Ladezeit der App durch Codeaufteilung oder Optimierung des Datenabrufens durch Verwendung einer Bibliothek wie Relais oder Apollo.
Das obige ist der detaillierte Inhalt vonErstellen einer Note, die App mit React und Flux nimmt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!