vue-element-adminフレームワークを使用して、バックエンドからメニュー機能を動的に取得します。

vue-element-adminフレームワークを使用して、バックエンドからメニュー機能を動的に取得します。

2. 詳しい説明

全体的な考え方は、ログイン > 成功後にユーザー情報に基づいてメニューを取得 > メニューに基づいてルーティング情報を生成するというものです。

2.1. asyncRoutesルーティングを追加する

バックエンドによって取得されたメニューに対応するルーティング情報を格納するために、vue-router パスsrc\router\index.jsに asyncRoutes 配列を追加します。

エクスポートconst asyncRoutes = [
  { パス: '*'、リダイレクト: '/404'、非表示: true }
] 

constantRoutes と asyncRoutes の違い

constantRoutes: ログイン ページ、404 ページ、その他の一般的なページなど、動的な権限の決定を必要としないルート。

asyncRoutes: 動的な権限判断とaddRoutesによる動的に追加されたページが必要

2.2. 新しいpermission.jsファイルを作成する

vuex パスsrc\store\modules\permission.jsの下に新しい permission.js ファイルを作成します。この操作は最も重要なステップであり、主にバックエンドからメニューを照会し、ルートを生成します。

'@/router' から { asyncRoutes, constantRoutes } をインポートします。
'@/api/user' から { fetchUserMenuList } をインポートします。
'@/layout' からレイアウトをインポートします

/**
 * 静的ルートの遅延読み込み * @param ビュー形式はスラッシュなしの xxx/xxx で始まる必要があります * @returns 
 */
エクスポートconst loadView = (view) => {
  戻り値 (解決) => require([`@/views/${view}.vue`], 解決)
}

/**
 * バックエンドからクエリされたメニューデータをルーティング形式のデータに組み立てる* @paramroutes
 * @param data バックエンドから返されるメニューデータ */
エクスポート関数generaMenu(ルート、データ) {
  データ.forEach(アイテム => {
    const メニュー = {
      パス: item.url、 
      コンポーネント: item.component === '#' ? レイアウト: loadView(item.component), 
      hidden: item.status === 0, // ステータス 0 の非表示リダイレクト: item.redirect,
      子供たち: []、
      名前: アイテムコード、
      メタ: アイテム.meta
    }

    if (item.children) {
      generaMenu(メニュー.children、アイテム.children)
    }
    ルート.push(メニュー)
  })
  帰りのルート
}

定数状態 = {
  ルート: [],
  ルートを追加: []
}

const 変異 = {
  SET_ROUTES: (状態、ルート) => {
    state.addRoutes = ルート
    // 静的ルートと動的ルートを連結する state.routes = constantRoutes.concat(routes)
  }
}

定数アクション = {
  generateRoutes({ commit }, トークン) {
    新しいPromiseを返します(resolve => {
      // トークンを介してバックエンドからユーザーメニューを取得し、それをグローバル状態に追加します fetchUserMenuList(token).then(res => {
        const menuData = Object.assign([], res.data)
        const tempAsyncRoutes = Object.assign([], asyncRoutes)
        const accessedRoutes = generaMenu(tempAsyncRoutes、menuData)

        commit('SET_ROUTES', アクセスされたルート)
        解決(アクセスされたルート)
      }).catch(エラー => {
        コンソール.log(エラー)
      })
    })
  }
}

エクスポートデフォルト{
  名前空間: true、
  州、
  突然変異、
  アクション
}

2.3. vuexにパーミッションモジュールを登録する

vue-element-admin を使用している場合は、 src\store\modulesの下にあるすべてのモジュールがsrc\store\index.jsに自動的に登録されるため、この手順をスキップしてください。 vue-element-template を使用している場合は、admin を参照して index.js ファイルを変更するか、手動でインポートすることができます。

'vue' から Vue をインポートします
'vuex' から Vuex をインポートします
'./getters' からゲッターをインポートします

Vue.use(Vuex)

// https://webpack.js.org/guides/dependency-management/#requirecontext
const modulesFiles = require.context('./modules', true, /\.js$/)

// `import app from './modules/app'` は必要ありません
// モジュールファイルからすべての vuex モジュールを自動的に要求します
const モジュール = modulesFiles.keys().reduce((モジュール、モジュールパス) => {
  // './app.js' を 'app' に設定
  定数 moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
  定数値 = modulesFiles(modulePath)
  モジュール[モジュール名] = 値.default
  リターンモジュール
}, {})

定数ストア = 新しい Vuex.Store({
  モジュール、
  ゲッター
})

デフォルトストアをエクスポート

2.4. ゲッターにルーティングステータスを追加する

vuex パスsrc\store\getters.jsに menuRoutes 状態を追加します。

メニュールート: 状態 => state.permission.routes 

2.5. メニュー生成データのソースを変更する

