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

Eine kurze Diskussion über JS-Verpackungsobjekte

Inhaltsverzeichnis Überblick Definition Instanzme...

So verwenden Sie die Glog-Protokollbibliothek in einer Linux-Umgebung

Linux-Bibliothek generieren Die Linux-Version ver...

Detaillierte Analyse der MySQL-Sperrblockierung

Bei der täglichen Wartung werden Threads häufig b...

Detaillierte Erklärung der Docker-Einstiegspunktdatei

Schließen Sie beim Schreiben einer Docker-Datei e...

Schritte zur Installation von cuda10.1 unter Ubuntu 20.04 (grafisches Tutorial)

Vorbereitung vor der Installation Der Hauptzweck ...

Gründe und Methoden zum Warten auf die Sperre der Tabellenmetadaten in MySQL

Wenn MySQL DDL-Operationen wie „Alter Table“ ausf...

MySQL-Leistungsoptimierungs-Index-Pushdown

Index Condition Pushdown (ICP) wird in MySQL 5.6 ...

Lösen Sie das Problem, dass Docker Elasticsearch7.x startet und einen Fehler meldet

Verwenden des Docker-Befehls „run“ docker run -d ...

Centos7-Installation des in Nginx integrierten Lua-Beispielcodes

Vorwort Der von mir verwendete Computer ist ein M...

Linux-Grundlagen-Tutorial: Sonderberechtigungen SUID, SGID und SBIT

Vorwort Für Datei- oder Verzeichnisberechtigungen...

Detailliertes Tutorial zum PyCharm- und SSH-Remote-Access-Server-Docker

Hintergrund: Einige Experimente müssen auf dem Se...