Vueトップタグ閲覧履歴の実装

Vueトップタグ閲覧履歴の実装

ナンセンス

デモプレビュー

実装された機能

デフォルトでホームページがあり、閉じることはできません

ルート メニューをクリックして、存在するかどうかを確認します。存在しない場合は追加します。存在する場合は、上記で見つけます。

クリックするとジャンプし、Xをクリックすると閉じます

現在のページを閉じて、次のタグページに自動的にジャンプします

現在のページが最後のページの場合は、デフォルトで前のタグページにジャンプします

右クリックメニュー、更新、右を閉じる、すべて閉じる

タグが長すぎて収まらない場合は、タグが縮小されると、左側と右側のボタンが自動的に表示され、消えます。

ウィンドウが拡大されているか縮小されているかを動的に判断し、左右にボタンがあるかどうかを自動的に判断します

文章

vuexや面倒なメソッドは不要、すべて1つのファイルにまとめられているので、貼り付けて使用するだけです

好きな場所に置くだけです(このデモはパンくずリストに配置されています)

最初にインストールする(DOM要素のサイズを監視するパッケージ)

npm 要素サイズ変更検出器をインストールします

タグ.vue

<テンプレート>
  <div>
    <div class="タグ">
      <!-- 左矢印 -->
      <div
        クラス="矢印 arrow_left"
        v-show="矢印表示"
        @click="左クリックハンドル"
      >
        <i class="el-icon-arrow-left"></i>
      </div>
      <!-- タグの内容 -->
      <div class="tags_content" ref="box">
        <span ref="タグ">
          <elタグ
            v-for="(タグ、インデックス) タグ内"
            :key="タグ名"
            :class="[active == index ? 'active top_tags' : 'top_tags']"
            効果="暗い"
            :closable="タグ名 != 'Firstpage1'"
            @close="handleClose(インデックス、タグ)"
            @click="clickTag(インデックス、タグ)"
            @contextmenu.native.prevent="handleClickContextMenu(インデックス、タグ)"
          >
            {{ $t("ルーター." + タグ名) }}
          </el-tag>
        </span>
      </div>
      <!-- 右矢印 -->
      <div
        クラス="矢印 arrow_right"
        v-show="矢印表示"
        @click="ハンドル右クリック"
      >
        <i class="el-icon-arrow-right"></i>
      </div>
    </div>
    <!-- 右クリックメニュー-->
    <ul
      v-show="contextMenu.isShow"
      :style="{ 左: contextMenu.menuLeft、上: '96px' }"
      class="el-dropdown-menu el-popper"
      x-placement="下端"
    >
      <li
        v-if="this.active == this.contextMenu.index"
        クラス="el-dropdown-menu__item"
        @click="更新"
      >
        リフレッシュ
      <li class="el-dropdown-menu__item" @click="closeRightTag">
        右側を閉じる</li>
      <li class="el-dropdown-menu__item" @click="その他のタグを閉じる">
        その他を閉じる</li>
      <div x-arrow="" class="popper__arrow" style="left: 44px;"></div>
    </ul>
  </div>
</テンプレート>

