Implementierung des Vue-Top-Tags-Browserverlaufs

Implementierung des Vue-Top-Tags-Browserverlaufs

Unsinn

Demo-Vorschau

Implementierte Funktionen

Es gibt standardmäßig eine Homepage, die nicht geschlossen werden kann

Klicken Sie auf das Routenmenü, um zu prüfen, ob es vorhanden ist. Wenn nicht, fügen Sie es hinzu. Wenn ja, suchen Sie es oben.

Klicken Sie zum Springen, klicken Sie zum Schließen auf X

Aktuelle Seite schließen und automatisch zur nächsten Tag-Seite springen

Wenn die aktuelle Seite die letzte ist, springe standardmäßig zur vorherigen Tag-Seite

Rechtsklick-Menü, Aktualisieren, Rechts schließen, Alle schließen

Wenn die Tags zu lang sind, werden Schaltflächen auf der linken und rechten Seite angezeigt und verschwinden automatisch, wenn die Tags verkleinert werden.

Bestimmen Sie dynamisch, ob das Fenster vergrößert oder verkleinert wird, und bestimmen Sie automatisch, ob sich auf der linken und rechten Seite Schaltflächen befinden

Text

Keine Notwendigkeit für Vuex, chaotische Methoden, alles in einer Datei, einfach einfügen und verwenden

Legen Sie es einfach dort ab, wo Sie möchten (diese Demo wird in die Brotkrümelnavigation gelegt)

Zuerst installieren (ein Paket, das die Größe eines DOM-Elements überwacht)

npm installiere Element-Größenänderungsdetektor

Tags.vue

<Vorlage>
  <div>
    <div Klasse="Tags">
      <!-- Pfeil nach links -->
      <div
        Klasse="Pfeil Pfeil_links"
        v-show="Pfeil sichtbar"
        @click="handleClickToLeft"
      >
        <i Klasse="el-icon-arrow-left"></i>
      </div>
      <!-- Tag-Inhalt -->
      <div Klasse = "tags_content" ref = "box">
        <span ref="tags">
          <el-tag
            v-for="(Tag, Index) in Tags"
            :Schlüssel="tag.name"
            :Klasse="[aktiv == Index ? 'aktive Top-Tags' : 'Top-Tags']"
            Effekt="dunkel"
            :closable="tag.name != 'ErsteSeite1'"
            @close="handleClose(index, tag)"
            @click="clickTag(index, tag)"
            @contextmenu.native.prevent="handleClickContextMenu(index, tag)"
          >
            {{ $t("router." + tag.name) }}
          </el-tag>
        </span>
      </div>
      <!-- Pfeil nach rechts -->
      <div
        Klasse="Pfeil Pfeil_rechts"
        v-show="Pfeil sichtbar"
        @click="Klick nach rechts handhaben"
      >
        <i Klasse="el-icon-arrow-right"></i>
      </div>
    </div>
    <!-- Rechtsklickmenü-->
    <ul
      v-show="Kontextmenü.istAnzeigen"
      :style="{ links: contextMenu.menuLeft, oben: '96px' }"
      Klasse = "el-Dropdown-Menü el-Popper"
      x-placement="unteres Ende"
    >
      <li
        v-if="dieses.aktive == dieses.Kontextmenü.index"
        Klasse="el-dropdown-menu__item"
        @click="aktualisieren"
      >
        Aktualisieren
      <li class="el-dropdown-menu__item" @click="closeRightTag">
        Rechte Seite schließen</li>
      <li class="el-dropdown-menu__item" @click="closeOtherTag">
        Andere schließen</li>
      <div x-arrow="" Klasse="popper__arrow" Stil="links: 44px;"></div>
    </ul>
  </div>
</Vorlage>

