Vue implementiert Drag & Drop für mehrspaltiges Layout

Vue implementiert Drag & Drop für mehrspaltiges Layout

In diesem Artikel wird der spezifische Code von Vue zur Implementierung des Ziehens von mehrspaltigen Layouts zu Ihrer Information bereitgestellt. Der spezifische Inhalt ist wie folgt

1. Ziele

Vue implementiert freies Ziehen und Ändern der Breite mehrerer Boxen (Benutzer entscheiden anhand tatsächlicher Szenarien über die Anzahl der Boxen).

2. Anwendungsszenarien

Mehrspaltiges Layout mit frei verschiebbarer Breite.

Der typischste Fall: Editor (z. B. vscode, idea usw.)

Komponentendesign

Da die Anzahl der Boxen dieser Komponente ungewiss ist, haben wir uns beim Entwurf der Komponente an dem Design von Form und FormItem in Vuetify orientiert. Das heißt, die äußere große Box verarbeitet die verteilten Drag-Ereignisse und die innere Box ist für die Anzeige des Inhalts jedes Elements verantwortlich.

Durch die Komponentenkonstruktion werden folgende Ziele erreicht:

<drag-box style="Breite: 100 %; Höhe: 100 %;">
   <drag-item>Element1</drag-item>
   <drag-item>Element2</drag-item>
   <drag-item>Element3</drag-item>
   <drag-item>Element4</drag-item>
</Drag-Box>

4. Umsetzung

4.1 statische DragBox-Seite

(Die Verschachtelung von Unterelementen wird durch Schlitze erreicht)

<Vorlage>
    <div ref='dragBox' style='Anzeige: flex; Breite: 100 %; Höhe: 100 %;'>
        <Steckplatz></Steckplatz>
    </div>
</Vorlage>

4.2 DragItem-Seite

(Die Verschachtelung interner Drag-Item-Elemente wird durch Slots erreicht)

<Vorlage>
    <div ref="Container" Klasse="d-flex" Stil="min-width: 200px; Position: relativ;">
        <div style="Breite: 100 %; Höhe: 100 %;">
            <slot>Standardinformationen</slot>
        </div>
  <!-- Zugleiste -->
        <div v-if="Größe ändernAnzeigen" class="Größe ändern" />
    </div>
</Vorlage>
<Skript>
Standard exportieren {
  Requisiten: {
  // Steuert, ob die Ziehleiste angezeigt wird. Standardmäßig wird resizeShow: { angezeigt.
      Typ: Boolean,
      Standard: true
    }
  }
}
</Skript>
<Stil>
.Größe ändern {
    Position: absolut;
    oben: 0;
    rechts: 0;
    Breite: 4px;
    Höhe: 100%;
    Cursor: Spaltengröße ändern;
    Hintergrundfarbe: #d6d6d6;
}
</Stil>

4.3 Drag-Logik

Die Drag-Logik sollte von dragBox und nicht von dragItem gehandhabt werden.

4.3.1 Vor der Implementierung des Ziehens sollten untergeordnete Elemente (z. B. DragItem) richtig angeordnet werden.

Wenn der Benutzer dem DragItem keine Anfangsbreite zuweist , wird der Standardwert „flex:1“ verwendet (der verbleibende Platz wird gleichmäßig verteilt). Die konkrete Logik lautet wie folgt:

 // Wenn dragItem keine Breite definiert, flex=1
    setDragItemFlex () {
      const dragBox = this.$refs.dragBox
      const childrenLen = dragBox.children.length

      für (sei i = 0; i < Kinderlänge; i++) {
        const node = dragBox.Kinder[i]
        wenn (!node.style.width) {
          // Wenn die Breite nicht definiert ist, ist Flex=1
          node.style.flex = 1
        }
      }
    },

4.3.2 Drag & Drop-Implementierungslogik

Für die Drag-Leiste jedes DragItems sollten Drag-Ereignisse hinzugefügt werden. Das vollständige Ziehereignis umfasst: Drücken der Maus, Bewegen der Maus und Anheben der Maus (Ende des Ziehens).

Schleife, um Ereignisse für jeden Drag Bar hinzuzufügen:

dragControllerDiv () {
  const resize = document.getElementsByClassName('resize') // Drag Bar // Schleife zum Hinzufügen von Ereignissen für jede Drag Bar for (let i = 0; i < resize.length; i++) {
    // Mausklick-Ereignis resize[i].addEventListener('mousedown', this.onMouseDown)
  }
},

Logik beim Mausklick: Rufen Sie die Anfangsposition der Maus ab, ändern Sie die Farbe der Ziehleiste und fügen Sie Listener-Ereignisse für Bewegung und Aufwärtsbewegung hinzu.

beiMausDrücken (e) {
  diese.resizeBox = e.target
  this.currentBox = this.resizeBox.parentNode // Aktuelle Box this.rightBox = this.getNextElement(this.currentBox) // Nächster Geschwisterknoten der aktuellen Box if (!this.rightBox) return
  this.curLen = this.currentBox.clientWidth
  this.otherBoxWidth = this.$refs.dragBox.clientWidth - this.currentBox.clientWidth - this.rightBox.clientWidth // Breite anderer Boxen // Erinnerung an Farbänderung this.resizeBox.style.background = '#818181'
  this.startX = e.clientX
  document.addEventListener('Mausbewegung', this.onMousemove)
  document.addEventListener('mouseup', this.onMouseup)
},