<スクリプト>
「element-resize-detector」から elementResizeDetectorMaker をインポートします。
エクスポートデフォルト{
  データ() {
    戻る {
      // 矢印があるか arrowVisible: true,
      //クリック数: 0,
      アクティブ: 0,
      タグ: [],
      // 要素を右クリック contextMenu: {
        インデックス: 0,
        タグ: {},
        メニュー左: 0,
        isShow: 偽
      }
    };
  },
  時計:
    $ルート() {
      このページを取得します。
    },
    タグ() {
      this.listenFun(this.$refs.tags, "タグ");
    }
  },
  マウント() {
    this.listenFun(this.$refs.box, "ボックス");
    var that = this;
    document.addEventListener("クリック", function(e) {
      that.contextMenu.isShow = false;
    });
  },
  メソッド: {
    // 表示領域の幅を監視し、ブラウザウィンドウのサイズが変わったら listenFun(monitor, dom) を実行します {
      boxWidth = this.$refs.box.offsetWidthとします。
        tagsWidth = this.$refs.tags.offsetWidth、
        erd = 要素サイズ変更検出器メーカー();
      erd.listenTo(モニター、ele => {
        this.$nextTick(() => {
          もし (
            (dom == "box" && ele.offsetWidth >= tagsWidth) ||
            (dom == "tags" && ele.offsetWidth <= boxWidth)
          ){
            this.arrowVisible = false;
            this.$refs.box.style.paddingLeft = "16px";
            this.$refs.box.style.paddingRight = "16px";
            this.$refs.box.style.transform = "TranslateX(0px)";
            this.num = 0;
          } それ以外 {
            this.arrowVisible = true;
            this.$refs.box.style.paddingLeft = "56px";
            this.$refs.box.style.paddingRight = "56px";
          }
        });
      });
    },
    // 現在のページを確認する getThisPage() {
      currentPgae = this.$route; とします。
      // タグ内に現在のページがあるかどうかを判断します var index = this.tags.findIndex(tag => tag.name == currentPgae.name);
      (インデックス == -1)の場合{
        this.tags.push({
          名前: currentPgae.name、
          パス: currentPgae.path
        });
      }
      //現在選択されているページ this.active = this.tags.findIndex(tag => tag.name == currentPgae.name);
    },
    // タグを閉じる handleClose(index, tag) {
      this.tags.splice(this.tags.indexOf(タグ), 1);
      if (インデックス == this.tags.length) {
        this.active = インデックス - 1;
        this.$router.push(this.tags[index - 1].path);
      } それ以外 {
        this.$router.push(this.tags[index].path);
      }
    },
    // タグをクリック clickTag(index, tag) {
      this.active = インデックス;
      this.$router.push(タグ.path);
    },
    // 左ボタンのhandleClickToLeft() {
      if (this.num > 0) {
        this.num--;
        this.$refs.box.style.transform = `TranslateX(-${this.num * 200}px)`;
      }
    },
    // 右ボタンのhandleClickToRight() {
      // 最後のタグはブラウザの左側から計測されます。let lastChild = document
        .querySelectorAll(".top_tags")
        [this.tags.length - 1].getBoundingClientRect().right;
      // 表示ウィンドウの幅 let bodyWidth = document.body.offsetWidth;
      // 右矢印 48 + 右余白 16
      (bodyWidth - lastChild <= 64)の場合{
        this.num++;
        this.$refs.box.style.transform = `TranslateX(-${this.num * 200}px)`;
      }
    },
    // 右クリック handleClickContextMenu(index, tag) {
      this.contextMenu.isShow = true;
      this.contextMenu.index = インデックス;
      this.contextMenu.tag = タグ;
      isTag = ドキュメント
        .querySelectorAll(".top_tags")
        [インデックス].getBoundingClientRect();
      this.contextMenu.menuLeft = isTag.left - 48 + isTag.width / 2 + "px";
    },
    // 更新 refresh() {
      this.$router.go(0);
    },
    // 他のタグを閉じる closeOtherTag() {
      tagsLin = this.tags.lengthとします。
        { インデックス、タグ、menuLeft } = this.contextMenu;
      (インデックス!= 0)の場合{
        タグ = [
          {
            名前: "Firstpage1",
            パス: "/First/page1"
          },
          {
            名前: タグ名、
            パス: タグ.パス
          }
        ];
      } それ以外 {
        タグ = [
          {
            名前: "Firstpage1",
            パス: "/First/page1"
          }
        ];
      }
      this.active = インデックス;
      this.$router.push(タグ.path);
    },
    // 右側を閉じる closeRightTag() {
      tagsLin = this.tags.lengthとします。
        { インデックス、タグ、menuLeft } = this.contextMenu;
      this.tags.splice(インデックス + 1、 tagsLin - インデックス);
      this.active = インデックス;
      this.$router.push(タグ.path);
    }
  },
  作成された() {
    // ページの更新をリッスンする window.addEventListener("beforeunload", e => {
      ローカルストレージ.setItem()
        「タグ情報」、
        JSON.stringify({
          アクティブ: this.active,
          タグ: this.tags
        })
      );
    });
    tagInfo = localStorage.getItem("tagInfo") とします。
      ? JSON.parse(localStorage.getItem("tagInfo"))
      : {
          アクティブ: 0,
          タグ: [
            {
              名前: "Firstpage1",
              パス: "/First/page1"
            }
          ]
        };
    this.active = タグ情報.active;
    タグ情報
  }
};
</スクリプト>
<style lang="less" スコープ>
/deep/.el-tag--dark {
  境界線の色: 透明;
}
/deep/.el-tag--dark .el-tag__close {
  色: #86909c;
  フォントサイズ: 16px;
}
/deep/.el-tag--dark .el-tag__close:hover {
  背景: #e7eaf0;
}
.タグ {
  位置: 相対的;
  オーバーフロー: 非表示;
  .矢印{
    幅: 48px;
    テキスト配置: 中央;
    カーソル: ポインタ;
    背景: #fff;
    位置: 絶対;
    zインデックス: 1;
    &_左 {
      左: 0;
      上: 0;
    }
    &_右 {
      右: 0;
      上: 0;
    }
  }
  &_コンテンツ {
    遷移: 0.3秒;
    空白: ラップなし;
    // パディング: 0 16px;
  }
  .トップタグ {
    右マージン: 8px;
    カーソル: ポインタ;
    背景: #fff;
    フォントサイズ: 12px;
    フォントの太さ: 400;
    色: #1d2129;
  }
  .top_tags:ホバー、
  。アクティブ、
  .arrow:hover {
    背景: #e7eaf0;
  }
}
</スタイル>

