Vue implementiert die Anforderung des Ziehens und Ablegens dynamisch generierter Komponenten

Vue implementiert die Anforderung des Ziehens und Ablegens dynamisch generierter Komponenten

Produktanforderungen

Nach dem Meeting zu den Produktanforderungen stießen wir auf eine Anforderung. Zunächst war die Seite in zwei Spalten unterteilt, wobei die Datenkomponenten auf der linken Seite angezeigt wurden, Drag & Drop-Sortierung unterstützt wurde und das Löschen der Komponenten durch Klicken auf die Schaltfläche möglich war. Die rechte Seite unterstützt das Ziehen der Komponentenvorschau auf die linke Seite, um eine neue Komponente zu generieren.

Ideen

Bei dynamisch generierten Komponenten muss jedes Mal eine neue Komponente generiert werden, damit die Komponente in die Funktion eingefügt und zurückgegeben werden kann. Wenn Sie eine Funktion in JSX aufrufen, gibt jeder Aufruf der Funktion eine brandneue Komponente zurück. Mit React ist dies sehr einfach, mit Vue ist die direkte Rückgabe einer Komponente jedoch unmöglich. Obwohl diese Methode zum Zurückschreiben nicht für Vue geeignet ist, können wir nicht leugnen, dass die Idee sehr richtig ist. Daher sollten wir eine andere Schreibmethode in Betracht ziehen. Was dynamisch generierte Komponenten betrifft, müssen wir Daten verwenden, um die Generierung von Komponenten voranzutreiben. Zum Sortieren von Drag-Komponenten nutzen Sie einfach die Drag-Bibliothek! !

Probleme

  1. Bibliotheksauswahl ziehen
  2. So generieren Sie Komponenten
  3. Dynamische Generierung datengesteuerter Komponenten

Bibliotheksauswahl ziehen

Als Drag-Bibliothek habe ich Vue.Draggable gewählt, eine Drag-Bibliothek, die im Projekt vorhanden ist. Klicken Sie hier, um die Start-14,9 KB anzuzeigen, die ziemlich gut sind. Wenn Sie diese Drag-Bibliothek nicht in Ihrem Vue-Projekt verwenden, können Sie auf die Designideen in diesem Artikel zurückgreifen.

So generieren Sie Komponenten

Hier verwende ich Vue.extend(). Wenn Sie nicht sicher sind, wie Sie es verwenden sollen, lesen Sie bitte die offizielle Dokumentation, bevor Sie diesen Artikel Vue.extend lesen. Als Nächstes erstellen wir eine JS-Datei, um den Code zum Erstellen von Komponenten zu schreiben.

Komponenten generieren

/* generateComponents.js Dateiname */

importiere Vue von „vue“;

// Wenn Sie Komponenten dynamisch generieren möchten, importieren Sie zuerst diese Datei.
importiere Komponenten1 aus "./components/TestCom1.vue";
importiere Komponenten2 aus "./components/TestCom2.vue";

// Erstelle eine entsprechende Map zwischen dem Komponentennamen und der Komponente
const comMap = {
  Komponenten1,
  Komponenten2,
};

// Erhalten Sie den Komponentennamen, der zum Generieren der Komponente erforderlich ist, sowie die // Eigenschaften und Ereignisse, die Sie an die Komponente übergeben möchten const ReturnNewCom = function ({ props, on }) {
  Konstante {
    comItem: { name },
  } = Requisiten;
  const neueKomponente = Vue.extend({
    rendern(Element erstellen) {
      // Verwenden Sie den übergebenen Komponentennamen, um zu entscheiden, welche Komponente gerendert werden soll.
      returniere Element erstellen(comMap[Name], {
        Requisiten,
        An,
      });
    },
  });
  gibt eine neue neue Komponente zurück();
};

Standardmäßig ReturnNewCom exportieren;

Komponenten

Hier schreiben wir zwei Komponenten, um diese Demo zu demonstrieren, nämlich components1.vue und components2.vue.

/*Komponenten1.vue*/
<Vorlage>
  <div Klasse="Widget-Wrapper">
    <header class="header">{{ comDetail.name }}--{{ comDetail.id }}</header>
    <h1>Abfragebedingung: {{ queryObj }}</h1>
    <button @click="handleDelete">Löschen</button>
  </div>
</Vorlage>
<Skript>
Standard exportieren {
  Daten() {
    zurückkehren {
      comDetail: this.comItem,
      _queryObj: dieses.queryObj,
    };
  },
  Requisiten: {
    comItem: {
      Typ: Objekt,
      Standard() {
        zurückkehren {
          ID: 0,
          Name: "",
        };
      },
    },
    Abfrageobjekt: {
      //Kann die von der übergeordneten Komponente übergebenen Auswahlbedingungen empfangen, muss ein Objekt sein
      Typ: Objekt,
      Standard() {
        // Definieren Sie die Standardabfragebedingungen.
        zurückkehren {
          Zahl: 0,
        };
      },
    },
  },
  betrachten:
    comItem(Wert) {
      this.comDetail = Wert;
      Rückgabewert;
    },
    Abfrageobjekt(Wert) {
      this._queryObj = Wert;
      Rückgabewert;
    },
  },
  erstellt() {
    console.log("Daten -> dieses.comElement", dieses.comElement);
  },
  Methoden: {
    handleDelete() {
      //Komponentenmethode löschen this.$el.remove();
      // Rufen Sie die Funktion der übergeordneten Komponente auf. Ändern Sie die Daten des leftComList-Arrays in der übergeordneten Komponente.
      dies.$emit("handleDelete", this.comDetail);
    },
  },
};
</Skript>
<Stilbereich>
.widget-wrapper {
  Hintergrund: #ff7b7b;
  Rahmenradius: 12px;
  Überlauf: versteckt;
  Breite: 200px;
}
.header {
  Höhe: 50px;
  Polsterung: 0 15px;
}
</Stil>

