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 ゲートウェイをインストールする方法の例
コードと同様に、テーブルや列にコメントを追加して、他のユーザーがその機能を理解できるようにすることが...
目次1. メニューをクリックしてジャンプ1. ページ名の統一2. 管理ページを追加3. ルートを追加...
まず、Alipay サンドボックスから一連のものをダウンロードします。多くのブログで取り上げられてお...
1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...
1. ビューポートの概要モバイル ブラウザは通常、画面よりも幅の広い仮想ウィンドウにページをレンダリ...
MySQL インデックスの確立は、MySQL の効率的な操作にとって非常に重要です。インデックスによ...
ドキュメント モードには次の 2 つの機能があります。 1. HTML文書を解析するためにどのHTM...
1. vue2 での従来の書き方 // 親コンポーネントは 'foo' を提供します...
この記事では、オンラインアナウンスのスクロール効果を実現するためのJSの具体的なコードを参考までに共...
序文最近、仕事の都合で、約 1000w の大量のデータを MySQL に挿入する必要があり、時間がか...
目次概要ブロブBlob の動作BLOB ダウンロード ファイルブロブ画像のローカル表示BLOB ファ...
目次コードの最適化v-for でキーを使用するv-if/v-else-if/v-else でキーを使...
目次方法1方法2 nginxをインストールした後、PHPコードを解析できないことがわかりました。解決...
1. ネットワークの最適化YSlowには23のルールがあります。これら数十のルールは、主に、不要な...
この記事は、Free Code Camp の基本アルゴリズム スクリプト「文字列内の最長の単語を見つ...