Vue3.0 verwendet das Plug-In vue-grid-layout, um Drag-Layout zu implementieren

Vue3.0 verwendet das Plug-In vue-grid-layout, um Drag-Layout zu implementieren

1. Plugins

Zunächst haben wir uns für das Plugin vue-grid-layout entschieden.

npm ich vue-grid-layout --speichern

Offizielle Website: https://jbaysolutions.github....

2. Zwischenspiel

Nach der Installation der Abhängigkeiten stellte ich fest, dass das Projekt gestartet werden konnte. Laut der offiziellen Website- demo war die Seite leer und die Konsole meldete, dass keine Unterkomponenten gefunden wurden.

Ändern Sie Ihre Denkweise und verwenden Sie globale Importkomponenten anstelle von lokalen Importkomponenten.

3. Umsetzung

const layout = ref<LayoutItem[]>([
      { x: 0, y: 0, w: 1, h: 1, i: 0 },
      { x: 1, y: 0, w: 2, h: 1, i: 1 },
      { x: 0, y: 1, w: 2, h: 1, i: 2 },
      { x: 0, y: 2, w: 3, h: 1, i: 3 },
      { x: 2, y: 1, w: 1, h: 1, i: 4 },
    ]);

    <Raster-Layout
      :layout="Layout"
      :Spaltennummer="3"
      :Zeilenhöhe="240"
      :ist-draggable="wahr"
      :ist größenveränderbar="true"
      :ist-gespiegelt="false"
      :maxRows="3"
      :vertical-compact="wahr"
      :Rand="[10, 10]"
      :use-css-transforms="wahr"
    >
      <Rasterelement
        v-for="Element im Layout"
        :x="Artikel.x"
        :y="Artikel.y"
        :w="Artikel.w"
        :h="Artikel.h"
        :i="Artikel.i"
        :Schlüssel="Artikel.i"
        @moved="beimElement verschoben"
      >{{ Element.i }}</grid-item>
    </Rasterlayout>

Wirkung:

Aber! !
Hier wird nach dem Ziehen nicht bestimmt, ob jede Zeile ausgefüllt ist, und einige Module werden nach dem Ziehen abgedeckt, was zu leeren Bereichen führt, wie unten gezeigt:

denken:

Wir müssen eine Prüfung hinzufügen, um zu sehen, ob jede Zeile vollständig ausgefüllt ist.

4. Verifizierungsfunktion

importiere { LayoutItem } aus '../types/index';
importiere { cloneDeep } von 'lodash'
/**
 * Überprüfen Sie, ob das Layout zulässig ist. * 1. Kopieren Sie das Array vollständig, um eine Verunreinigung des Original-Arrays zu vermeiden. * 2. Ermitteln Sie den Maximalwert von y für die Durchquerung. * 3. Holen Sie sich jedes y-Subarray und sortieren Sie es in aufsteigender Reihenfolge von x. * 4. Wenn die Arraylänge 1 beträgt, bestimmen Sie, ob w gleich dem maximalen x ist.
 * 5. Wenn die Länge des Arrays nicht 1 ist, durchlaufen Sie das Array, um zu bestimmen, ob das w jedes Elements gleich dem x des nächsten Elements ist. Akkumulieren Sie w, um zu bestimmen, ob die Summe gleich dem maximalen x ist.
 * 6. Wenn zulässig, geben Sie false zurück
 * @param-Liste 
 * @returns 
 */