要点

変更が必要な点

currentPgae.name はルーティング構造の名前です。存在するかどうかを確認します。存在しない場合は追加します。存在する場合は、上記で見つけます。プロジェクトに応じて変更します。

更新を監視するときは、ローカルストレージタグと現在のページのアクティブに移動し、Ftistpage1を自分のホームページに変更します。

Vueトップタグ閲覧履歴の実装に関するこの記事はこれで終わりです。Vueトップタグ閲覧履歴の関連コンテンツについては、123WORDPRESS.COMの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue3 でパンくず関数コンポーネントをカプセル化するいくつかの方法
  • Vueパンくずコンポーネントのカプセル化方法
  • Vue カプセル化パンくずリスト コンポーネント チュートリアル
  • vue+element-ui テーブルカプセル化タグラベルスロットの使用
  • キャッシュナビゲーションプロセスを作成するための実用的なvueタグ
  • Vue の基本パンくずリストとタグの詳細な説明

<<:  CSS3 シンプルカットカルーセル画像実装コード

>>:  フォーム送信時に追加のパラメータを渡すためのいくつかの一般的な方法

推薦する

Nginx でアンチホットリンクを設定するための手順を完了する

必要:通常、サイト側は、ウェブサイト上の動画や写真が盗まれるのを防ぎたいと考えています。結局のところ...

Java は Excel から MySQL にデータをインポートします

実際の業務では、Excel からデータベースにデータをインポートする必要がある場合があります。データ...

tomcat をインストールし、Linux で Web サイトを展開します (推奨)

jdk をインストールします: Oracle 公式ダウンロード https://www.oracl...

MySQL 5.7 をインストールした後にコマンドライン ウィンドウを開くとクラッシュする問題の解決方法

序文最近、MySQL 5.7 をインストールしましたが、問題が見つかりました。コマンド ライン ウィ...

React dva実装コード

目次ドヴァdvaの使用DVAの実装非同期をサポートルーターの実装成し遂げる:ドヴァdva は、red...

ショートビデオ(Douyin)の透かし除去ツールの実装コード

目次1. まず最初のリンクを取得する2. ブラウザでこのリンクを開いてください3. アドレスを開くと...

MySQL 5.7.17 圧縮バージョンのインストールノート

この記事では、参考までにMySQL 5.7.17圧縮版のインストール手順を紹介します。具体的な内容は...

SSHトンネルを使用してMySQLサーバーに接続する方法

序文場合によっては、データベースのイントラネット アドレスしか知らず、イントラネット経由で接続できな...

CSS スタイルをプログラムで処理するためのサンプル コード

プログラム的アプローチの利点1. スタイルの分散を避けるためのグローバルコントロール2. シンプルな...

MySQL pt-slave-restart ツールの使い方の紹介

目次MySQL マスター スレーブ レプリケーション環境を設定する場合、マスター データベースとスレ...

Ubuntu Server のターミナルのウェルカム メッセージで広告を無効にする方法

最新の Ubuntu Server バージョンを使用している場合、ようこそメッセージに、Ubuntu...

MySQL データベースのホットスタンバイにおける問題点の分析

以前、MySQL データベースのデュアルマシン ホット スタンバイの設定方法を紹介しました。ご興味の...

1 つの記事で Nginx の現在の制限を理解する (簡単な実装)

Nginx は現在、最も人気のあるロード バランサーの 1 つです。インターネット トラフィックの...

携帯電話番号が合法かどうかを判断するWeChatアプレットのサンプルコード

目次シナリオ効果コード要約するシナリオ登録ページに携帯電話番号を入力し、登録インターフェイスを要求す...

シンプルなドラッグ効果を実現するJavaScript

この記事では、簡単なドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...