Implementierung einer verschiebbaren Komponente zum Teilen des linken und rechten Bedienfelds in Vue3

Implementierung einer verschiebbaren Komponente zum Teilen des linken und rechten Bedienfelds in Vue3

Als ich kürzlich vue verwendete, musste ich feststellen, dass die Breite der linken und rechten Divs durch Ziehen des mittleren Teils angepasst werden kann. In diesem Artikel wird dies organisiert und mit Ihnen geteilt. Die Einzelheiten lauten wie folgt:

Rendern

Komponenten zerlegen

Flex-Layout als Ganzes verwenden

Linkes Feld

  • Der spezifische Inhalt des Panels wird über den Slot mit der Bezeichnung „Slot“ übergeben.
  • Der Titel wird durch prop weitergegeben
  • Ziehbar. Um sicherzustellen, dass der Inhaltsstil durch Ziehen nicht zerstört wird, legen Sie den Maximal-/Minimalwert für die Breite des Bedienfelds fest.

Rechtes Feld

  • Die Breite des rechten Panels ändert sich mit der Breite des linken Panels. Beachten Sie, dass die Breite des Inhalts automatisch mit Flex-Auto angepasst wird.
  • Muss an mobile Geräte angepasst werden.
  • Adaptive Nutzung von Tailwind-Medienabfragen

Zerlegung der Eingabeparameter

Requisiten

  • @param {Number} maxWidth Maximale Breite
  • @param {Number} minWidth Mindestbreite
  • @param {String} leftTitle linker Titel
  • @param {String} rightTitle Richtiger Titel?
  • @param {Boolean} storeReage, ob mit localstorege gespeichert werden soll

Spielautomaten

  • left-content {Element} linker Inhalt
  • right-content {Element} richtiger Inhalt

Konkrete Umsetzung

Wie ziehen?

Fügen Sie zwischen dem linken und rechten Bereich ein verstecktes Feld hinzu und verstecken Sie dieses Feld im Box-Shadow. In diesem Div werden bestimmte Ereignisse implementiert

<div id="line" class="w-2 cursor-move hidden md4:block"onMousedown={hnadleMouseDown}>
</div>

Ereignisüberwachung

    const hnadleMouseDown = (evt: MouseEvent) => {
      /* Startpunkt abrufen und speichern*/
      let { SeiteX, SeiteY } = evt;
      BasisPosition.SeiteX = SeiteX;
      BasisPosition.seiteY = SeiteY;
      /* Auf Mausbewegungsereignisse achten*/
      document.addEventListener("mousemove", handleMouseMove);
      document.addEventListener("mouseup", handleMouseUp);
    };
    const handleMouseMove = evt => {
      /* Verhindern Sie, dass Standardereignisse des Browsers die Gestenfunktion des Browsers auslösen*/
      evt.preventDefault();
      /* Stellen Sie den Timer ein, um ein mehrmaliges Reflowing des DOM zu verhindern*/
      Zeitüberschreitung löschen(Timer.Wert);
      timer.value = setTimeout(() => {
        let { SeiteX } = evt;
        const baseDiv = document.querySelector(".right-border-shadow");
        /* Prozessbreite, ob sie zwischen dem Maximal-/Minimalwert liegt*/
        let baseWidth: Zahl | undefiniert =
          Zahl(BasisDiv?.ClientBreite) + (SeiteX - BasisPosition.SeiteX);
        Basisbreite =
          Basisbreite > Zahl (Eigenschaften?.maxBreite) – Eigenschaften.maxBreite: Basisbreite;
        Basisbreite =
          Zahl (Basisbreite) < Zahl (Eigenschaften?.Mindestbreite)
            ? props.minBreite
            : Basisbreite;
        baseDiv?.setAttribute("Stil", `Breite: ${baseWidth}px`);
        /* Ereignis „Breite geändert“ ausgeben */
        ctx.emit("Wirkstoffend");
        /* Von Speicher zu Speicher */
        setStore(Basisbreite);
      }, 50);
    };
    const handleMouseUp = evt => {
      /* Nach Beendigung des Ziehens das Abhören des Ereignisses abbrechen und die endgültige Breite ausgeben*/
      const width = document.querySelector(".right-border-shadow")?.clientWidth;
      document.removeEventListener("mousemove", handleMouseMove);
      Dokument.removeEventListener("mouseup", handleMouseUp);
      ctx.emit("Drugend", Breite);
    };