export const verifyLayout = (Liste: Array<LayoutItem>): boolean => {
    yList = list.map(item => { return item.y });
    yList = yList.sort((a, b) => { return a - b });
    konsole.log(Liste);
    const newArr = cloneDeep(Liste);
    lass flag = false;
    const maxY = yList[yList.Länge - 1];
    Konstante maxX = 3;
    Konsole.log(maxY);
    für (sei i = 0; i <= maxY; i++) {
        lass arr = newArr.filter((item: LayoutItem) => {
            gibt Element.y === i zurück;
        });
        Konsole.log(arr, arr.Länge);
        wenn (arr && arr.length > 1) {
            console.log('Mehrere-------------------', i);
            lassen Sie calValue = 0;
            arr = arr.sort((a: Layoutelement, b: Layoutelement) => { return ax - bx })
            arr.forEach((childItem: LayoutItem, index: number) => {
                calValue += untergeordnetesItem.w;
                console.log('Kalkulationswert--------------', Kalkulationswert, Index);
                wenn (Index !== arr.Länge - 1 und calValue !== arr[Index + 1].x) {
                    Flagge = wahr;
                }
                wenn (index === arr.length - 1 und calValue !== maxX) {
                    Flagge = wahr;
                }
            })
        } anders {
            console.log('Es gibt nur einen------------------', i);
            wenn (arr[0].w !== maxX) {
                Flagge = wahr
            }
        }
    }
    Konsole.log(Flag);
    Flagge zurückgeben;
}

Die Idee ist mein Kommentar zur Funktion.
Überprüfen Sie die Rückruffunktion, nachdem jeder Drag abgeschlossen ist

    /**
     * Drag-Completion-Ereignis* 1. Speichern Sie die vorherigen Daten in den Verlaufsdaten* 2. Speichern Sie dann die Daten nach der Verschiebung in den Nowlayout-Daten*/
    const onItemMoved = () => {
      console.log('verschoben--------------------')
      historyDataList.value.push(cloneDeep(jetztLayoutData.value));
      jetztLayoutData.value = cloneDeep(layout.value);
      // const flag = verifyLayout(layout.value);
      // wenn (Flagge) {
      // geh zurück()
      // }
    };
    const goBack = () => {
      Konsole.log(historyDataList.value[historyDataList.value.length - 1]);
      layout.value = historyDataList.value[historyDataList.value.length - 1];
      jetztLayoutData.value = cloneDeep(layout.value);
      historyDataList.value.pop();
    }


Auf diese Weise führen wir bei jedem Ziehen und Ablegen, wenn die Überprüfung nicht zulässig ist, ein Rollback durch, um sicherzustellen, dass jede Zeile ausgefüllt ist! ! ! !

Dies ist das Ende dieses Artikels über Vue3.0, das das Plug-In „vue-grid-layout“ verwendet, um Drag-and-Drop-Layouts zu implementieren. Weitere verwandte Vue3-Inhalte, die das Plug-In „vue-grid-layout“ verwenden, um Drag-and-Drop-Layoutinhalte zu implementieren, finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Vue implementiert Drag & Drop für mehrspaltiges Layout
  • 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

<<:  Einführung in semantische HTML-Tags

>>:  Zusammenfassung der Kompatibilitätsprobleme beim Flex-Layout

Artikel empfehlen

Beispielanalyse für MySQL-Transaktionen, Isolationsebenen und Sperrenverwendung

Dieser Artikel beschreibt anhand von Beispielen M...

JavaScript implementiert kreisförmiges Karussell

In diesem Artikel wird der spezifische JavaScript...

So verwenden Sie Webstorm und Chrome zum Debuggen von Vue-Projekten

Inhaltsverzeichnis Vorwort 1. Erstellen Sie ein n...

Ein kurzes Verständnis des Unterschieds zwischen MySQL Union All und Union

Union ist eine Vereinigungsoperation für die Date...

JavaScript-Verlaufsobjekt erklärt

Inhaltsverzeichnis 1. Routennavigation 2. API zur...

Schritte zum Erstellen eines Docker-Images mit Dockerfile

Dockerfile ist eine Textdatei, die Anweisungen en...

Spezifische Verwendung von Vues neuem Spielzeug VueUse

Inhaltsverzeichnis Vorwort Was ist VueUse Einfach...

Analyse des Parameterübertragungsprozesses des Treibermoduls in Linux

Deklarieren Sie den Parameternamen, den Typ und d...

Detaillierte Erklärung, wie MySQL (InnoDB) mit Deadlocks umgeht

1. Was ist ein Deadlock? Die offizielle Definitio...

Eine kurze Erläuterung der Syntax der VUE-Uni-App-Vorlage

1.v-bind (Abkürzung:) Um in Daten definierte Date...

Installation von CUDA10.0 und Probleme in Ubuntu

Die Entsprechung zwischen der Tensorflow-Version ...