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

Probleme und Lösungen für MYSQL5.7.17-Verbindungsfehler unter MAC

Das Problem, dass MYSQL5.7.17 unter MAC keine Ver...

Quellcode der HTML-Einstellungen für die Benutzerregistrierungsseite

Gestalten Sie die oben gezeigte Webseite: <!DOC...

So installieren und konfigurieren Sie einen FTP-Server in CentOS8.0

Nach der Veröffentlichung von CentOS8.0-1905 habe...

CSS- und HTML- und Front-End-Technologie-Schichtendiagramm

Die Beziehung zwischen Javascript und DOM ist seh...

Prozessdiagramm zum Aufbau des Linux RabbitMQ-Clusters

1. Allgemeine Schritte Zu Beginn haben wir die In...

7 native JS-Fehlertypen, die Sie kennen sollten

Inhaltsverzeichnis Überblick 1. Bereichsfehler 2....

Detailliertes Tutorial zur Installation von Protobuf 3 unter Ubuntu

Wann ist die Installation durchzuführen? Wenn Sie...

CSS transparenter Rahmen Hintergrund-Clip-Magie

In diesem Artikel wird hauptsächlich die wunderba...

js, um den Popup-Effekt zu erzielen

In diesem Artikelbeispiel wird der spezifische Co...

So laden Sie Projekte im Linux-System in die Code Cloud hoch

Erstellen Sie ein neues Projekt test1 auf Code Cl...

So zeigen Sie laufende Hintergrundprogramme in Linux an und beenden sie

Linux-Taskverwaltung - Ausführung und Beendigung ...

Stimmt es, dass der Webdesign-Stil umso besser ist, je einfacher er ist?

Ursprüngliche Adresse: http://www.webdesignfromsc...