2. 詳しい説明全体的な考え方は、ログイン > 成功後にユーザー情報に基づいてメニューを取得 > メニューに基づいてルーティング情報を生成するというものです。 2.1. asyncRoutesルーティングを追加するバックエンドによって取得されたメニューに対応するルーティング情報を格納するために、vue-router パス エクスポートconst asyncRoutes = [ { パス: '*'、リダイレクト: '/404'、非表示: true } ] constantRoutes と asyncRoutes の違い constantRoutes: ログイン ページ、404 ページ、その他の一般的なページなど、動的な権限の決定を必要としないルート。 asyncRoutes: 動的な権限判断とaddRoutesによる動的に追加されたページが必要 2.2. 新しいpermission.jsファイルを作成するvuex パス '@/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 を使用している場合は、 '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 パス メニュールート: 状態 => state.permission.routes 2.5. メニュー生成データのソースを変更するパス ルート() { // this.$router.options.routes を返します this.$store.getters.menusRoutes を返します }, ここまでで、バックエンドからメニューデータを取得してページを表示するまでのロジックは完成しました。次はログイン後に呼び出してみましょう。 2.6. ログイン後にメニューを表示するvuex パス // メニューを取得します。他のファイルでアクションを呼び出す場合は、{root: true}を追加する必要があります。 ディスパッチ('permission/generateRoutes', データ, { ルート: true }).then((accessRoutes) => { ルータ.addRoutes(アクセスルート) }) 2.7. 更新後にページが空白になる問題を解決する上記の内容で、ログイン後に左側のメニューを表示する機能は実現できますが、ページを更新するたびにページが空白になることがわかります。これは、ページが更新されると、vue インスタンスが再ロードされ、vuex ストア内のデータが再割り当てされ、vuex 内のルーティング情報がクリアされるためです。 const accessRoutes = store.dispatch('permission/generateRoutes', store.getters.token) を待機します ルータ.addRoutes(アクセスルート) 次({ ...to, 置き換え: true }) 3. まとめこれまでに、ユーザー情報に基づいたメニューコンテンツの動的な取得が完了しました。 vue-element-admin フレームワークを使用してバックエンドから動的にメニューを取得する方法についての記事はこれで終わりです。vue-element-admin 動的メニュー取得に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き閲覧してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: Docker に Kong ゲートウェイをインストールする方法の例
この記事では、MySQLバージョン5.7のインストール方法と使用方法、およびデータベースデータの保存...
Nginx Rewriteの使用シナリオ1. URL アドレスジャンプ。たとえば、ユーザーが pm....
この記事では、JavaScriptシミュレーション計算機の具体的なコードを参考までに紹介します。具体...
どの DBMS でも、インデックスは最適化にとって最も重要な要素です。データ量が少ない場合、適切なイ...
CentOS 8 がリリースされてから随分経ちました。Linux 仮想マシンをいじっている人間として...
目次シングルスレッド非同期シングルスレッドしかし、開発中にネットワーク リクエストやスケジュールされ...
この記事では、WeChatアプレットで写真を撮ったり、アルバムから写真を選択したりするための具体的な...
目次シーン紹介プラグインの実装問題1: 重複したヘッダーコンポーネント質問2: 別の実装アイデア質問...
目次1. クラス1.1 コンストラクタ() 1.2 ゲッターとセッター1.3 これ1.4 静的プロパ...
1. 準備ミドルウェア: Tomcat、Redis、Nginx Jar パッケージ: commons...
初めてこのエッセイを使ったとき、私はかなりぎこちなく感じましたhtmlファイルコードをコピーコードは...
Zhihu Discovery コラムのタイトル画像は、通常、以下のように表示されます。明らかに、グ...
HTML 初心者は、ファイルを正しく参照する方法という問題によく遭遇します。たとえば、HTML ペー...
背景開発やデバッグには Chrome Dev Tools がよく使用されますが、ページのパフォーマン...
目次地図フィルターいくつかの毎インデックスを検索パイプ参考回答1. パラメータを受け入れる関数を返す...