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

Ein genauerer Blick auf SQL-Injection

1. Was ist SQL-Injection? SQL-Injection ist eine ...

So implementieren Sie Leerzeichen in Taobao mit CSS3

Machen Sie einen leeren Bereich für Taobao: Wenn ...

Installieren Sie Ubuntu 18 ohne USB-Laufwerk unter Windows 10 mit EasyUEFI

1. BIOS überprüfen Überprüfen Sie zunächst, in we...

Mysql behält den vorhandenen Inhalt bei und fügt später Inhalte hinzu

Dieser Befehl ändert die Datentabelle ff_vod und ...

Ein mobiler adaptiver Webseiteneffekt löst das Problem der kleinen Anzeigeseite

Für die Arbeit muss ich einen adaptiven Webseitene...

Zusammenfassung der 10 wichtigsten JavaScript-Interviewfragen (empfohlen)

1.Dies deutet auf 1. Wer ruft wen an? Beispiel: F...

Beheben Sie den Fehler während der Verbindungsausnahme in Docker

Wenn Sie Docker zum ersten Mal verwenden, werden ...

Häufige JavaScript-Speicherfehler und Lösungen

Inhaltsverzeichnis 1. Zeitüberwachung 2. Ereignis...