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. msyqlの高速バージョンをダウンロードする docker pull hub.c.163.co...
1.MySQLのバージョン [root@clq システム]# mysql -v MySQL モニター...
まず、いくつかの概念を明確にします。 JDBC: Javaデータベース接続、Oricalによって規定...
1. はじめにMySQL グループ レプリケーション (略して MGR) は文字通り MySQL グ...
CSS3 を使用して、クールなレーダースキャン画像を実現します。 コード上で直接: // インデック...
これらの仕様は、下位互換性のあるドキュメントを Web 上で公開し、できるだけ幅広いユーザーがアクセ...
序文Docker と VS Code を使用すると、ローカル開発環境全体を最適化し、プロジェクトの進...
方法1: SET PASSWORDコマンドを使用する mysql> username@loca...
PHP7 がリリースされてからかなり時間が経ちますが、パフォーマンスが大幅に向上したことはよく知られ...
目次1. MySQLインデックスの紹介2. MySQLの5種類のインデックスの詳しい説明1. 総合索...
SQL (Structured Query Language) ステートメント、つまり構造化クエリ言...
仮想マシンソフトウェア: VMware Workstationイメージ: deepin-deskto...
MySQL への接続時に発生する 1449 および 1045 例外の解決方法 mysql 1449:...
同時アクセスの場合、非反復読み取りやその他の読み取り現象が発生する可能性があります。高い同時実行性に...