Tatsächlich ähnelt der Code in der Datei components2.vue dem Code in der Datei components1.vue. Der einzige Unterschied ist die Hintergrundfarbe.

Datengetriebene Generierung dynamischer Komponenten

Als Nächstes müssen wir die Drag-Bibliothek Vue.Draggable verwenden, um Daten zu ziehen und zu ändern. Wir können direkt in die Datei App.vue schreiben.

/* App.vue */
<Vorlage>
  <div Klasse="dragCom">
    <h1>{{ leftComList }}</h1>
    <button @click="queryObj.num++">Abfragebedingungen ändern</button>
    <div Klasse="Körper">
      <div Klasse="links">
        <draggable Klasse="links" :Liste="leftComList" :Gruppe="'Personen'">
          <div
            ref="comBody"
            v-for="({ Name, ID }, Index) in leftComList"
            :Schlüssel="id"
            Klasse="comCard"
          >
            <!-- Durchlaufen Sie das leftComList-Array und verwenden Sie die Daten zum Rendern von Komponenten. 
            Fügen Sie diesem DOM-Element das dynamisch generierte Array hinzu. -->
            {{
              handleAddCom({
                Requisiten: { comItem: { Name, ID }, queryObj },
                Index,
              })
            }}
          </div>
        </ziehbar>
      </div>
      <div Klasse="rechts">
        <ziehbar
          Klasse="DragArea"
          :list="rechteComList"
          :Gruppe="{ Name: 'Leute', Pull: 'Klon', Put: false }"
          :Klon="HandleKlonhund"
        >
          <div Klasse="Karte" v-for="Element in rightComList" :key="element.id">
            {{ element.name }}
          </div>
          <!-- Die Kartendaten auf der rechten Seite, der Name im Array-Objekt rightComList entspricht generateComponents.js
          Attribute in ComMap in -->
        </ziehbar>
      </div>
    </div>
  </div>
</Vorlage>

<Skript>
importiere ziehbares Objekt aus „vuedraggable“;
importiere CreateCom aus "./generateComponents";
Standard exportieren {
  Komponenten:
    ziehbar,
  },
  Daten() {
    zurückkehren {
      rechteComList: [
        {
          Ich würde: Math.random(),
          Name: "Komponenten1",
        },
        {
          Ich würde: Math.random(),
          Name: "Komponenten2",
        },
      ],
      leftComList: [], //Speichert Daten, die dynamisch generierte Komponenten steuern.
      comMap: new Map(), // Die Hauptfunktion besteht darin, aufzuzeichnen, ob die Komponente in das DOM der Klasse „comCard“ gerendert wird.
      // Nach dem Rendern können keine weiteren untergeordneten Elemente hinzugefügt werden.
      Abfrageobjekt: {
        // Die Hauptfunktion besteht darin, Abfragebedingungen an Unterkomponenten zu übergeben. Nummer: 0,
      },
    };
  },
  vorZerstören() {
    // Aufgezeichnete Daten löschen this.comMap.clear();
  },
  Methoden: {
    handleAddCom({ index, on = {}, props = { comItem: { name: "", id: 0 } } }) {
      Konstante {
        comItem: { id },
      } = Requisiten;
      dies.$nextTick(() => {
        // Länge der untergeordneten Knoten dieses Knotens abrufen const childNodesLength = this.$refs.comBody[index].childNodes.length;
        // Länge des DOM-Arrays comBody abrufen const comLine = this.$refs.comBody.length;
        wenn (!this.comMap.get(id)) {
          // Wenn die Komponente nicht gerendert wurde // 1. Rufen Sie die Methode CreateCom auf, um die Komponente zu erstellen. Und übergeben Sie Props und Events const com = CreateCom({
            Requisiten,
            An: {
              handleDelete: this.handleDeleteCom,
              ...An,
            },
          });
          // 2. Komponente com.$mount() generieren;
          wenn (childNodesLength === 2) {
            // Wenn Sie es zwischen zwei Komponenten hinzufügen möchten. Ändern Sie dann die DOM-Position der neu generierten Komponente und platzieren Sie sie in der Mitte.
            // Fügen Sie das endgültige Komponenten-DOM an der richtigen Stelle hinzu this.$refs.comBody.splice(
              Index,
              0,
              dies.$refs.comBody[comLine - 1]
            );
          }
          // 3. Fügen Sie die generierte Komponente zum DOM hinzu.
          dies.$refs.comBody[index].appendChild(com.$el);
          // 4. Notieren Sie, dass die Komponente Rendering implementiert.
          this.comMap.set(id, wahr);
        } anders {
          // Die Komponente an dieser Position wurde gerendert, kein erneutes Rendern nötig, einfach zurückkehren;
        }
      });
    },
    handleDeleteCom({ id }) {
      // Die an die untergeordnete Komponente übergebene Methode zum Löschen von Daten entsprechend der Komponenten-ID const index = this.leftComList.findIndex((item) => item.id === id);
      wenn (~index) {
        // Falls eine Komponente mit dieser ID existiert, löschen Sie sie this.leftComList.splice(index, 1);
      }
    },
    handleCloneDog(Artikel) {
      // Daten zum leftComList-Array hinzufügen return {
        ...Artikel,
        Ich würde: Math.random(),
      };
    },
  },
};
</Skript>

