実際のメニュー機能を実現するには、Vue+Vue-router+el-menu を使用します。

 

序文

前のセクションの復習

前のセクションでは、 H5+CSS3を使用して管理プラットフォームのアーキテクチャ レイアウトを実現しVuexを使用して、フロントエンド データのローカライズされたストレージのユーザー名を取得し、それを右上隅にバインドしました。グローバル表示。コンテキストを知らない学生は、  Vue+Vuex+CSS3 を使用して管理側のレスポンシブ アーキテクチャ テンプレートを完成させる実際の戦闘を確認できます 。

このセクションでは、

この節はすでにコラムの 10 番目のブログです. Vue-router のルーティング データを引き続き維持および追加します. これらのルートは、その後の実際のビジネスの実際のルートです. いくつかのルートを追加しながら、ElementUI のel-The munuを使用しますコンポーネントは、左メニュー機能の実戦を実現するために使用されます。実際、el-menu を使用することは重要なポイントではありません。基本的な使い方をするだけです。重要なポイントは、独自のtg-menu コンポーネントを実装してel-menu コンポーネントを置き換えることです。一緒に見ていきましょう。

目次

序文

前のセクションの復習

このセクションでは、

1.el-menuコンポーネントによるメニュー機能

1.ルーティングデータを追加する

2. ルーティング属性の概要 

 3. el-menu を導入してメニュー コンポーネントを開発する

2. 自作の tg-menu コンポーネントのメニュー

1. tg-menu コンポーネントを導入する

2. ルーティング データのインポートとメニュー コンポーネント データの維持

3. サブレベルのないメニューとサブレベルのあるメニューを区別する

4. 現在のメニューのハイライト表示

5. tg-munu コンポーネントの完全なコード

6. tg-memu メニュー コンポーネントに含まれる関数 

3. コラム進捗報告

1. 現在のコラムのブログ進行状況

2. フロントエンド部分のコンテンツアーキテクチャの進展

3.コードディレクトリのフロントエンド部分の進捗

4. このセクションを読んだ後に考えるいくつかの質問


1.el-menuコンポーネントによるメニュー機能

1.ルーティングデータを追加する

最初に実際のビジネス データをいくつか追加して、その後のビジネス開発に備えます。書籍管理書評管理新刊推薦学生情報管理学生申請管理のメニューを追加。

前回のブログで紹介したように、私たちの「Vue + SpringBoot フロントエンドとバックエンドの分離プロジェクトの戦闘は、キャンパスの本を借りて導入することを前提としていますが、実際には多くの卒業設計要件の統合と配置について言及しており、学生は、このプロジェクトの実践的な知識とシナリオを学ぶだけでなく、知識を統合した後、将来どのようなプロジェクトを行うか、または卒業デザインの主題に変更を加えることができることを願っています。それらのほとんどはフィールド名やインターフェースなどです. 実際, あなたのニーズが何であれ, 私たちのコラムはすでにそれらを含んでいます. これはこのコラムの利点の一つです.

{
    path: '/layout',
    component: () => import("@/views/Layout"),
    children: [
      {
        path: '/index',                     
        component: () => import("@/views/index/Index"),
        meta: {
          title: '首页'
        },
        fatherTitle: '首页',
        fatherTitleCode: 0,
      },
      {
        path: '/book-manager',                     
        component: () => import("@/views/index/Index"),
        meta: {
          title: '图书管理'
        },
        fatherTitle: '图书管理',
        fatherTitleCode: 1,
      },
      {
        path: '/bookAppraise-manager',                     
        component: () => import("@/views/index/Index"),
        meta: {
          title: '书评管理'
        },
        fatherTitle: '图书管理',
        fatherTitleCode: 1,
      },
      {
        path: '/goodBook-manager',                     
        component: () => import("@/views/index/Index"),
        meta: {
          title: '新书推荐'
        },
        fatherTitle: '图书管理',
        fatherTitleCode: 1,
      },
      {
        path: '/studentInfo-manager',                     
        component: () => import("@/views/index/Index"),
        meta: {
          title: '学生信息管理'
        },
        fatherTitle: '学生管理',
        fatherTitleCode: 2,
      },
      {
        path: '/studentApply-manager',                     
        component: () => import("@/views/index/Index"),
        meta: {
          title: '学生申请管理'
        },
        fatherTitle: '学生管理',
        fatherTitleCode: 2,
      },
    ],
  }

