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

Verwenden Sie CSS-Variablen, um coole und erstaunliche Schwebeeffekte zu erzielen

Kürzlich habe ich auf der Grover-Website eine lus...

So verwenden Sie Watch-Listener in Vue2 und Vue3

watch : auf Datenänderungen achten (Änderungserei...

So beheben Sie Dateisystemfehler in Linux mit „fsck“

Vorwort Das Dateisystem ist für die Organisation ...

Organisieren Sie die allgemeinen Wissenspunkte von CocosCreator

Inhaltsverzeichnis 1. Szene laden 2. Knoten suche...

Beispiele für die Verwendung temporärer Tabellen in MySQL

Ich war in den letzten beiden Tagen etwas beschäf...

CSS3 realisiert den Animationseffekt der Lotusblüte

Schauen wir uns zunächst die Wirkung an: Dieser E...

Beispiel, wie nginx dynamische und statische Trennung implementiert

Inhaltsverzeichnis Stellen Sie nginx auf Server1 ...

Richtige Methode zum Laden von Schriftarten in Vue.js

Inhaltsverzeichnis Schriftarten mit font-face ric...

Bestimmen Sie die Richtung der Mauseingabe basierend auf CSS

In einer Front-End-Technologiegruppe sagte ein Gr...

Detaillierte Beispiele für Docker-Compose-Netzwerke

Ich habe heute mit den Netzwerkeinstellungen unte...

Implementierung eines geplanten MySQL-Sicherungsskripts unter Windows

Wenn Sie auf einem Windows-Server regelmäßig Date...