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 テーブルと列のコメントの概要

コードと同様に、テーブルや列にコメントを追加して、他のユーザーがその機能を理解できるようにすることが...

Vue3 ページ、メニュー、ルートの使用

目次1. メニューをクリックしてジャンプ1. ページ名の統一2. 管理ページを追加3. ルートを追加...

Vue+SpringBoot で Alipay サンドボックス決済を実装するためのサンプルコード

まず、Alipay サンドボックスから一連のものをダウンロードします。多くのブログで取り上げられてお...

LinuxにNginxをインストールする詳細な手順

1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...

ビューポートの基本原理と詳細な使用方法

1. ビューポートの概要モバイル ブラウザは通常、画面よりも幅の広い仮想ウィンドウにページをレンダリ...

MySQL インデックスの知識の要約

MySQL インデックスの確立は、MySQL の効率的な操作にとって非常に重要です。インデックスによ...

HTML doctype の役割の紹介

ドキュメント モードには次の 2 つの機能があります。 1. HTML文書を解析するためにどのHTM...

Vue2は応答性を提供するためにprovide injectを実装しています

1. vue2 での従来の書き方 // 親コンポーネントは 'foo' を提供します...

JSはオンラインでのアナウンスのスクロール効果を実現します

この記事では、オンラインアナウンスのスクロール効果を実現するためのJSの具体的なコードを参考までに共...

MySQL での挿入効率のいくつかの例の比較

序文最近、仕事の都合で、約 1000w の大量のデータを MySQL に挿入する必要があり、時間がか...

JSのバイナリファミリーについての簡単な説明

目次概要ブロブBlob の動作BLOB ダウンロード ファイルブロブ画像のローカル表示BLOB ファ...

22 Vue 最適化のヒント (プロジェクトの実践)

目次コードの最適化v-for でキーを使用するv-if/v-else-if/v-else でキーを使...

nginx のインストールが完了した後に PHP を解析できない問題の解決方法

目次方法1方法2 nginxをインストールした後、PHPコードを解析できないことがわかりました。解決...

フロントエンドネットワーク、JavaScriptの最適化、開発のヒントについて簡単に説明します。

1. ネットワークの最適化YSlowには23のルールがあります。これら数十のルールは、主に、不要な...

JavaScript で文字列内の最長の単語を見つける 3 つの方法 (推奨)

この記事は、Free Code Camp の基本アルゴリズム スクリプト「文字列内の最長の単語を見つ...