// Hole das nächste Geschwisterelement kompatible Funktion getNextElement (Element) {
  wenn (element.nächstesElementGeschwister) {
    returniere element.nextElementSibling
  } anders {
    var next = element.nextSibling // Nächster Geschwisterknoten while (next && next.nodeType !== 1) { // Er existiert, aber es ist nicht das, was ich will next = next.nextSibling
    }
    Zurück Weiter
  }
}

Mausbewegungsereignis: Berechnen und Festlegen der Breite des aktuellen Felds und des rechten Felds.

beiMausbewegung (e) {
  const endX = e.clientX
  const moveLen = endX - this.startX // (endx-startx) = Bewegungsdistanz const CurBoxLen = this.curLen + moveLen // resize[i].left + Bewegungsdistanz = endgültige Breite des linken Bereichs const rightBoxLen = this.$refs.dragBox.clientWidth - CurBoxLen - this.otherBoxWidth // Rechte Breite = Gesamtbreite - linke Breite - Breite der anderen Box // Wenn die Mindestbreite erreicht ist, ist Ziehen nicht verfügbar if (CurBoxLen <= 200 || rightBoxLen <= 200) return
  this.currentBox.style.width = CurBoxLen + 'px' // Aktuelle Boxbreite this.resizeBox.style.left = CurBoxLen // Breite des linken Bereichs festlegen this.rightBox.style.width = rightBoxLen + 'px'
},

Mouse-Up-Ereignis: Zerstört Mousedown- und Mousemove-Ereignisse; stellt die Farbe der Drag-Bar wieder her.

bei Mauszeiger hoch () {
 // Farbwiederherstellung this.resizeBox.style.background = '#d6d6d6'
 document.removeEventListener('mousedown', this.onMouseDown)
 document.removeEventListener('Mausbewegung', this.onMousemove)
},

Fügen Sie der gemounteten Hook-Funktion entsprechende Ereignisse hinzu.

montiert () {
  dies.setDragItemFlex()
  dies.dragControllerDiv()
},

Importieren und registrieren Sie die Komponente:

<Vorlage>
  <div id="app" style="Breite: 100 %; Höhe: 100vh; Rahmen: 1px durchgezogen #ccc;">
    <drag-box style="Breite: 100 %; Höhe: 100 %;">
      <drag-item style="width: 20%;">Artikel1</drag-item>
      <drag-item>Element2</drag-item>
      <drag-item style="width: 20%;" :resizeShow='false'>Artikel3</drag-item>
    </Drag-Box>
  </div>
</Vorlage>

<Skript>
importiere {DragBox, DragItem} aus './components/dragLayouter'

Standard exportieren {
  Name: "App",
  Komponenten:
    Ziehen Sie die Box,
    Ziehen Sie ein Element
  }
}
</Skript>

5. Ergebnisse der Operation

Der konkrete Stil kann später noch geändert werden.

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:
  • Vue3.0 verwendet das Plug-In vue-grid-layout, um Drag-Layout zu implementieren
  • Implementierung einer verschiebbaren Komponente zum Teilen des linken und rechten Bedienfelds in Vue3
  • Implementierung der Vue-Codeaufteilung (Codesplit)
  • Vue implementiert Drag-and-Drop-Split-Layout

<<:  Bringen Sie Ihnen bei, wie Sie einen Tencent Cloud Server erstellen (grafisches Tutorial)

>>:  So überprüfen Sie, ob MySQL erfolgreich installiert wurde

Artikel empfehlen

MySQL: Praktische Erfahrung mit der Verwendung der Insert-Anweisung

Inhaltsverzeichnis 1. Mehrere Syntaxen von Insert...

Der Unterschied zwischen redundanten und doppelten Indizes in MySQL

MySQL ermöglicht das Erstellen mehrerer Indizes f...

CentOS8-Installationstutorial für JDK8/Java8 (empfohlen)

Vorwort Zuerst wollte ich es mit wget auf CentOS8...

Detaillierte Einführungshinweise zu Vue

Inhaltsverzeichnis 1. Einleitung 2. Erster Eindru...

MariaDB unter Linux startet mit dem Root-Benutzer (empfohlen)

Da ich Sicherheitsprodukte testen musste, wollte ...

Zusammenfassung und Analyse häufig verwendeter Docker-Befehle und Beispiele

Inhalt 1. Container-Lebenszyklusmanagement (1) Do...

CSS3 realisiert den Effekt der kontinuierlichen Dreiecksvergrößerung

1. CSS3-Dreieck vergrößert weiterhin Spezialeffek...

Detailliertes Tutorial zur Installation von ElasticSearch 6.4.1 auf CentOS7

1. Laden Sie das ElasticSearch 6.4.1-Installation...

MySQL Community Server 5.7.19 Installationshandbuch (detailliert)

Link zum Download der ZIP-Datei auf der offiziell...

Detaillierte Erklärung des this-Zeigeproblems in JavaScript

Zusammenfassen Globale Umgebung ➡️ Fenster Normal...

JS implementiert Städtelisteneffekt basierend auf VUE-Komponente

In diesem Artikelbeispiel wird der spezifische Co...

Einführung in die Funktionen und Verwendung von Wert- und Namensattributen in HTML

1. Der in der Schaltfläche verwendete Wert bezieht...