<Skript>
importiere elementResizeDetectorMaker aus „element-resize-detector“;
Standard exportieren {
  Daten() {
    zurückkehren {
      // Gibt es einen Pfeil arrowVisible: true,
      //Anzahl Klicks: 0,
      aktiv: 0,
      Stichworte: [],
      // Klicken Sie mit der rechten Maustaste auf das Element contextMenu: {
        Index: 0,
        Etikett: {},
        Menü links: 0,
        isShow: false
      }
    };
  },
  betrachten:
    $route() {
      dies.getThisPage();
    },
    tags() {
      dies.listenFun(dies.$refs.tags, "tags");
    }
  },
  montiert() {
    dies.listenFun(diese.$refs.box, "box");
    var das = dies;
    document.addEventListener("klicken", function(e) {
      that.contextMenu.isShow = false;
    });
  },
  Methoden: {
    // Überwachen Sie die Breite des sichtbaren Bereichs und führen Sie listenFun(monitor, dom) aus, wenn sich die Größe des Browserfensters ändert {
      lass boxWidth = this.$refs.box.offsetWidth,
        tagsWidth = this.$refs.tags.offsetWidth,
        erd = elementResizeDetectorMaker();
      erd.listenTo(monitor, ele => {
        dies.$nextTick(() => {
          Wenn (
            (dom == "box" und ele.offsetWidth >= tagsWidth) ||
            (dom == "tags" und ele.offsetWidth <= boxWidth)
          ) {
            Dies.arrowVisible = false;
            dies.$refs.box.style.paddingLeft = "16px";
            dies.$refs.box.style.paddingRight = "16px";
            this.$refs.box.style.transform = "TranslateX(0px)";
            diese.num = 0;
          } anders {
            Dies.arrowVisible = true;
            dies.$refs.box.style.paddingLeft = "56px";
            dies.$refs.box.style.paddingRight = "56px";
          }
        });
      });
    },
    // Aktuelle Seite ermitteln getThisPage() {
      lass currentPgae = this.$route;
      // Bestimmen, ob die aktuelle Seite in den Tags vorhanden ist var index = this.tags.findIndex(tag => tag.name == currentPgae.name);
      wenn (Index == -1) {
        dies.tags.push({
          Name: aktuellerSeite.name,
          Pfad: currentPgae.path
        });
      }
      //Derzeit ausgewählte Seite this.active = this.tags.findIndex(tag => tag.name == currentPgae.name);
    },
    // Tag schließen handleClose(index, tag) {
      dies.tags.splice(dies.tags.indexOf(tag), 1);
      wenn (index == diese.tags.länge) {
        dies.aktiv = Index - 1;
        dies.$router.push(dies.tags[index - 1].pfad);
      } anders {
        dies.$router.push(dies.tags[index].pfad);
      }
    },
    // Klicken Sie auf das Tag clickTag(index, tag) {
      dies.aktiv = Index;
      dies.$router.push(tag.path);
    },
    // Linke Taste handleClickToLeft() {
      wenn (diese.zahl > 0) {
        diese.nummer--;
        dies.$refs.box.style.transform = `TranslateX(-${this.num * 200}px)`;
      }
    },
    // Rechte Taste handleClickToRight() {
      // Das letzte Tag wird von der linken Seite des Browsers aus gemessen let lastChild = document
        .querySelectorAll(".top_tags")
        [this.tags.length - 1].getBoundingClientRect().right;
      // Breite des sichtbaren Fensters let bodyWidth = document.body.offsetWidth;
      // Rechter Pfeil 48 + rechter Rand 16
      wenn (BodyWidth - letztes Kind <= 64) {
        diese.num++;
        dies.$refs.box.style.transform = `TranslateX(-${this.num * 200}px)`;
      }
    },
    // Rechtsklick handleClickContextMenu(index, tag) {
      this.contextMenu.isShow = true;
      dieses.Kontextmenü.index = Index;
      this.contextMenu.tag = Tag;
      let isTag = Dokument
        .querySelectorAll(".top_tags")
        [index].getBoundingClientRect();
      this.contextMenu.menuLeft = isTag.left – 48 + isTag.width / 2 + "px";
    },
    // Aktualisieren refresh() {
      dies.$router.go(0);
    },
    // Andere schließen closeOtherTag() {
      sei tagsLin = this.tags.length,
        { index, tag, menuLeft } = dieses.Kontextmenü;
      wenn (Index != 0) {
        diese.tags = [
          {
            Name: "ErsteSeite1",
            Pfad: "/Erste/Seite1"
          },
          {
            Name: tag.name,
            Pfad: tag.pfad
          }
        ];
      } anders {
        diese.tags = [
          {
            Name: "ErsteSeite1",
            Pfad: "/Erste/Seite1"
          }
        ];
      }
      dies.aktiv = Index;
      dies.$router.push(tag.path);
    },
    // Rechte Seite schließen closeRightTag() {
      sei tagsLin = this.tags.length,
        { index, tag, menuLeft } = dieses.Kontextmenü;
      dies.tags.splice(index + 1, tagsLin - index);
      dies.aktiv = Index;
      dies.$router.push(tag.path);
    }
  },
  erstellt() {
    // Auf Seitenaktualisierung warten window.addEventListener("beforeunload", e => {
      localStorage.setItem(
        "tagInfo",
        JSON.stringify({
          aktiv: dies.aktiv,
          Schlagworte: diese.tags
        })
      );
    });
    let tagInfo = localStorage.getItem("tagInfo")
      ? JSON.parse(localStorage.getItem("tagInfo"))
      : {
          aktiv: 0,
          Schlagworte: [
            {
              Name: "ErsteSeite1",
              Pfad: "/Erste/Seite1"
            }
          ]
        };
    dies.aktiv = tagInfo.aktiv;
    dies.tags = tagInfo.tags;
  }
};
</Skript>
<style lang="less" scoped>
/deep/.el-tag--dark {
  Rahmenfarbe: transparent;
}
/tief/.el-tag--dark .el-tag__close {
  Farbe: #86909c;
  Schriftgröße: 16px;
}
/deep/.el-tag--dark .el-tag__close:hover {
  Hintergrund: #e7eaf0;
}
.tags {
  Position: relativ;
  Überlauf: versteckt;
  .Pfeil {
    Breite: 48px;
    Textausrichtung: zentriert;
    Cursor: Zeiger;
    Hintergrund: #fff;
    Position: absolut;
    Z-Index: 1;
    &_links {
      links: 0;
      oben: 0;
    }
    &_Rechts {
      rechts: 0;
      oben: 0;
    }
  }
  &_Inhalt {
    Übergang: 0,3 s;
    Leerzeichen: Nowrap;
    // Polsterung: 0 16px;
  }
  .top_tags {
    Rand rechts: 8px;
    Cursor: Zeiger;
    Hintergrund: #fff;
    Schriftgröße: 12px;
    Schriftstärke: 400;
    Farbe: #1d2129;
  }
  .top_tags:schweben,
  .aktiv,
  .Pfeil:schweben {
    Hintergrund: #e7eaf0;
  }
}
</Stil>