<Stil>
.dragCom {
  Schriftfamilie: Avenir, Helvetica, Arial, serifenlos;
  -webkit-font-smoothing: Kantenglättung;
  -moz-osx-font-smoothing: Graustufen;
  Textausrichtung: zentriert;
  Farbe: #2c3e50;
  Rand oben: 60px;
}
.Körper {
  Breite: 100 %;
  Höhe: 800px;
  Anzeige: Flex;
  Inhalt ausrichten: Abstand dazwischen;
}
.links {
  biegen: 1;
  Höhe: 800px;
  Rand: 1px durchgehend rosa;
}
.Rechts {
  Breite: 20 %;
  Höhe: 800px;
}
.Karte {
  Höhe: 50px;
  Hintergrundfarbe: #40cec7;
  Rand: 12px 0;
  Schriftgröße: 12px;
  Zeilenhöhe: 50px;
  Cursor: Zeiger;
}
.comCard {
  Rand: 12px;
  Anzeige: Inline-Block;
}
</Stil>


Dadurch wird eine dynamische Komponentendarstellung und Drag-Sortierung erreicht.

Wirkung

Quellcode

Studenten, die es ausprobieren möchten, können den Quellcode dieses Artikels von GitHub herunterladen.

Oben finden Sie den detaillierten Inhalt der Anforderungen von Vue zum Ziehen und dynamischen Generieren von Komponenten. Weitere Informationen zum Ziehen und dynamischen Generieren von Komponenten von Vue finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung zur Verwendung von Vue Smooth DnD, einer verschiebbaren Komponente von Vue
  • Vue Drag-Komponente Vuedraggable API-Optionen zum gegenseitigen Ziehen und Sortieren zwischen Boxen
  • Vue-Drag-Komponentenliste zum Realisieren einer dynamischen Seitenkonfigurationsfunktion
  • Detaillierte Erklärung zur Verwendung der Vue-Drag-Komponente
  • Detaillierte Erläuterung des Vue-Drag-Komponenten-Entwicklungsbeispiels
  • Vue verwendet Split, um die universelle Drag-and-Slide-Partitionspanel-Komponente zu kapseln
  • Vue entwickelt eine Drag-Fortschrittsbalken-Schiebekomponente
  • vue draggable resizable realisiert die Komponentenfunktion der draggable-Skalierung
  • Verwenden Sie die Vue-Draggable-Komponente, um die Drag & Drop-Sortierung von Tabelleninhalten im Vue-Projekt zu implementieren
  • Die Vue-Komponente Draggable implementiert die Drag-Funktion
  • So implementieren Sie verschiebbare Komponenten in Vue

<<:  So starten Sie mehrere MySQL-Instanzen in CentOS 7.0 (mysql-5.7.21)

>>:  So erstellen Sie Gitlab auf CentOS6

Artikel empfehlen

Containerisierungstransformation für Docker-Großprojekte

Virtualisierung und Containerisierung sind zwei u...

Mehrere Möglichkeiten zum Aktualisieren von Batches in MySQL

Normalerweise verwenden wir die folgende SQL-Anwe...

Die Verwendung von FrameLayout in sechs Layouts

Vorwort In der letzten Ausgabe haben wir Ihnen Li...

So löschen Sie die Hintergrundfarbe des A-Tags, wenn in H5 darauf geklickt wird

1. Die blaue Farbe des Tags wird aufgehoben, wenn...

Ein Artikel, der Ihnen HTML beibringt

Wenn Sie nicht unbedingt Künstler werden möchten,...

Beispielcode mit SCSS in Uni-App

Aufgetroffene Fallstricke Ich habe den ganzen Nac...

Beispiel für die Verwendung des Nginx-Reverse-Proxys für Go-FastDFS

Hintergrund go-fastdfs ist ein verteiltes Dateisy...

Analyse von Multithread-Programmierbeispielen unter Linux

1 Einleitung Die Thread-Technologie wurde bereits...

Beispielcode zur Implementierung von Follow Ads mit JavaScript

Floating Ads sind eine sehr verbreitete Form der ...

Die Verwendung und der Unterschied zwischen JavaScript-Pseudo-Array und Array

Pseudo-Arrays und Arrays In JavaScript sind mit A...