Vue verwendet Drag & Drop, um einen Strukturbaum zu erstellen

Vue verwendet Drag & Drop, um einen Strukturbaum zu erstellen

In diesem Artikelbeispiel wird der spezifische Code von Vue mithilfe von Drag & Drop geteilt, um einen Strukturbaum zu Ihrer Referenz zu erstellen. Der spezifische Inhalt ist wie folgt

Ziehen Sie die Knoten im gepunkteten Feld auf der Seite, um einen nach rechts gerichteten Strukturbaum zu erstellen, wie unten gezeigt.

Ideen zur Umsetzung festhalten:

vueTree.vue

<Vorlage>
  <div Klasse="Container">
    <div Klasse="Knoten-Container">
      <div v-for="(Element, Index) in Knotenliste"
           :Schlüssel="Index"
           Klasse="Quellknoten"
           ziehbar="true"
           @dragstart="dragStart(Element)">
        {{ Artikel }}
      </div>
    </div>
    <div Klasse="Baumcontainer"
         @dragover="erlaubenAblegen"
         @drop="handleDrop">
      <Baumknoten v-if="Knotendaten"
                 ref="Knoten"
                 :nodeData="nodeData"
                 @delete-node="Baum löschen" />
    </div>
  </div>
</Vorlage>
<Skript>
importiere TreeNode aus './treeNode.vue'
importiere { Node } aus './config.js'
Standard exportieren {
  Name: "vue-tree",
  Komponenten:
    Baumknoten
  },
  // Abkömmlinge können keine Knotendaten abrufen, das heißt, sie können keine Knoten unabhängig voneinander erstellen. Daher wird die Knotenerstellungsmethode des Vorgängerknotens den Abkömmlingen bereitgestellt () {
    zurückkehren {
      Knoten erstellen: dieser.Knoten erstellen
    }
  },
  Daten () {
    zurückkehren {
      Knotenliste: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'],
      aktueller Knoten: null,
      nodeData: null
    }
  },
  Methoden: {
    // Ziehen beginnen und Knotendaten abrufen dragStart (item) {
      this.currNode = Element
    },
    // Wenn der Stammknoten nicht generiert wird, ist Ziehen zulässigallowDrop (Ereignis) {
      wenn (!this.nodeData) {
        Ereignis.preventDefault()
      }
    },
    //Ziehen endet, generieren Knoten handleDrop () {
      wenn (!this.nodeData) {
        dies.nodeData = dies.createNode()
      }
    },
    Knoten erstellen () {
      let node = neuer Knoten(dieser.aktuellerKnoten)
      Rückgabeknoten
    },
    // Lösche den Wurzelknoten und lösche den gesamten Baum deleteTree () {
      this.nodeData = null
    }
  }
}
</Skript>
<style lang="scss" scoped>
.container {
  Polsterung: 20px;
  Breite: berechnet (100 % – 40 Pixel);
  Höhe: berechnet (100 % – 40 Pixel);
  .Knotencontainer {
    Höhe: 100px;
    Rand: 1px gestrichelt rot;
    Anzeige: Flex;
    .Quellknoten {
      Breite: 50px;
      Höhe: 30px;
      Hintergrund: #fff;
      Rand: 1px durchgehend blau;
      Textausrichtung: zentriert;
      Zeilenhöhe: 30px;
      Rand: 10px;
      Cursor: Zeiger;
    }
  }
  .Baumcontainer {
    Höhe: berechnet (100 % – 122 Pixel);
    Rand oben: 20px;
  }
}
</Stil>

Konfiguration, js

Exportklasse Node{
  Konstruktor(Name){
    dieser.name = Name,
    dies.Kinder = []
  }
}

treeNode.vue

<Vorlage>
  <!-- 
    Struktur: Die äußerste Schicht ist die innere Knotenebene. Jede innere Knotenebene enthält einen Knoten und eine Knotenbox. Der Knoten speichert den aktuellen Knoten und die Knotenbox speichert alle untergeordneten Knoten des aktuellen Knotens. Wenn der aktuelle Knoten mehrere untergeordnete Knoten hat, gibt es in der Knotenbox mehrere Knoteneingänge und so weiter.
        <Knoten></Knoten>
        <Knotenbox>
          <innerer Knoten>
            <Knoten></Knoten>
            <Knotenbox>…</Knotenbox>
          </node-inner>
          <innerer Knoten>
            <Knoten></Knoten>
            <Knotenbox>…</Knotenbox>
          </node-inner>
          ...
        </Knotenbox>
      </node-inner>
   -->
  <div Klasse="node-inner">
    <div Klasse="Knoten"
         :Klasse="{ 'drag-over-node': isDragover }"
         @dragover="Überziehen"
         @dragleave="ziehenVerlassen"
         @drop="nodeDrop">
      <span class="name">{{nodeData.name}}</span>
      <span Klasse="del"
            @click="deleteNode">Löschen</span>
    </div>
    <div v-show="nodeData.children.length > 0"
         Klasse="Knotenbox">
      <tree-node v-for="(Element, Index) in nodeData.children"
                 :Schlüssel="Index"
                 :nodeData="Element"
                 @delete-node="Untergeordnetes Element löschen(index)" />
    </div>
  </div>
