Ich habe vor Kurzem eine visuelle Operationsplattform entwickelt, die die Möglichkeit bietet, Benutzeroperationen rückgängig zu machen oder wiederherzustellen. Ich habe online nach Lösungen gesucht und die Lösungen, die ich mir vorgestellt habe, perfektioniert. Wichtige Punkte zu den Anforderungen an historische Aufzeichnungen
Scheinbar einfache Anforderungen, doch Fehler bei der Infrastrukturplanung führen künftig zu Mehraufwand. Wenn man die Anforderungen der beiden oben genannten Punkte kombiniert, stellt man fest, dass die Grundidee von Vuex sehr gut geeignet ist, diese Anforderung zu erfüllen, und das Gleiche gilt für Redux. UmsetzungsideenDieses Projekt verwendet Typescript, um die Genauigkeit des Codes zu verbessern und zukünftige Wartungsarbeiten zu erleichtern. Schauen wir uns die Idee einmal an. 1. Definieren Sie zunächst die Datenstruktur historischer AufzeichnungenSchnittstelle HistoryItem { timestrap: Zahl; // Zeitstempel des Datensatzes name: Zeichenfolge; // Name des Datensatzes redo: Zeichenfolge; // Mutation wiederholen undo: string; // Mutation rückgängig machen redoParams: any[]; // Mutationsübermittlungsparameter wiederholen undoParams: any[]; // Mutationsübermittlungsparameter rückgängig machen } Schnittstelle HistoryStatus { historys: HistoryItem[]; // Verlauf aufzeichnen array_currentHistory: Nummer; // aktueller Knotenindex} 2. Schreiben Sie das History-Statusmodul Schreiben Sie ein Vuex-Modul für den Status des grundlegenden Betriebsverlaufs, erstellen Sie aufgezeichnete Mutationen und wiederholen und rückgängig machen Sie Aktionen. Daher ist es notwendig, einen leeren Datensatz hinzuzufügen, um es Benutzern zu erleichtern, auf den leeren Datensatz zu klicken, um den ursprünglichen Vorgang rückgängig zu machen. Verwenden Sie Vuex-Moduldekoratoren, um wartungsfreundlicheren Code zu schreiben importiere { VuexModul, Modul, Mutation, Aktion } von „vuex-module-decorators“; @Modul({ namespaced: true }) exportiere Klasse HistoryModule erweitert VuexModule<HistoryStatus> implementiert HistoryStatus { /** * Der Grund für die Initialisierung eines leeren Datensatzes besteht hauptsächlich darin, Listenoperationen zu erleichtern: * Wenn der Benutzer auf den frühesten Datensatz klickt, kann der erste Schritt der Benutzeroperation normal rückgängig gemacht werden**/ öffentliche Geschichten:HistoryItem[] = [ { Name: `Öffnen`, Zeitleiste: Date.now(), wiederholen: "", redoParams: [], rückgängig machen: "", undoParams: [], }, ]; öffentliche _currentHistory: Zahl = 0; // Getter aktuelle abrufen(){ gib dies zurück._currentHistory; } // Getter Holen Sie sich historyList(): HistoryItem[] { gib diese.Geschichten zurück || []; } // Verlauf erstellen @Mutation öffentliche CREATE_HISTORY(Nutzlast: HistoryItem) { wenn (this._currentHistory < this.historys.length - 1) { diese.historys = diese.historys.slice(0, diese._currentHistory); } // Aufgrund des tiefen und flachen Kopierproblems von js müssen die Daten beim Erstellen tief kopiert werden // Ich möchte die Klonfunktion von lodash ausprobieren, finde aber, dass die Klonmethode von JSON.stringify schneller sein sollte. Schließlich existieren unsere Daten nicht in der Funktion // Ich werde es hier nicht ändern, hauptsächlich um die Idee auszudrücken this.historys.push(_.cloneDeep(payload)); this._currentHistory = this.historys.length - 1; } @Mutation öffentliche SET_CURRENT_HISTORY(index: zahl) { this._currentHistory = Index < 0? 0: Index; } // @Action wiederholen öffentliche RedoHistory(Zeiten: Zahl = 1) { lass { Status, Commit } = diesen.Kontext; let history: HistoryItem[] = status.historys; lass aktuell: Zahl = Status._aktuelleHistory; wenn (aktuell + Zeiten >= Verlauf.Länge) return; während (Zeiten > 0) { aktuell++; lass Geschichte = Geschichten[aktuell]; wenn (Geschichte) { commit(history.redo, ...history.redoParams, { root: true }); } mal--; } commit("SET_CURRENT_HISTORY", aktuell); } // @Action rückgängig machen public UndoHistory(Zeiten: Zahl = 1) { lass { Status, Commit } = diesen.Kontext; let history: HistoryItem[] = status.historys; lass aktuell: Zahl = Status._aktuelleHistory; wenn (aktuell – Zeiten < 0) return; während (Zeiten > 0) { lass Geschichte = Geschichten[aktuell]; wenn (Geschichte) { commit(history.undo, ...history.undoParams, { root: true }); } mal--; aktuell--; } commit("SET_CURRENT_HISTORY", aktuell); } } 3. Schreiben Sie Rückgängig- und Wiederherstellen-FunktionenNach Abschluss der beiden oben genannten Schritte können wir verschiedene Operationen schreiben Schreiben Sie Mutationen für grundlegende Operationen an Daten @Mutation public CREATE_PAGE(payload: { Seite: PageItem; Index: Nummer }) { diese.Seiten.splice(Nutzlast.index, 0, _.cloneDeep(Nutzlast.seite)); this._currentPage = this.pages.length - 1; } @Mutation öffentliche REMOVE_PAGE(id: Zeichenfolge) { let index = this.pages.findIndex((p) => p.id == id); index > -1 und diese.Seiten.splice(index, 1); wenn (diese._aktuelleSeite == index) { this._currentPage = this.pages.length > 0 ? 0 : -1; } } Kapseln Sie grundlegende Operationen in Aktionen mit Speichern->Aufzeichnen->Ausführen nach Bedarf //Paket erstellen Seitenfunktion @Action public CreatePage(Typ: "Seite" | "Dialog") { lass { Status, Commit } = diesen.Kontext; //Zu erstellende Seite aufzeichnen und speichern let id = _.uniqueId(type) + Date.now(); let Seitenname = Seitentyp[Typ]; let Seite: PageItem = { Ausweis, Name: `${pageName}${state.pages.length + 1}`, Typ, Ebenen: [], Stil: { Breite: 720, Höhe: 1280 }, }; //Verlauf erstellen let history: HistoryItem = { Name: `Erstellen Sie ${pageName}`, Zeitleiste: Date.now(), wiederholen: "Seite/SEITE_ERSTELLEN", redoParams: [{ index: state.pages.length - 1, Seite }], rückgängig machen: "Seite/REMOVE_PAGE", undoParams: [id], }; // Diesen Verlauf speichern und aufzeichnen commit("Histroy/CREATE_HISTORY", history, { root: true }); commit(history.redo, ...history.redoParams, { root: true }); } @Aktion öffentliche RemovePage(id: string) { // Den Status vor Ort aufzeichnen und speichern let index = this.pages.findIndex((p) => p.id == id); wenn (Index < 0) zurückgeben; let page: PageItem = this.context.state.pages[index]; //Verlauf erstellen let history: HistoryItem = { Name: `${page.name} löschen`, Zeitleiste: Date.now(), wiederholen: "Seite/SEITE_ENTFERNEN", redoParams: [id], rückgängig machen: "Seite/SEITE_ERSTELLEN", undoParams: [{ Seite, Index }], }; // Diesen Verlaufsdatensatz speichern this.context.commit("Histroy/CREATE_HISTORY", history, { root: true }); this.context.commit(history.redo, ...history.redoParams, { root: true }); } Die oben genannten Funktionen zum Rückgängigmachen und Wiederherstellen sind grundsätzlich abgeschlossen. 4. Nutzung1. Jetzt müssen wir nur noch die gekapselte `Action` beim Erstellen oder Löschen von Seiten verwenden private erstellen(Typ: "Seite" | "Dialog") { this.$store.dispatch("Seite/Seite erstellen", Typ); } private remove(id: Nummer) { this.$store.dispatch("Seite/Seite entfernen", id); } 2. Globale Hotkeys konfigurieren Typoskript App.vue privat gemountet() { lass self = dies; Hotkeys("Strg+Z", Funktion (Ereignis, Handler) { self.$store.dispatch("Verlauf/Verlauf rückgängig machen"); }); Hotkeys("Strg+Y", Funktion (Ereignis, Handler) { self.$store.dispatch("Verlauf/Verlauf wiederherstellen"); }); } Wirkung Damit ist dieser Artikel über den Beispielcode zur Implementierung von Verlaufsdatensätzen in Vuex abgeschlossen. Weitere relevante Vuex-Verlaufsdatensätze finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
>>: So führen Sie eine Spring Boot-Anwendung in Docker aus
Vorwort Wie wir alle wissen, treten bei Front-End...
In diesem Artikel wird die Installations- und Kon...
Das CSS-Positionsattribut gibt den Positionierung...
23. April 2020: Heute können Sie mit Ubuntu 20.04...
Inhaltsverzeichnis Arithmetische Operatoren Abnor...
Inhaltsverzeichnis Vorwort SVG generieren Einführ...
[mysql] Ersetzungsverwendung (Teil des Inhalts ei...
Ein sehr häufiges Szenario in react -Projekten: c...
Farbe ist eines der wichtigsten Elemente jeder We...
Vorwort Projektanforderungen: Installieren Sie da...
1. Zusammensetzung und verwandte Konzepte der MyS...
In diesem Artikel wird der spezifische Code des d...
Inhaltsverzeichnis 1 Einführung in nginx 1 Was is...
Ich arbeite derzeit an einem eigenen kleinen Prog...
Manchmal müssen wir Server stapelweise bedienen, ...