Breitenverarbeitung

Stil={`Breite:${
            store.get("geteilte Breite")
              ? store.get("geteilte Breite")
              : props.minBreite
              ? props.minBreite
              : 384
          }px`}

Optimierung

Manuelles Ändern der Browserfensterbreite

nächsterTick(() => {
        ctx.emit("laden", ctx);
        MutationObserver = Fenster.MutationObserver;
        wenn (MutationObserver) {
          /* Änderungen im Browserfenster überwachen, diese API ist in einigen Fällen erforderlich */
          mo = neuer MutationObserver(Funktion() {
            const __wm = document.querySelector("#rezie-id");
            // __canvasWM nur erneut aufrufen, wenn sich das __wm-Element ändert
            wenn (!__wm) {
              //Vermeiden Sie, ständig mo.disconnect() auszulösen;
              mo = null;
              ctx.emit("Größe ändern");
            }
          });
          mo.observe(document.querySelector("#rezie-id"), {
            Attribute: true,
            Teilbaum: wahr,
            Kinderliste: wahr,
          });
        }
      });

Nicht wirksam, bitte beraten Sie

Insekten

Beim Abrufen des Slot-Elementknotens des untergeordneten Elements im OnMounted-Hook der übergeordneten Komponente ist ein Fehler aufgetreten. Der Wert ist null. Die aktuelle Lösung besteht darin, ein Ladeereignis im onMounted-Hook der untergeordneten Komponente auszulösen, und die übergeordnete Komponente verwendet onLoad, um die nachfolgende Logik zu verarbeiten.

Git-Adresse

Lageradresse Vorschauadresse

Dies ist das Ende dieses Artikels über die Implementierung der Vue3-Komponente zum Teilen des linken und rechten Panels. Weitere verwandte Inhalte zum Vue3-Inhalt zum Teilen des linken und rechten Panels finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • vue-Split realisiert Panel-Segmentierung
  • Vue implementiert Drag-and-Slide-Split-Panel
  • Implementierungsdatensatz für die Vue-Split-Panel-Kapselung

<<:  Fehlerbehebung und Lösungen für das Problem der MySQL-Autoinkrement-ID-Übergröße

>>:  So installieren Sie pyenv unter Linux

Artikel empfehlen

Grafisches Tutorial zur Installation und Konfiguration von MySQL 5.7.27 winx64

In diesem Artikel wird die Installations- und Kon...

Analyse von Mysql-Datenmigrationsmethoden und -Tools

In diesem Artikel wird hauptsächlich die Analyse ...

Natives JavaScript zur Implementierung einer zufälligen Namensaufruftabelle

In diesem Artikelbeispiel wird der spezifische Co...

Zwei Möglichkeiten zum Löschen von Floats in HTML

1. Methode 1 zum Löschen von Floating Legen Sie d...

Docker-Tutorial: Container verwenden (einfaches Beispiel)

Wenn Sie mit Docker noch nicht vertraut sind, seh...

Detailliertes Linux-Installationstutorial

(Win7-System) Tutorial zur Installation einer vir...

Singleton-Entwurfsmuster in JavaScript

Inhaltsverzeichnis 1. Was ist ein Entwurfsmuster?...

Heute bin ich auf ein sehr seltsames Problem gestoßen und habe es selbst gelöst

...Es ist so, heute wollte ich ein Popup-Fenster m...

Tutorial zu HTML-Formular-Tags (4):

Nehmen Sie nun an, dass Sie dem Formular ein Elem...

Welche Szenarien sind für JS-Pfeilfunktionen nicht geeignet?

Inhaltsverzeichnis Überblick Definieren von Metho...

Einführung in die Verwendung von Requisiten in Vue

Vorwort: In Vue können Props verwendet werden, um...