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 ゲートウェイをインストールする方法の例

推薦する

ウェブページの表の分割線を削除する方法

<br />Web テーブルの分割線を削除する方法。実際、上記の 3 つの表はいずれも ...

dockerでopenGaussデータベースを構成する方法の詳細な説明

Windowsユーザー向けDocker で openGauss を使用するopenGaussイメージ...

重複したMySQLテーブルをマージして削除する簡単な方法

シナリオ:クロールされたデータは、別のメインテーブルと同じ構造を持つデータテーブルを生成するため、マ...

AngularパイプラインPIPEの紹介と使い方

序文PIPE、パイプラインと翻訳されます。 Angular パイプは、HTML コンポーネントで宣言...

MySQLパーティションテーブルの詳細な説明

序文:パーティショニングはテーブル設計パターンです。一般的に、テーブル パーティショニングとは、条件...

jsは動的にテーブルを生成します(ノード操作)

この記事の例では、テーブルを動的に生成するjsの具体的なコードを参考までに共有しています。具体的な内...

アコーディオン効果を実現するJavaScript

この記事では、アコーディオン効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

WeChatミニプログラム公式顔認証の詳しい説明

ミニプログラムはユーザーの個人情報を収集してアップロードしましたが、拒否されました。こんにちは、ミニ...

MySQL イベント スケジューラに関するよくある話 (必読)

概要MySQL には独自のイベント スケジューラもあり、これは Linux の crontab ジョ...

ORM モデル フレームワークを使用して MySQL データベースを操作する方法

ORM とは何ですか? ORM は Object Relational Mapping の略で、オブ...

MySQLデータベースはsysbenchに基づくOLTPベンチマークテストを実装します

Sysbench は、MySQL データベース ストレージ エンジン InnoDB のディスク I/...

WeChat アプレットのカスタム スクロール ビューのサンプル コード

ミニプログラムカスタムスクロールビュースクロールバーさっそくレンダリングを見てみましょうレンダリング...

vue3.0プロジェクトアーキテクチャを段階的に構築する方法を教えます

目次序文: 1. vue-cliでプロジェクトを作成する2. ルーターをインストールする3. ディレ...

Docker を使用した war パッケージ プロジェクトのデプロイの実装

Docker で war をデプロイするには、コンテナを使用する必要があります。ここでは tomca...

MySql の 4 つのトランザクション分離レベルについて簡単に説明します。

分離レベル:隔離はあなたが考えるよりも複雑です。 SQL 標準では 4 つの分離レベルが定義されてお...