</Vorlage>
<Skript>
Standard exportieren {
  Name: 'Baumknoten',
  Requisiten: {
    KnotenDaten: {
      Typ: Objekt,
      Standard: () => { }
    }
  },
  // Die vom Vorgängerknoten übergebenen Daten abrufen inject: ['createNode'],
  Daten () {
    zurückkehren {
      isDragover: false
    }
  },
  Methoden: {
    // Der Knoten erlaubt Ziehen, um untergeordnete Knoten hinzuzufügen dragOver (Ereignis) {
      Ereignis.preventDefault()
      wenn (!this.isDragover) {
        this.isDragover = true
      }
    },
    ziehenHinterlassen() {
      wenn (dies.istDragover) {
        this.isDragover = falsch
      }
    },
    // Dem Knoten untergeordnete Knoten hinzufügen nodeDrop () {
      Knoten = this.createNode()
      dies.nodeData.children.push(Knoten)
      this.isDragover = falsch
    },
    // Den aktuellen Knoten löschen, was im Wesentlichen bedeutet, ihn an den übergeordneten Knoten zu übergeben, um den untergeordneten Knoten zu löschen deleteNode () {
      dies.$emit("Knoten löschen")
    },
    // Erhalte die Anweisung zum Löschen des untergeordneten Knotens und führe die Löschfunktion aus deleteChild (index) {
      dies.nodeData.children.splice(index, 1)
    }
  }
}
</Skript>
<style lang="scss" scoped>
.Knoten {
  Rand: 1px durchgehend orange;
  Rahmenradius: 4px;
  Position: relativ;
  Anzeige: Inline-Flex;
  Elemente ausrichten: zentrieren;
  Inhalt ausrichten: Abstand dazwischen;
  Hintergrundfarbe: #fff;
  Höhe: 36px;
  Polsterung: 0 12px 0 16px;
  Zeilenhöhe: 36px;
  Rand unten: 10px;
  .Name {
    Schriftgröße: 16px;
    Rand rechts: 12px;
  }
  .del {
    Farbe: rot;
    Schriftgröße: 12px;
    Cursor: Zeiger;
  }
  &.über-Knoten ziehen {
    Kastenschatten: 6px 6px 12px rgba (106, 20, 134, 0,15);
  }
}
.Knotenbox {
  Anzeige: Inline-Flex;
  Flex-Richtung: Spalte;
  .node-inner {
    Rand links: 80px;
    // Verbinde die vertikalen Balken&:not(:last-child):before {
      Position: absolut;
      links: -70px;
      oben: 22px;
      Rand: 1px durchgehend orange;
      Inhalt: "";
      Breite: 8px;
      Hintergrundfarbe: #fff;
      Farbe des unteren Rahmens: #fff;
      Höhe: 100%;
      Farbe des oberen Rahmens: #fff;
      Z-Index: 3;
    }
    // Horizontalen Balken verbinden&:after {
      links: -61px;
      Breite: 60px;
      Inhalt: "";
      Position: absolut;
      oben: 14px;
      Höhe: 8px;
      Rand: 1px durchgehend orange;
      Inhalt: "";
      Hintergrundfarbe: #fff;
      Rahmenfarbe rechts: #fff;
      Rahmenfarbe links: #fff;
      Z-Index: 3;
    }
    // Der letzte vertikale Balken hat eine abgerundete Ecke &:nth-last-child(2):before {
      Rahmen unten links – Radius: 6px;
      Farbe der unteren Umrandung: orange;
    }
    // Der erste horizontale Balken wird erweitert &:first-child:after {
      links: -81px;
      Breite: 80px;
      Z-Index: 2;
    }
  }
}
.node-inner {
  Position: relativ;
}
</Stil>

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Beispiels einer verschiebbaren Baumtabelle basierend auf Vue

<<:  Zwei Möglichkeiten zum Beenden von Bash im Docker-Container unter Linux

>>:  Analyse des Sperrmechanismus der MySQL-Datenbank

Artikel empfehlen

Manuelle und geplante Sicherungsschritte für die MySQL-Datenbank

Inhaltsverzeichnis Manuelle Sicherung Timer-Siche...

JS-Code zum Erzielen eines Seitenwechseleffekts

In diesem Artikelbeispiel wird der spezifische Co...

img usemap Attribut China Karte Link

HTML-img-Tag: definiert ein Bild, das in eine Webs...

So implementieren Sie verschiebbare Komponenten in Vue

In diesem Artikel erfahren Sie, wie Sie ziehbare ...

Detaillierte Schritte zur Installation von mysql5.7.18 auf dem Mac

1. Werkzeuge Wir benötigen jetzt zwei Tools: MySQ...

...

Detailliertes Tutorial zur Installation von Hbase 2.3.5 auf Vmware + Ubuntu18.04

Vorwort Im vorherigen Artikel wurde Hadoop instal...

Grundlegendes Verständnis und Verwendung der HTML-Auswahloption

Detaillierte Erklärung von HTML (Option auswählen)...

mysql installer community 8.0.12.0 grafische anleitung zur installation

Dieses Tutorial beschreibt die Installation der M...