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

推薦する

Alibaba Cloud ESC サーバー シングルノード MySQL の Docker デプロイメント

1. msyqlの高速バージョンをダウンロードする docker pull hub.c.163.co...

MySQL5.7 シングルインスタンス自動起動サービスの設定プロセス

1.MySQLのバージョン [root@clq システム]# mysql -v MySQL モニター...

...

JDBC を使用して Mysql データベースに接続する際に発生する可能性のある問題の概要

まず、いくつかの概念を明確にします。 JDBC: Javaデータベース接続、Oricalによって規定...

MySQL 8.0.15 で MGR シングル マスターと複数スレーブを構成する方法

1. はじめにMySQL グループ レプリケーション (略して MGR) は文字通り MySQL グ...

CSS3 レーダースキャンマップのサンプルコード

CSS3 を使用して、クールなレーダースキャン画像を実現します。 コード上で直接: // インデック...

ウェブ標準学習リソースの素晴らしいコレクション

これらの仕様は、下位互換性のあるドキュメントを Web 上で公開し、できるだけ幅広いユーザーがアクセ...

開発にVscodeとdockerを組み合わせて使用​​する詳細なプロセス

序文Docker と VS Code を使用すると、ローカル開発環境全体を最適化し、プロジェクトの進...

MySQLでルートユーザーのパスワードを変更する方法

方法1: SET PASSWORDコマンドを使用する mysql> username@loca...

Dockerを使用してサーバー上で複数のPHPバージョンを実行する

PHP7 がリリースされてからかなり時間が経ちますが、パフォーマンスが大幅に向上したことはよく知られ...

MySQLデータベースインデックスの詳細な説明

目次1. MySQLインデックスの紹介2. MySQLの5種類のインデックスの詳しい説明1. 総合索...

MySQL ステートメントの配置と概要の紹介

SQL (Structured Query Language) ステートメント、つまり構造化クエリ言...

VMware仮想マシンにdeepin20をインストールする最も完全で詳細なプロセス

仮想マシンソフトウェア: VMware Workstationイメージ: deepin-deskto...

MySQL への接続時に発生する 1449 および 1045 例外の解決方法

MySQL への接続時に発生する 1449 および 1045 例外の解決方法 mysql 1449:...

MySQLデータベースのロック機構の分析

同時アクセスの場合、非反復読み取りやその他の読み取り現象が発生する可能性があります。高い同時実行性に...