パスsrc\layout\components\Sidebar\index.vue元のデータ ソースはルーティングであり、vuex から取得されるように変更されます。

ルート() {
      // this.$router.options.routes を返します
      this.$store.getters.menusRoutes を返します
    }, 

​ここまでで、バックエンドからメニューデータを取得してページを表示するまでのロジックは完成しました。次はログイン後に呼び出してみましょう。

2.6. ログイン後にメニューを表示する

vuex パスsrc\store\modules\user.jsのログインメソッドに、ログイン成功後にトークンを介してメニューを取得してルーティングを生成するロジックを追加します。

 // メニューを取得します。他のファイルでアクションを呼び出す場合は、{root: true}を追加する必要があります。
          ディスパッチ('permission/generateRoutes', データ, { ルート: true }).then((accessRoutes) => {
            ルータ.addRoutes(アクセスルート)
          }) 

2.7. 更新後にページが空白になる問題を解決する

​上記の内容で、ログイン後に左側のメニューを表示する機能は実現できますが、ページを更新するたびにページが空白になることがわかります。これは、ページが更新されると、vue インスタンスが再ロードされ、vuex ストア内のデータが再割り当てされ、vuex 内のルーティング情報がクリアされるためです。

src\permission.jsにルートを取得するためのコードを追加します。

const accessRoutes = store.dispatch('permission/generateRoutes', store.getters.token) を待機します
          ルータ.addRoutes(アクセスルート)
          次({ ...to, 置き換え: true })

3. まとめ

これまでに、ユーザー情報に基づいたメニューコンテンツの動的な取得が完了しました。

vue-element-admin フレームワークを使用してバックエンドから動的にメニューを取得する方法についての記事はこれで終わりです。vue-element-admin 動的メニュー取得に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue のルーティングの動的追加とメニューメソッドの生成の例
  • バックエンドの権限に基づいてナビゲーション メニューを動的に生成する Vue-router のサンプル コード
  • Vue サイドバーでサブメニューを動的に生成する方法
  • Vueはどのようにしてバックグラウンドからデータを取得して動的なメニューリストを生成するのか

<<:  MySQLの権限とインデックスの詳細な説明

>>:  Docker に Kong ゲートウェイをインストールする方法の例

推薦する

MySQL 5.7.15 バージョンのインストールと設定方法のグラフィックチュートリアル

この記事では、MySQLバージョン5.7のインストール方法と使用方法、およびデータベースデータの保存...

Nginx Rewrite の使用シナリオとコード例の詳細な説明

Nginx Rewriteの使用シナリオ1. URL アドレスジャンプ。たとえば、ユーザーが pm....

JavaScript シミュレーション計算機

この記事では、JavaScriptシミュレーション計算機の具体的なコードを参考までに紹介します。具体...

MySQLの複合インデックス方式の詳細な説明

どの DBMS でも、インデックスは最適化にとって最も重要な要素です。データ量が少ない場合、適切なイ...

Hyper-V インストール CentOS 8 の問題の分析

CentOS 8 がリリースされてから随分経ちました。Linux 仮想マシンをいじっている人間として...

JS の 3 つの主要な問題、非同期性とシングルスレッドについて簡単に説明します。

目次シングルスレッド非同期シングルスレッドしかし、開発中にネットワーク リクエストやスケジュールされ...

WeChatアプレットは写真の撮影とアルバムからの写真の選択を実現します

この記事では、WeChatアプレットで写真を撮ったり、アルバムから写真を選択したりするための具体的な...

Vueプラグインの実装で発生した問題の概要

目次シーン紹介プラグインの実装問題1: 重複したヘッダーコンポーネント質問2: 別の実装アイデア質問...

フロントエンドJavaScriptのクラス

目次1. クラス1.1 コンストラクタ() 1.2 ゲッターとセッター1.3 これ1.4 静的プロパ...

Tomcat Nginx Redis セッション共有プロセス図

1. 準備ミドルウェア: Tomcat、Redis、Nginx Jar パッケージ: commons...

HTMLページ間で値を渡す問題の解決策

初めてこのエッセイを使ったとき、私はかなりぎこちなく感じましたhtmlファイルコードをコピーコードは...

CSS で透明なグラデーション効果を実装するためのサンプルコード

Zhihu Discovery コラムのタイトル画像は、通常、以下のように表示されます。明らかに、グ...

HTML の相対パスと絶対パスの違いの分析

HTML 初心者は、ファイルを正しく参照する方法という問題によく遭遇します。たとえば、HTML ペー...

Chrome Dev Tools を使用してページのパフォーマンスを分析する方法 (フロントエンドのパフォーマンス最適化)

背景開発やデバッグには Chrome Dev Tools がよく使用されますが、ページのパフォーマン...

JavaScript Reduceの詳しい説明

目次地図フィルターいくつかの毎インデックスを検索パイプ参考回答1. パラメータを受け入れる関数を返す...