ホームページ > 記事 > ウェブフロントエンド > vue iview は動的ルーティングを作成します
今回は、vue iview で動的ルーティングを作成する方法をお届けします。vue iview で動的ルーティングを作成する際の注意点は何ですか?実際の事例を見てみましょう。
目標を達成する
クライアントはサーバーからルーティングと権限のデータを取得した後、プロジェクトのルーティングとメニューのリストを更新し、権限を制御します。
プロジェクトの基礎
基本フレームワーク: iview コンポーネント ライブラリ 公式テンプレート プロジェクト iview-admin のテンプレート ブランチ プロジェクト、このプロジェクトは iview-admin の基本フレームワーク コードです。プロジェクトアドレス: iview-admin
実装ロジック
動的ルーティング制御の読み込み
一般に、動的ルーティング制御は2つのタイプに分けられます。1つは、すべてのルーティングデータをローカルファイルに保存し、その後取得するものです。サーバーからユーザーの権限情報を取得し、ルートジャンプ時の権限判定フックを追加します。ユーザーが遷移したページが権限リストにない場合、ジャンプを禁止します。もう 1 つは、エラー処理ページや権限なし制御ページなどの基本ルートのみをローカルに保存し、サーバーはユーザーの権限に基づいて対応するルーティング データを発行し、クライアントはこれらを使用します。ルーティング用のデータは動的に生成および追加されるため、この記事では 2 番目の方法を使用します。
iview-admin プロジェクトはルートを 3 つのタイプに分けます:
メインコンポーネントのサブページとして表示されないページルート (ログイン、404、403、およびサブとしてのその他のエラーページルート)。 - メインコンポーネントのページ。otherRouter は表示されますが、ホームページのルーティングなど、メインコンポーネントのサブページとして表示され、左側のメニューに表示されます。
フレームワークの下で appRouter を走査してルーティング情報を取得するパンくずリスト ナビゲーションも必要です。ルーティング データはグローバル アクセスのために vuex に保存されます。
メインコードは次のように実装されます:
//util.js //生成路由 util.initRouter = function (vm) { const constRoutes = []; const otherRoutes = []; // 404路由需要和动态路由一起注入 const otherRouter = [{ path: '/*', name: 'error-404', meta: { title: '404-页面不存在' }, component: 'error-page/404' }]; // 模拟异步请求 util.ajax('menu.json').then(res => { var menuData = res.data; util.initRouterNode(constRoutes, menuData); util.initRouterNode(otherRoutes, otherRouter); // 添加主界面路由 vm.$store.commit('updateAppRouter', constRoutes.filter(item => item.children.length > 0)); // 添加全局路由 vm.$store.commit('updateDefaultRouter', otherRoutes); // 刷新界面菜单 vm.$store.commit('updateMenulist', constRoutes.filter(item => item.children.length > 0)); }); }; //生成路由节点 util.initRouterNode = function (routers, data) { for (var item of data) { let menu = Object.assign({}, item); menu.component = lazyLoading(menu.component); if (item.children && item.children.length > 0) { menu.children = []; util.initRouterNode(menu.children, item.children); } //添加权限判断 meta.permission = menu.permission ? menu.permission : null; //添加标题 meta.title = menu.title ? menu.title : null; menu.meta = meta; } };
router.addRoutes(routes)
完成路由列表的动态添加;第二部分是因为 iview-admin
動的読み込みコンポーネント
//lazyLoading.js export default (url) =>()=>import(`@/views/${url}.vue`) Store缓存实现 //app.js // 动态添加主界面路由,需要缓存 updateAppRouter (state, routes) { state.routers.push(...routes); router.addRoutes(routes); }, // 动态添加全局路由,不需要缓存 updateDefaultRouter (state, routes) { router.addRoutes(routes); }, // 接受前台数组,刷新菜单 updateMenulist (state, routes) { state.menuList = routes; }最終的にmain.jsで呼び出される
//main.js mounted () { // 调用方法,动态生成路由 util.initRouter(this); }
権限制御
動的ルーティングの実装と同様操作許可制御には大きく分けて 2 種類あり、1 つはページ表示時に許可を制御しない、操作開始時に許可判定を行う方法です。 2 番目の方法は、ページの読み込み時に権限を判断し、権限のない操作は表示されません。私は、ユーザーに誤解を与えない 2 番目の方法を好みます。個人的には、ユーザーに表示されるものが操作可能であるべきだと考えています。そうしないと、ボタンをクリックした後に許可がないとメッセージが表示されるのは非常に不快です。
このプロジェクトのアイデアのソースは、参照ブログ投稿にあります。元のブロガーの具体的なアイデアは、ルーティング構造のメタ フィールドにユーザー操作権限のリストを追加し、グローバル コマンドを登録するというものです。ノードが初めてレンダリングされ、ページに権限があるかどうかを確認し、権限が存在し、渡されたパラメータが権限リストにない場合は、ノードを直接削除します。 メインコードは次のように実装されます:ルーティングデータに許可フィールドを追加して許可リストを保存します
//menu.json,模拟异步请求数据 [ { "path": "/groupOne", "icon": "ios-folder", "name": "system_index", "title": "groupOne", "component": "Main", "children": [ { "path": "pageOne", "icon": "ios-paper-outline", "name": "pageOne", "title": "pageOne", "component": "group/page1/page1", "permission":["del"] }, ... ] } ]ルーティングノードを生成するためにトラバースするとき、ルーティングノードのメタ属性に許可フィールドデータを保存します
//util.js //生成路由节点 util.initRouterNode = function (routers, data) { for (var item of data) { .... //添加权限判断 meta.permission = menu.permission ? menu.permission : null; ... } };グローバルコマンドコンポーネントを定義します。「ルート許可属性値を取得して許可リストを取得します」を参照してください。許可が許可リストにない場合は、ノードを削除します
//hasPermission.js const hasPermission = { install (Vue, options) { Vue.directive('hasPermission', { bind (el, binding, vnode) { let permissionList = vnode.context.$route.meta.permission; if (permissionList && permissionList.length && !permissionList.includes(binding.value)) { el.parentNode.removeChild(el); } } }); } }; export default hasPermission;許可コンポーネントの使用例:
<template> <p> <h1>page1</h1> <Button v-hasPermission="'add'">添加</Button> <Button v-hasPermission="'edit'">修改</Button> <Button v-hasPermission="'del'">删除</Button> </p> </template>
グローバル登録コンポーネント
// main.js import hasPermission from '@/libs/hasPermission.js'; Vue.use(hasPermission);この権限制御方式の利点は、管理構成もページ処理ロジックも比較的シンプルで、コード判定やノード処理の繰り返しが少ないことです。個人的にはこの方法をお勧めします。
ページタグとブレッドクラムナビゲーション
私の意見では、ページタグとブレッドクラムはシステム内のページ関連コントロールのおまけであり、ページ管理の利便性を向上させます。これら 2 つは iview 公式に実装されています。管理プロジェクトのコンポーネント。したがって、このプロジェクトではコンポーネントの機能を移植して実装しただけであり、詳細な理解はできませんでした。興味のある方はじっくり学習してください。
この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。
推奨読書:
以上がvue iview は動的ルーティングを作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。