ProduktanforderungenNach 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. IdeenBei 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
Bibliotheksauswahl ziehenAls 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 KomponentenHier 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; KomponentenHier 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 KomponentenAls 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 QuellcodeStudenten, 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:
|
<<: So starten Sie mehrere MySQL-Instanzen in CentOS 7.0 (mysql-5.7.21)
>>: So erstellen Sie Gitlab auf CentOS6
transformieren und übersetzen Transformieren bezi...
Die Lösung für das Problem, dass Ubuntu 18.04 in ...
Virtualisierung und Containerisierung sind zwei u...
Normalerweise verwenden wir die folgende SQL-Anwe...
Vorwort In der letzten Ausgabe haben wir Ihnen Li...
1. Die blaue Farbe des Tags wird aufgehoben, wenn...
Um die Unterstreichung eines Hyperlinks zu entfern...
Wenn Sie nicht unbedingt Künstler werden möchten,...
Aufgetroffene Fallstricke Ich habe den ganzen Nac...
Hintergrund go-fastdfs ist ein verteiltes Dateisy...
Dieser Artikel stellt kurz die Beziehung zwischen...
1 Einleitung Die Thread-Technologie wurde bereits...
Floating Ads sind eine sehr verbreitete Form der ...
Update: Jetzt können Sie auf die offizielle MySQL...
Pseudo-Arrays und Arrays In JavaScript sind mit A...