2. ルーティング属性の概要 

レイアウト テンプレートのルーティング コンポーネントの下にルーティングが含まれていることがわかりますが、前のセクションで説明したように、その後のほとんどすべてのビジネスはコンテンツ テンプレートの下で開発されます。ルーティング属性には次のものがあります。

path : ルートの URL。

component : ルーティングに対応するコンポーネント. これらの特定のサービスはまだ言及されていないため、それらはすべて最初にホームページに対応し、後で繰り返し変更されます;

meta : メニュー内のこのルートの特定の表示

FatherTitle : 第 1 レベルのメニューの表示 (meta と FatherTitle を合わせて、ビジネス コンポーネントのブレッドクラムを完成させます)

FatherTitleCode : 属する第 1 レベルのメニューのコード値

 3. el-menu を導入してメニュー コンポーネントを開発する

el-menu は ElementUI の組み込みコンポーネントなので、別途導入する必要はなく、そのまま使うだけです ElementUI コンポーネントについては、前回のブログで紹介しました。現在の第 1 レベルのメニューは、ホームページライブラリ管理、および学生管理であることがわかりますが、ホームページはサブメニューのない第 1 レベルのメニューであり、他の 2 つはサブレベルの第 2 レベルのメニューが含まれているため、/ src/views/layout.vue ファイル 補足コードは次のとおりです。

<aside class="aside-menu">
        <el-menu
          default-active="1">
          <el-menu-item index="1">
            <span slot="title">
              <router-link to="/index">首页</router-link>
            </span>
          </el-menu-item>
          <el-submenu index="2">
            <template slot="title">
              <span>图书管理</span>
            </template>
            <el-menu-item-group>
              <el-menu-item index="1-1">
                <router-link to="/book-manager">图书管理</router-link>
              </el-menu-item>
              <el-menu-item index="1-2">
                <router-link to="/bookAppraise-manager">书评管理</router-link>
              </el-menu-item>
              <el-menu-item index="1-3">
                <router-link to="/goodBook-manager">新书推荐</router-link>
              </el-menu-item>
            </el-menu-item-group>
          </el-submenu>
          <el-submenu index="3">
            <template slot="title">
              <span>学生管理</span>
            </template>
            <el-menu-item-group>
              <el-menu-item index="2-1">
                <router-link to="/studentInfo-manager">学生信息管理</router-link>
              </el-menu-item>
              <el-menu-item index="2-2">
                <router-link to="/studentApply-manager">学生申请管理</router-link>
              </el-menu-item>
            </el-menu-item-group>
          </el-submenu>
        </el-menu>
      </aside>

 

 

2. 自作の tg-menu コンポーネントのメニュー

前に言ったように、サードパーティのコンポーネントに遭遇すると、自分たちでそれらを実装するために最善を尽くします. 自分たちでセットを実装すると、多くの利点があります. 私自身の実装では、問題を解決するための追加の考え方があり、この時点でサードパーティ製コンポーネントのソース コードを読むと、それまでの認識とは異なるはずです。

1. tg-menu コンポーネントを導入する

テンプレート テンプレートでのレイアウト コンポーネント、TgMenu の導入、およびコンポーネントの定義の 3 つのステップがまだあります。

<tg-menu></tg-menu>

<script>
import { mapGetters } from "vuex";
import TgMenu from '@/components/tg-menu.vue';
import { userLogout } from '@/api/login.js';

