ホームページ  >  記事  >  ウェブフロントエンド  >  vue iview は動的ルーティングを作成します

vue iview は動的ルーティングを作成します

php中世界最好的语言
php中世界最好的语言オリジナル
2018-06-08 10:50:412118ブラウズ

今回は、vue iview で動的ルーティングを作成する方法をお届けします。vue iview で動的ルーティングを作成する際の注意点は何ですか?実際の事例を見てみましょう。

目標を達成する

クライアントはサーバーからルーティングと権限のデータを取得した後、プロジェクトのルーティングとメニューのリストを更新し、権限を制御します。

プロジェクトの基礎

  • 基本フレームワーク: iview コンポーネント ライブラリ 公式テンプレート プロジェクト iview-admin のテンプレート ブランチ プロジェクト、このプロジェクトは iview-admin の基本フレームワーク コードです。プロジェクトアドレス: iview-admin

実装ロジック

動的ルーティング制御の読み込み

一般に、動的ルーティング制御は2つのタイプに分けられます。1つは、すべてのルーティングデータをローカルファイルに保存し、その後取得するものです。サーバーからユーザーの権限情報を取得し、ルートジャンプ時の権限判定フックを追加します。ユーザーが遷移したページが権限リストにない場合、ジャンプを禁止します。もう 1 つは、エラー処理ページや権限なし制御ページなどの基本ルートのみをローカルに保存し、サーバーはユーザーの権限に基づいて対応するルーティング データを発行し、クライアントはこれらを使用します。ルーティング用のデータは動的に生成および追加されるため、この記事では 2 番目の方法を使用します。

iview-admin プロジェクトはルートを 3 つのタイプに分けます:

  • メインコンポーネントのサブページとして表示されないページルート (ログイン、404、403、およびサブとしてのその他のエラーページルート)。 - メインコンポーネントのページ。otherRouter は表示されますが、ホームページのルーティングなど、メインコンポーネントのサブページとして表示され、左側のメニューに表示されます。

  • ルーティング データを取得した後、主に 2 つのことを行います。操作の一部、最初の部分はデータを走査し、コンポーネントの非同期読み込みメソッドを使用して各ルーティング ノードに対応するコンポーネントを読み込み、ページ タグを使用します。

    フレームワークの下で appRouter を走査してルーティング情報を取得するパンくずリスト ナビゲーションも必要です。ルーティング データはグローバル アクセスのために vuex に保存されます。

  • 404 ページが静的ルートの場合、初めてページに入ったときは動的ルートがまだロードされていないことに注意してください。ルーティング アドレスが見つからない場合は、そのページにジャンプします。デフォルトでは 404 エラー ページが表示され、エクスペリエンスが非常に悪いため、404 ルートは最初にルーティング ルールに書き込まれず、動的ルーティングと一緒に読み込まれます。
  • メインコードは次のように実装されます:

  • データリクエストとルーティングノード生成
//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="&#39;add&#39;">添加</Button>
  <Button v-hasPermission="&#39;edit&#39;">修改</Button>
  <Button v-hasPermission="&#39;del&#39;">删除</Button>
 </p>
</template>

グローバル登録コンポーネント

// main.js
import hasPermission from '@/libs/hasPermission.js';
Vue.use(hasPermission);
この権限制御方式の利点は、管理構成もページ処理ロジックも比較的シンプルで、コード判定やノード処理の繰り返しが少ないことです。個人的にはこの方法をお勧めします。

ページタグとブレッドクラムナビゲーション

私の意見では、ページタグとブレッドクラムはシステム内のページ関連コントロールのおまけであり、ページ管理の利便性を向上させます。これら 2 つは iview 公式に実装されています。管理プロジェクトのコンポーネント。したがって、このプロジェクトではコンポーネントの機能を移植して実装しただけであり、詳細な理解はできませんでした。興味のある方はじっくり学習してください。

この記事の事例を読んだ後は、この方法を習得したと思います。さらに興味深い情報については、php 中国語 Web サイトの他の関連記事に注目してください。

推奨読書:

sort息子データを並べ替える方法

vueのdefineProperty属性の使用

以上がvue iview は動的ルーティングを作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。