Vue iview-admin フレームワークで第 2 階層メニューを第 3 階層メニューに変更する方法について
この記事では主に、Vue iview-admin フレームワークの第 2 レベルのメニューを第 3 レベルのメニューに変更する方法を紹介します。内容が非常に優れているので、参考として共有します。
私は最近、iview-admin の Vue バックエンド テンプレートを使用しています。git からダウンロードした後、左側のナビゲーション バーが第 2 レベルのメニューまでサポートしていることがわかりました。また、多くの子供たちが、その実装方法を尋ねていることに気付きました。 3番目のレベルのメニュー。実際のアプリケーションのシナリオでは、依然として 3 レベルのメニューが必要になります。コードを手動で変更する以外に良い方法はありません。
1. ステップ 1: まず、VUE でテンプレートを書き直し、ファイルの特定のディレクトリを以下に示します:
メニュー ナビゲーション メニュー コンポーネントの第 2 レベルの入れ子構造を変更します。 3 番目のレベルのネストに設定すると、children 属性があるかどうか、および子要素が 2 次ルーティング ページの下に含まれるかどうかを判断するだけです。新しい構造は、v-for ループで子要素タグを生成します。次のように:
<template> <Menu ref="sideMenu" :active-name="$route.name" :open-names="openNames" :theme="menuTheme" width="auto" @on-select="changeMenu"> <template v-for="item in menuList"> <MenuItem v-if="item.children.length<=1" :name="item.children[0].name" :key="'menuitem' + item.name"> <Icon :type="item.children[0].icon || item.icon" :size="iconSize" :key="'menuicon' + item.name"></Icon> <span class="layout-text" :key="'title' + item.name">{{ itemTitle(item.children[0]) }}</span> </MenuItem> <Submenu v-if="item.children.length > 1" :name="item.name" :key="item.name"> <template slot="title"> <Icon :type="item.icon" :size="iconSize"></Icon> <span class="layout-text">{{ itemTitle(item) }}</span> </template> <template v-for="child in item.children"> <!-- 添加条件判断是否还有三级菜单 v-if="child.children.length<=1" --> <MenuItem v-if="isThirdLeveMenu(child)==false" :name="child.name" :key="'menuitem' + child.name"> <Icon :type="child.icon" :size="iconSize" :key="'icon' + child.name"></Icon> <span class="layout-text" :key="'title' + child.name">{{ itemTitle(child) }}</span> </MenuItem> <!-- 以下为新增 添加条件判断如果有三级菜单 则增加三级菜单 --> <Submenu v-if="isThirdLeveMenu(child)==true" :name="child.name" :key="'menuitem' + child.name"> <template slot="title"> <Icon :type="child.icon" :size="iconSize" :key="'icon' + child.name"></Icon> <span class="layout-text" :key="'title' + child.name">{{ itemTitle(child) }}</span> </template> <template v-for="son in child.children"> <MenuItem :name="son.name" :key="'menuitem' + son.name"> <Icon :type="son.icon" :size="iconSize" :key="'icon' + son.name"></Icon> <span class="layout-text" :key="'title' + son.name">{{ itemTitle(son) }}</span> </MenuItem> </template> </Submenu> <!-- 以上为新增 --> </template> </Submenu> </template> </Menu> </template>
コンポーネント Method isThirdLeveMenu のメソッドの下に 1 つを追加し、children 属性が含まれているかどうかを確認します:
methods: { changeMenu(active) { this.$emit("on-change", active); }, itemTitle(item) { if (typeof item.title === "object") { return this.$t(item.title.i18n); } else { return item.title; } }, isThirdLeveMenu(child){ if(child.children){ if(child.children.length>0)return true; else return false; } else { return false; } } },
ステップ 2: 論理メソッドを変更して現在のパスを作成します: setCurrentPath, libs フォルダーの下の util.js ファイル内:
util.setCurrentPath = function (vm, name) { let title = ''; let isOtherRouter = false; vm.$store.state.app.routers.forEach(item => { if (item.children.length === 1) { if (item.children[0].name === name) { title = util.handleTitle(vm, item); if (item.name === 'otherRouter') { isOtherRouter = true; } } } else { item.children.forEach(child => { if (child.name === name) { title = util.handleTitle(vm, child); if (item.name === 'otherRouter') { isOtherRouter = true; } } }); } }); let currentPathArr = []; //去首页 if (name === 'home_index') { currentPathArr = [ { title: util.handleTitle(vm, util.getRouterObjByName(vm.$store.state.app.routers, 'home_index')), path: '', name: 'home_index' } ]; } //去导航菜单一级页面或者OtherRouter路由中的页面 else if ((name.indexOf('_index') >= 0 || isOtherRouter) && name !== 'home_index') { currentPathArr = [ { title: util.handleTitle(vm, util.getRouterObjByName(vm.$store.state.app.routers, 'home_index')), path: '/home', name: 'home_index' }, { title: title, path: '', name: name } ]; } //去导航菜单二级页面或三级页面 else { let currentPathObj = vm.$store.state.app.routers.filter(item => { var hasMenu; if (item.children.length <= 1) { hasMenu = item.children[0].name === name; return hasMenu; } else { let i = 0; let childArr = item.children; let len = childArr.length; while (i < len) { //如果是三级页面按钮,则在二级按钮数组中找不到这个按钮名称 //需要二级页面下可能出现三级子菜单的情况逻辑加入 if (childArr[i].name === name) { hasMenu = true; return hasMenu; } i++; } //如果一级,二级菜单下都没有此按钮名称,则遍历三级菜单 if(!hasMenu){ for(let m=0;m<childArr.length;m++){ if(!childArr[m].children) continue; let sonArr = childArr[m].children; for(let n=0;n<sonArr.length;n++){ if(sonArr[n].name === name){ hasMenu = true; return hasMenu; } } } } return false; } })[0]; if (currentPathObj.children.length <= 1 && currentPathObj.name === 'home') { currentPathArr = [ { title: '首页', path: '', name: 'home_index' } ]; } else if (currentPathObj.children.length <= 1 && currentPathObj.name !== 'home') { currentPathArr = [ { title: '首页', path: '/home', name: 'home_index' }, { title: currentPathObj.title, path: '', name: name } ]; } else { //如果是三级页面按钮,则在二级按钮数组中找不到这个按钮名称 //需要二级页面下可能出现三级子菜单的情况逻辑加入 let childObj = currentPathObj.children.filter((child) => { return child.name === name; })[0]; // let thirdLevelObj = console.log(childObj) //二级页面 if (childObj) { currentPathArr = [ { title: '首页', path: '/home', name: 'home_index' }, { title: currentPathObj.title, path: '', name: currentPathObj.name }, { title: childObj.title, path: currentPathObj.path + '/' + childObj.path, name: name } ]; } //childobj为undefined,再从三级页面中遍历 else { let thirdObj; let childObj = currentPathObj.children.filter((child) => { let hasChildren; hasChildren = child.name === name; if (hasChildren) return hasChildren if (child.children) { let sonArr = child.children; for (let n = 0; n < sonArr.length; n++) { if (sonArr[n].name === name) { thirdObj = sonArr[n]; hasChildren = true; return hasChildren; } } } return hasChildren })[0]; if(thirdObj && childObj){ currentPathArr = [ { title: '首页', path: '/home', name: 'home_index' }, { title: currentPathObj.title, path: '', name: currentPathObj.name }, { title: childObj.title, path: '', //设为空是因为此二级菜单没有实际页面且用于面包屑组件显示,path为空的将不可单击 name: childObj.name }, { title: thirdObj.title, path: currentPathObj.path + '/' + childObj.path + '/' + thirdObj.path, name: thirdObj.name } ]; } } } } vm.$store.commit('setCurrentPath', currentPathArr); return currentPathArr; };
ステップ 3: 3 レベルのページ test-child.vue、testcaca.vue および 3 レベルのルーティング コンテナー コンポーネント artical-publish-center.vue を作成します
artical-publish-center.vue 構造は以下のとおりです:
Vue が何気なく書いた他の 2 つの第 3 レベルのページ:
ステップ 4: ここでポイントとして、コンテナーは待望の第 3 レベルのメニューを実現できます ^_^。router フォルダーの下の router.js に、第 3 レベルのメニューを追加します。
それを appRouter に追加します。タイトルの子配列内: 'コンポーネント':
{ path: 'artical-publish', title: '用户配置', name: 'artical-publish', icon: 'compose', component: () => import('@/views/test/artical-publish-center.vue'), //引用三级页面的中间容器层 children:[ { path: 'testcaca', icon: 'ios-pause', name: 'testcaca', title: 'test4', component: () => import('@/views/test/testcaca.vue') }, { path: 'test-child', icon: 'ios-pause', name: 'test-child', title: 'test-child', component: () => import('@/views/test/test-child.vue') } ] }
最後に保存し、プロジェクトを実行し、次の 3 つを参照してください。 レベル メニューが表示されます:
上記はこの記事の全内容です皆様の学習に役立つことを願っています。その他の関連コンテンツについては、PHP 中国語 Web サイトに注目してください。
関連する推奨事項:
vue.js カルーセル チャート コンポーネントの使用方法について
以上がVue iview-admin フレームワークで第 2 階層メニューを第 3 階層メニューに変更する方法についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

この記事では、ブラウザ開発者ツールを使用した効果的なJavaScriptデバッグについて説明し、ブレークポイントの設定、コンソールの使用、パフォーマンスの分析に焦点を当てています。

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

この記事では、ソースマップを使用して、元のコードにマッピングすることにより、Minified JavaScriptをデバッグする方法について説明します。ソースマップの有効化、ブレークポイントの設定、Chrome DevtoolsやWebpackなどのツールの使用について説明します。

このチュートリアルでは、chart.jsを使用してパイ、リング、およびバブルチャートを作成する方法について説明します。以前は、4つのチャートタイプのchart.js:ラインチャートとバーチャート(チュートリアル2)、およびレーダーチャートと極地域チャート(チュートリアル3)を学びました。 パイとリングチャートを作成します パイチャートとリングチャートは、さまざまな部分に分かれている全体の割合を示すのに理想的です。たとえば、パイチャートを使用して、サファリの男性ライオン、女性ライオン、若いライオンの割合、または異なる候補者が選挙で受け取る票の割合を示すことができます。 パイチャートは、単一のパラメーターまたはデータセットの比較にのみ適しています。パイチャートのファンの角度はデータポイントの数値サイズに依存するため、パイチャートは値のあるエンティティをゼロ値で描画できないことに注意してください。これは、割合がゼロのエンティティを意味します

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...
