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

CSS-Tricks zum Erstellen von Welleneffekten

Es war schon immer sehr schwierig, Welleneffekte ...

...

Sprungcode für HTML-Seite

Speichern Sie den folgenden Code als Standard-Home...

Vue implementiert eine kleine Countdown-Funktion

In vielen Projekten muss eine Countdown-Funktion ...

HTML implementiert problemlos abgerundete Rechtecke

Frage: Wie erreiche ich mit Div+CSS und Positioni...

Erklärung zur Änderung des npm Taobao-Spiegels

1. Nutzung auf höchster Ebene 1. Installieren Sie...

Detaillierte Schritte zum Erstellen eines NFS-Dateifreigabeservers unter Linux

Linux erstellt NFS-Server Um den Datenaustausch z...

Detaillierte Erklärung der Anzeigemodi in CSS-Tags

Beschriftungsanzeigemodus (wichtig) Div- und Span...

So installieren und konfigurieren Sie MySQL und ändern das Root-Passwort

1. Installation apt-get install mysql-server erfo...

Beim Website-Design sollte auf die Farbhierarchie geachtet werden

Ich habe kürzlich gesagt, dass Design ein Gefühl d...