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 シンプルカットカルーセル画像実装コード

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

推薦する

ローカルで起動したときに Vue プロジェクトがクッキーを保持できない問題を解決する

vueプロジェクトをパッケージ化してサーバーにデプロイし、正常にログインできるが、ローカルで起動する...

MySQLの基本操作を詳しく解説(第2部)

序文この記事には1. データベースのいくつかの主要な制約2. テーブル間の関係制約:主キー制約: 機...

Linux での MySQL 5.7.18 yum のアンインストールからインストールまでのプロセスの図

いろいろ苦労しましたが、やっと yum インストールの手順がわかりました。以前、バイナリ パッケージ...

MySQL ロック関連知識のまとめ

MySQL のロックロックは、並行環境におけるリソースの競合を解決する手段です。その中でも、楽観的並...

ウェブデザイン研究における XHTML の応用の概要

<br />一般的に、「標準的な Web ページ」のファイル構成は XHTML CSS ...

Linux で ARM 開発ボード用のファイルシステムを作成する

1. Busyboxのソースコードをオンラインでダウンロードしてください。コンパイル方法については、...

Linux でユーザーをグループに追加する 4 つの方法の概要

序文Linux グループは、Linux でユーザー アカウントを管理するために使用される組織単位です...

vue-admin-template 動的ルーティング実装例

ログインを提供し、ユーザー情報データインターフェースを取得するapi/user.js内 '@...

Dockerボリュームコンテナ間のデータ共有の実装

ボリュームとは何ですか?ボリュームは英語で容量を意味し、Docker ではデータ ボリューム、つまり...

Docker を使用して開発環境を構築する方法 (Windows および Mac)

目次1. Dockerを使用する利点2. Dockerをインストールする1) LinuxにDocke...

Linux インストール Redis 実装プロセスとエラー解決

今日、redis をインストールしたところ、今までになかったいくつかのエラーが発生しました。ここで記...

Linux システムのユーザー管理コマンドの概要

ユーザーとグループの管理1. ユーザーとグループの基本概念ユーザーとグループ:システム上のすべてのプ...

mysql5.7.17 zip の解凍とインストールの詳細な手順

1. ダウンロードアドレスhttps://dev.mysql.com/downloads/mysql...

CentOS 上での MySQL 5.6 のコンパイルとインストール、および複数の MySQL インスタンスのインストールの詳細な説明

--1. mysql用の新しいグループとユーザーを作成する # ユーザー追加 -M -s /sbin...

IE6 および IE7 で DIV コンテナの固定高さを使用するためのヒント

IE6 と IE7 では CSS の解釈に多くの違いがあります。今日はそのうちの 1 つである高さに...