export default {
  name: 'Layout',
  components: { TgMenu },

2. ルーティング データのインポートとメニュー コンポーネント データの維持

最初に導入されたルーティング データについては、レイアウトの下にあるものだけを取り出して左側のメニューとして表示します. メニューの第 1 レベル、第 2 レベル、さらには複数レベルの表示を容易にするために、上記のfatherTitleCode . 同じfatherTitleCodeは次のように表示されます: 同じモジュールの場合、最終的にデータを次のような構造に処理する必要があります:

3. サブレベルのないメニューとサブレベルのあるメニューを区別する

ホームページにはサブレベルのメニューがなく、ライブラリ管理などのモジュールには独自のメニューがあるため、区別する必要があります.前の手順のデータ形式、この 2 次元配列に基づいて、次のように配列を表示しますonly one sub- elementサブレベル メニューであり、サブレベル メニューには複数のサブ要素が含まれます。同時に、ジャンプする必要があるパスの値、最初のレベルのメニューのFatherTitle の値、および現在のメニューのメタの下のタイトルの値をバインドします。

4. 現在のメニューのハイライト表示

 現在のメニューが選択された状態でなければならないことはわかっています.他の人のために cur-path-style クラス スタイル クラスを追加し、現在のルートをリアルタイムで監視し、現在のルートを使用してこれらのルート データを照合する必要があります。一致する場合は、現在のルートであり、Vue クラスの動的バインディングを行います。

 

5. tg-munu コンポーネントの完全なコード

/src/components/tg-menu.vueファイルを追加し、次のコードを追加します。

<template>
  <div class="tg-menu-box">
    <div v-for="(mitem, mindex) in menu" :key="mindex" class="menu-item-box">
      <template v-if="mitem.length === 1">
        <p :class="['first-title', currentPath===mitem[0]['path'] ? 'cur-path-style' : '']">
          <a :href="'/#' + mitem[0]['path']">
            {
   
   { mitem[0]['fatherTitle'] }}
          </a>
        </p>
      </template>
      <template v-if="mitem.length > 1">
        <p class="first-title" @click="handleMenuClick(mindex)">
          <span>{
   
   { mitem[0]['fatherTitle'] }}</span>
          <i class="el-icon-arrow-down"></i>
        </p>
        <ul v-if="menuBackObj[mindex]['showSon']">
          <li v-for="sitem in mitem" :key="sitem.path" 
            :class="['menu-item-li', currentPath===sitem['path'] ? 'cur-path-style' : '']">
            <a :href="'/#' + sitem['path']">{
   
   { sitem['meta']['title'] }}</a>
          </li>
        </ul>
      </template>
    </div>
  </div>
</template>

<script>
import { routerData } from "../router/routesData";

export default {
  name: 'TgMenu',
  props: {
     
  },
  watch: {
    $route: {
      handler: function (route) {
        this.currentPath = route.path;
      },
      immediate: true,
    },
  },
  data () {
    return {
      menu: [],
      menuBackObj: {},
      currentPath: '',
    }
  },
  created() {
    // 获取会展示在菜单的路由数据
    let menuListData = routerData.find((item) => {
      return item.path === '/layout';
    });
    this.makeData(menuListData.children);
  },
  methods: {
    handleMenuClick(index) {
      let oldMenuBackObj = this.menuBackObj;
      oldMenuBackObj[index]['showSon'] = !oldMenuBackObj[index]['showSon'];
      this.menuBackObj = JSON.parse(JSON.stringify(oldMenuBackObj));
    },
    makeData(menuList) {
      // 菜单数据结构整理
      let menuShowArr = [];
      menuList.forEach((item1) => {
        if (!menuShowArr[item1.fatherTitleCode] || menuShowArr[item1.fatherTitleCode].length === 0) {
          menuShowArr[item1.fatherTitleCode] = [];
          this.menuBackObj[item1.fatherTitleCode] = {}; // 为一级目录添加控制属性
        }
        menuShowArr[item1.fatherTitleCode].push(item1);
        this.menuBackObj[item1.fatherTitleCode] = {
          showSon: false,
        };
      })
      console.log(menuShowArr);
      this.menu = JSON.parse(JSON.stringify(menuShowArr));
    }
  }
}
</script>

<style scoped lang="less">
  .menu-item-box {
    border-bottom: 1px solid #CCC;
  }
  .first-title {
    display: flex;
    justify-content: space-between;
    align-items: center;
    height: 40px;
    cursor: pointer;
    &>a, &>span {
      margin-left: 30px;
      color: #000;
    }
    [class^=el-icon-] {
      margin-right: 20px;
    }
  }
  .menu-item-li {
    height: 40px;
    line-height: 40px;
    &>a {
      margin-left: 50px;
      color: #000;
    }
  }
  .cur-path-style {
    background: #EEEEFF;
    a {
      color: #409EFF;
    }
  }
</style>

6. tg-memu メニュー コンポーネントに含まれる関数 

ここまでで、tg-menu コンポーネントが実装され、基本的にメニュー機能が実装されました。では、tg-menu メニュー コンポーネントにはどのような関数が含まれているのでしょうか?

 

3. コラム進捗報告

Tian Ge ( Tian Ge ホームページ) と私は空いた時間を使ってコラムを作成しています (同時に、これは実際の戦闘プロジェクトでもあります)。Blue Bridge Cupに参加した後、学校でさまざまな専門コースを継続的に学習し、知識ポイントを結び付けて、事前に独自の実践的なプロジェクトを作成できるように、初心者または卒業生が実践的なプロジェクトを実行できるように支援したいと考えますそして、このコラムの記事を 1 つずつ読んでいくと、実際の作業では、ひっくり返ったり、ひっくり返ったり、ひっくり返ったり、ひっくり返ったり、プロダクト マネージャーがひねりを加えたりしているだけであることがわかります。違う方法。このコラムの進捗状況を報告させてください。

1. 現在のコラムのブログ進行状況

Vue + SpringBoot フロントエンド分離プロジェクト 実戦 - フロントエンド部分

CSDN への直接リンク: https://blog.csdn.net/xingyu_qie/category_12222258.html

1. 手をつないで卒業プロジェクトを作る - 旅が始まる
2. テストに合格するには、卒業プロジェクトをどこまで完了させる必要がありますか?
3. 卒業プロジェクトを行うには、フロントエンド部分で6つのコアスキルを習得する必要があります
4.  Vue+Vue-cli+webpack に基づいたプログレッシブで保守性の高いフロントエンド戦闘プロジェクトの構築
5.  Vue+Less+axios packages+ElementUI に基づいて、プロジェクトの基礎となるサポートを構築します
6.  Vue+vue-router+routingguardを使ってルーティング認証機能の実戦を実現
7.  Vue+el-form+form-validate を使用して、管理端末のログイン インターフェイスの共同デバッグ前の準備作業を実現する
8.  Vue+axios+Vuex を使用して、ログイン後のフロントエンド データ ローカリゼーション ストレージの実戦を実現する
9.  Vue+Vuex+CSS3 を使用して、管理側のレスポンシブ アーキテクチャ テンプレートの戦闘を完了します。

SpringBoot+Vue フロントエンドとバックエンドの分離プロジェクト 実際の戦闘サーバー部分

CSDN への直接リンク: https://blog.csdn.net/scm_2008/category_12236048.html

1.  SpringBoot+SpringCloud+Vue フロントエンドとバックエンドの分離プロジェクトに基づく実戦 -- はじまり
2.  1-1. JDK8インストールチュートリアル、環境変数設定
3.  1-2. Mavenのインストール、ウェアハウスの設定
4.  1-3. 開発環境のインストール(フル)
5.  2-1. Maven の 3 層プロジェクト構造の構築
6.  2-2. SpringBoot API開発の詳細解説 ~SpringMVCアノテーション+カプセル化結果+クロスドメイン対応+パッケージング~
7.  2-3. Maven の依存関係を読み込めませんか? 依存関係の読み込みに失敗しましたか? チェック方法を知っておく価値があります
8.  2-4. 実際のGit共通操作(IDEAインターフェース+コマンド)
9.  3-1. SpringBootプロジェクト連携 【ユーザーID認証】実戦 【技術選択】Session、Token、JWTでどう選ぶ?
10.  3-2. SpringBoot プロジェクトの統合 [User Identity Authentication] Actual Combat [Actual Combat Core Articles] JWT に基づくトークンの生成と検証
11.  3-3. SpringBoot プロジェクト統合 【ユーザーID認証】 実戦 【全工程】 ログイン+ログアウト+JWTベースのインターセプタ+ダブルチェック
12.  4-1. centos7 mysql5.7 のインストールとアンインストール

2. フロントエンド部分のコンテンツアーキテクチャの進展

 

3.コードディレクトリのフロントエンド部分の進捗

 

4. このセクションを読んだ後に考えるいくつかの質問

それでも通常の慣行に従って, このセクションを読んだ後に考慮する必要があるいくつかの小さな質問を提案することは非常に重要です. 上記の実際的な内容は無視できると言えます, しかし、これらの小さな質問は考慮する必要があります:

  1. 管理システムとして、左側のメニューとルーティング データをどのように組み合わせますか?
  2. 二次メニューをどのように実装しましたか? マルチレベルメニューはどうですか?
  3. 現在のルートに対応するメニューが選択されていることを確認するには?

さて、これがこのセクションの全内容です. あなたとのコミュニケーションを容易にするために、私は慎重にあなたのために投票セッションを用意しました. 投票しましょう. 

おすすめ

転載: blog.csdn.net/xingyu_qie/article/details/130050161