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

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

推薦する

MySQLソースコマンドの使い方の紹介

目次ネット上の質問から生まれた思考MySQL ソースコマンドネット上の質問から生まれた思考今日仕事中...

CSS 要素で計算されたスタイルを取得します (カスケード/最終スタイル後)

CSS 要素内の計算されたスタイル (つまり、カスケード後の最終的なスタイル) を取得するには、W3...

Dockerでコンテナを作成するときにコンテナIPを指定する実装例

Docker はコンテナを作成するときに、デフォルトでブリッジ ネットワークを使用し、IP アドレス...

ボタンをEnterキーに関連付けるjsコード

コードをコピーコードは次のとおりです。 <html> <ヘッド> <ス...

Javascript フロントエンド最適化コード

目次if判定の最適化1. 最も簡単な方法:判断2. より良い方法: スイッチ3. より良いアプローチ...

Ubuntu 20.04 デスクトップのインストールとルート権限の有効化および SSH インストールの詳細

記事は主にUbuntu 20.04の簡単なインストールプロセスを記録し、インストール後に国内ソースを...

MySQL ストアド プロシージャと共通関数のコード分析

mysql ストアド プロシージャの概念:特定のタスク (クエリと更新) を実行できる、データベース...

Typescriptを使用してWeChatミニプログラムでプロジェクトを作成する方法

プロジェクトを作成するWeChat開発者ツールでプロジェクトを作成し、言語でTypeScriptを選...

デザイン協会: なぜ間違った場所を探したのですか?

数日前、バスで仕事に行きました。バスのカードリーダーの実際の使用シーンを実際に見て、カードリーダーの...

JS における for、for...in、for...of、forEach の違いと使用例

forループ基本的な構文形式: for(変数の初期化; 条件式; 演算式){ループ本体ステートメント...

自動ヘルスレポートを実現するDocker+Selenium方式

この記事では、ある大学の健康報告システムを例に、Web 側の自動化操作を完成させます。使用したテクノ...

Vue3.0 でページング コンポーネントを手動でカプセル化する方法

この記事では、vue3.0の手動カプセル化ページングコンポーネントの具体的なコードを参考までに紹介し...

CSS を使用して、画像に 3D の凸型と凹型のエフェクト (フレーム外に凸型、またはフレーム内に凹型) を実現します。

Ⅰ. 問題の説明: CSS を使用して画像の 3D 凸凹効果を実現します。 Ⅱ実施手順は以下のとお...

Vueは虫眼鏡付きの検索ボックスを実装します

この記事では、Vueを使用して虫眼鏡付きの検索ボックスを実装する方法を紹介します。具体的な内容は次の...

MySQL 文字セットの概要

目次文字セット比較ルール4つのレベルの文字セットと比較規則3つのシステム変数このノートは主にMySQ...