Wichtige Punkte

Was muss geändert werden

currentPgae.name ist der Name der Routing-Struktur. Überprüfen Sie, ob sie existiert. Wenn nicht, fügen Sie sie hinzu. Wenn ja, suchen Sie sie oben. Ändern Sie sie entsprechend dem Projekt

Gehen Sie bei der Überwachung der Aktualisierung zu den lokalen Speichertags und den aktiven Tags der aktuellen Seite und ändern Sie Ftistpage1 in Ihre eigene Homepage

Dies ist das Ende dieses Artikels über die Implementierung des Vue-Top-Tags-Browserverlaufs. Weitere relevante Inhalte zum Vue-Top-Tags-Browserverlauf finden Sie in den vorherigen Artikeln von 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:
  • Mehrere Möglichkeiten zum Kapseln von Breadcrumb-Funktionskomponenten in Vue3
  • Kapselungsmethode der Vue-Breadcrumbs-Komponente
  • Tutorial zur in Vue gekapselten Breadcrumbs-Komponente
  • Vue + Element-UI-Tabellenkapselungs-Tag-Label mit Slot
  • Praktische Vue-Tags zum Erstellen eines Cache-Navigationsprozesses
  • Vue-Grundlagen: Breadcrumbs und Tags – ausführliche Erklärung

<<:  Beispiel für die Kompilierung von LNMP im Docker-Container

>>:  CSS3-Implementierungscode für einfaches Karussellbildschneiden

Artikel empfehlen

Ähnlich wie HTML-Tags: strong und em, q, cite, blockquote

Es gibt einige Tags in XHTML, die ähnliche Funkti...

Tutorial zur Bereitstellung und Installation von MySQL 8.0.18 unter Windows 7

1. Vorbereitende Schritte (Windows 7 + MySQL-8.0....

So erhalten Sie Root-Berechtigungen in einem Docker-Container

Zunächst muss Ihr Container laufen Sie können die...

Implementierungsschritte der MySQL-Master-Slave-Replikation

Inhaltsverzeichnis MySQL Master-Slave-Replikation...

Lösung für BT Baota Panel php7.3 und php7.4 unterstützen ZipArchive nicht

Die Lösung für das Problem, dass die PHP7.3-Versi...

Bootstrap 3.0 Studiennotizen CSS-bezogene Ergänzung

Die wesentlichen Inhalte dieses Artikels sind wie...

So finden und löschen Sie doppelte Datensätze in MySQL

Hallo zusammen, ich bin Tony, ein Lehrer, der nur...

Manuelles Implementieren des Eingabefelds für den js-SMS-Bestätigungscode

Vorwort Dieser Artikel beschreibt eine allgemeine...

...

Häufige Tomcat-Ausnahmen und Lösungscodebeispiele

Das Unternehmensprojekt wurde in Java entwickelt ...