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

Detaillierte Erklärung zum Erstellen eines Arrays in JavaScript

Inhaltsverzeichnis Erstellen von Arrays in JavaSc...

Eine Zusammenfassung der Gründe, warum MySQL keinen Datumsfeldindex verwendet

Inhaltsverzeichnis Hintergrund erkunden Zusammenf...

Installation von Docker CE auf Ubuntu

Dieser Artikel dient zur Aufzeichnung der Install...

Webdesign-Erfahrung: Effizientes Schreiben von Webcode

Ursprünglich sollte dieses siebte Kapitel eine aus...

Eine kurze Diskussion über 12 klassische Probleme in Angular

Inhaltsverzeichnis 1. Erklären Sie bitte, was die...

WeChat-Applet zur Bestimmung, ob die Mobiltelefonnummer legal ist Beispielcode

Inhaltsverzeichnis Szenario Wirkung Code Zusammen...

MySQL-Optimierung Verbindungsoptimierung

Im Artikel MySQL-Optimierung: Cache-Optimierung w...

JavaScript zur Implementierung eines einfachen Einkaufsformulars

In diesem Artikel wird der spezifische JavaScript...

Lassen Sie uns über das v-on-Parameterproblem in Vue sprechen

Verwendung von v-on:clock in Vue Ich lerne derzei...

Detaillierte Erklärung des Overflow-Scrollens zur Lösung des Scroll-Lag-Problems

Vorwort Wenn Sie das Attribut „overflow: scroll“ ...