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

So stellen Sie ein Linux-System automatisch mit PXE bereit

Inhaltsverzeichnis Hintergrund DHCP konfigurieren...

Beispielcode zum Bereitstellen von ELK mit Docker-Compose

Umfeld Host-IP 192.168.0.9 Docker-Version 19.03.2...

VUE realisiert Registrierungs- und Login-Effekte

In diesem Artikelbeispiel wird der spezifische Co...

Was macht die MySQL-Datenbank?

MySQL ist ein relationales Datenbankverwaltungssy...

Einführung in MySQL-Isolationsebene, Sperre und MVCC

Ziel dieses Artikels ist es, die Beziehung zwisch...

Besprechen Sie die Anwendung von Mixin in Vue

Mixins bieten eine sehr flexible Möglichkeit, wie...

MySQL Deep Paging (wie man schnell Millionen von Daten paginiert)

Inhaltsverzeichnis Vorwort Fall Optimierung Zusam...

Detaillierte Erläuterung der Fallstricke des Nginx-Proxy-Socket.io-Dienstes

Inhaltsverzeichnis Nginx fungiert als Proxy für z...

Vue implementiert die Drag & Drop-Funktion für Bilder

In diesem Artikelbeispiel wird der spezifische Co...