Beispielcode zur Implementierung des Verlaufs in Vuex

Beispielcode zur Implementierung des Verlaufs in Vuex

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

  • Kann im lokalen Speicher gespeichert werden
  • Mehrere Undo- und Redo-Funktionen möglich
  • Klicken Sie auf ein Element in der Liste, um im Verlauf zur angegebenen Position vor- oder zurückzublättern.

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.

Umsetzungsideen

Dieses 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 Aufzeichnungen

Schnittstelle 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.
Ein Datensatz enthält die Ausführung des Wiederherstellen-Vorgangs und die Aufhebung des Rückgängig-Vorgangs für diesen Schritt. Wenn der Benutzer also auf eines der Elemente in der Liste klickt, sollte zum Rückgängigmachen eine Schleife zum vorherigen Element des aktuellen Elements durchlaufen werden, oder eine Schleife sollte zum Wiederherstellen des aktuellen Elements ausgeführt werden.

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-Funktionen

Nach 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. Nutzung

1. 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:
  • In vue ist es verboten, zum vorherigen Schritt zurückzukehren, und die Route speichert keinen Verlauf
  • Vue implementiert die neue Suchverlaufsfunktion im Eingabefeld

<<:  Zusammenfassung des Installationsprozesses von MySql 8.0.11 und der beim Verknüpfen mit Navicat aufgetretenen Probleme

>>:  So führen Sie eine Spring Boot-Anwendung in Docker aus

Artikel empfehlen

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.17

In diesem Artikel wird die Installations- und Kon...

Untersuchung des Wertes des Positionsattributs in CSS (Zusammenfassung)

Das CSS-Positionsattribut gibt den Positionierung...

So aktualisieren Sie Ubuntu 20.04 LTS unter Windows 10

23. April 2020: Heute können Sie mit Ubuntu 20.04...

React-Tipps zeigen Ihnen, wie Sie Probleme mit Hook-Abhängigkeiten beseitigen

Ein sehr häufiges Szenario in react -Projekten: c...

Farbabstimmungstechniken und Effektdarstellung für Beauty- und Styling-Websites

Farbe ist eines der wichtigsten Elemente jeder We...

JavaScript Canvas zeichnet dynamische Drahtgittereffekte

In diesem Artikel wird der spezifische Code des d...

Detaillierter Prozessbericht der Nginx-Installation und -Konfiguration

Inhaltsverzeichnis 1 Einführung in nginx 1 Was is...

CentOS verwendet expect, um Skripte und Befehle remote in Stapeln auszuführen

Manchmal müssen wir Server stapelweise bedienen, ...