欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue配置文件自動(dòng)生成路由和菜單實(shí)例代碼

 更新時(shí)間:2021年08月16日 11:58:45   作者:SADON_jung  
因?yàn)椴煌挠脩?hù)有不同的權(quán)限,能訪問(wèn)的頁(yè)面是不一樣的,所以我們?cè)趯?xiě)后臺(tái)管理系統(tǒng)時(shí)就會(huì)遇過(guò)這樣的需求:根據(jù)后臺(tái)數(shù)據(jù)動(dòng)態(tài)添加路由和菜單,這篇文章主要給大家介紹了關(guān)于vue配置文件自動(dòng)生成路由和菜單的相關(guān)資料,需要的朋友可以參考下

寫(xiě)在前面

每次重復(fù)寫(xiě)路由的時(shí)候是不是會(huì)覺(jué)得很煩,特別是項(xiàng)目大的時(shí)候,路由會(huì)有特別多,看都看不過(guò)來(lái),所以這里我是有了一個(gè)router.json的配置文件來(lái)對(duì)路由做一些簡(jiǎn)單的配置,然后讓路由和左側(cè)菜單欄可以同時(shí)生成。

router.json

主要配置項(xiàng)如下:

{
  "name": "routerConfig",
  "menu": [{
    "id": "1", //路由id,不能重復(fù)
    "name": "home",//路由名字
    "path": "/homePage",//路由路徑
    "label": "首頁(yè)",//菜單標(biāo)題
    "selected": true,//默認(rèn)選中
    "icon": "el-icon-monitor",//菜單顯示圖標(biāo)
    "open": true,//默認(rèn)打開(kāi)
    "component": "homePage/homePage.vue",//組件路由
    "children": [ //子菜單
      {
        "id": "3",
        "name": "getCover",
        "path": "/getCover",
        "label": "封面截取",
        "selected": false,
        "icon": "el-icon-scissors",
        "open": false,
        "component": "getCover/getCover.vue",
        "children": []
      }
    ]
  },{
    "id": "2",
    "name": "testPage",
    "path": "/testPage",
    "label": "測(cè)試",
    "selected": false,
    "icon": "el-icon-setting",
    "open": false,
    "component": "test/test.vue",
    "children": []
  },{
    "id": "5",
    "name": "testMenu",
    "path": "/testMenu",
    "label": "菜單測(cè)試",
    "selected": false,
    "icon": "el-icon-setting",
    "open": false,
    "component": "testMenu/testMenu.vue",
    "children": []
  }]
}

配置主要分為兩部分,一部分由于菜單生成,一部分用于路由生成,當(dāng)然兩者也有共用的部分

路由生成

import Vue from 'vue'
import VueRouter from 'vue-router'
import ro from "element-ui/src/locale/lang/ro";
Vue.use(VueRouter)
//引入配置文件router.json
let routerMenu = require('@/config/router.json');
routerMenu = routerMenu.menu;
let menu = [];
//配置路由
let formatRoute = function (routerMenu,menu){
  for(let i = 0; i < routerMenu.length; i++){
    let temp = {
      path: routerMenu[i].path,
      name: routerMenu[i].name,
      //這塊要注意
      //用require這種方式引入的時(shí)候,會(huì)將你的component分別打包成不同
      //的js,加載的時(shí)候也是按需加載,只用訪問(wèn)這個(gè)路由網(wǎng)址時(shí)才會(huì)加載
      //這個(gè)js
      component: resolve => require([`@/views/${routerMenu[i].component}`], resolve)
    };
    menu.push(temp);
    if(routerMenu[i].children && routerMenu[i].children.length > 0){
    //遞歸生成子菜單的路由
      formatRoute(routerMenu[i].children,menu);
    }
  }
}
//初始化
formatRoute(routerMenu,menu);
//重定向設(shè)置
const routes = [
  {
    path: '/',
    redirect: '/homePage'
  },
]
//將生成的路由文件push進(jìn)去
for(let i = 0; i < menu.length; i++)
  routes.push(menu[i]);
  
const router = new VueRouter({
  routes
})

export default router

菜單生成

<template>
  <div id="leftMenu">

  </div>
</template>

<script>
export default {
  name: "left",
  data(){
    return{
      menu:[]
    }
  },
  methods:{
  //通過(guò)路由id來(lái)找節(jié)點(diǎn)
    findNodeById(node,id){
      for(let i = 0; i < node.length; i++){
        if(id == node[i].id){
          node[i].selected = true;
          if(node[i].children && node[i].children.length > 0){
            this.findNodeById(node[i].children,id);
          }
          node[i].open = !node[i].open;
          if(this.$route.path !== node[i].path) this.$router.push(node[i].path);
        }else{
          node[i].selected = false;
          if(node[i].children && node[i].children.length > 0){
            this.findNodeById(node[i].children,id);
          }else{

          }
        }
      }
    },
    //選中菜單節(jié)點(diǎn)
    chooseNode(id){
      this.findNodeById(this.menu,id);
      let domTree = this.generatorMenu(this.menu,'',0)
      let leftMenu = document.getElementById('leftMenu');
      leftMenu.innerHTML = domTree;
    },
    //動(dòng)態(tài)生成菜單目錄
    generatorMenu(menu,temp,floor){
      for(let i = 0; i < menu.length; i++){
        temp += `<div style="width: max-content">
                    <div class="menuOption" οnclick="chooseNode(${menu[i].id})"
                            style="text-indent: ${floor}em;
                            background-color: ${menu[i].selected?'aquamarine':''};
                            cursor: pointer;
                            margin-top: 0.3rem;>
                        <i class="${menu[i].icon}"></i>
                        ${menu[i].label}`
        if(!menu[i].open && menu[i].children && menu[i].children.length > 0){
          temp += `<i style="margin-left: 1rem" class="el-icon-arrow-down"></i>`
        }else{
          if(menu[i].open && menu[i].children && menu[i].children.length > 0){
            temp += `<i style="margin-left: 1rem" class="el-icon-arrow-up"></i>`
          }
        }
        temp += `</div>`
        if(menu[i].open && menu[i].children && menu[i].children.length != 0){
          temp = this.generatorMenu(menu[i].children,temp,floor+1);
        }
        temp += `</div>`
      }
      return temp;
    }
  },
  created() {

  },
  mounted() {
    window.chooseNode = this.chooseNode;
    let menu = [];
    //獲取路由菜單配置文件
    const router = require('@/config/router.json');
    menu = router.menu;
    this.menu = menu;
    let domTree = this.generatorMenu(menu,'',0)
    let leftMenu = document.getElementById('leftMenu');
    leftMenu.innerHTML = domTree;
  }
}
</script>

<style scoped>
  #leftMenu{
    min-height: calc(100vh - 44px - 1rem);
    background-color: cornflowerblue;
    text-align: left;
    padding: 0.5rem 1rem;
    font-size: large;
    font-weight: bold;
  }
  .selectedM{
    background-color: aquamarine;
  }
  .menuOption{
    cursor: pointer;
  }
</style>

效果

左側(cè)菜單便是自動(dòng)生成的,點(diǎn)擊菜單欄也會(huì)跳轉(zhuǎn)到對(duì)應(yīng)的路由地址,當(dāng)然,樣式有點(diǎn)丑,但樣式的話可以自己后續(xù)再調(diào)整。

這樣的話,我們新加菜單的時(shí)候只需要在配置文件中配置好,就可以直接寫(xiě)編寫(xiě)頁(yè)面,這樣也給我們省下了很多時(shí)間。

總結(jié)

到此這篇關(guān)于vue配置文件自動(dòng)生成路由和菜單的文章就介紹到這了,更多相關(guān)vue自動(dòng)生成路由和菜單內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在 React、Vue項(xiàng)目中使用SVG的方法

    在 React、Vue項(xiàng)目中使用SVG的方法

    本篇文章主要介紹了在 React、Vue項(xiàng)目中使用SVG的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • vuex中數(shù)據(jù)持久化插件vuex-persistedstate使用詳解

    vuex中數(shù)據(jù)持久化插件vuex-persistedstate使用詳解

    這篇文章主要介紹了vuex中數(shù)據(jù)持久化插件vuex-persistedstate使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 詳解用vue編寫(xiě)彈出框組件

    詳解用vue編寫(xiě)彈出框組件

    本篇文章主要介紹了詳解用vue編寫(xiě)彈出框組件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • 在vue項(xiàng)目中集成graphql(vue-ApolloClient)

    在vue項(xiàng)目中集成graphql(vue-ApolloClient)

    這篇文章主要介紹了在vue項(xiàng)目中集成graphql(vue-ApolloClient),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Vue項(xiàng)目部署到j(luò)enkins的實(shí)現(xiàn)

    Vue項(xiàng)目部署到j(luò)enkins的實(shí)現(xiàn)

    本文主要介紹了Vue項(xiàng)目部署到j(luò)enkins的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Vue實(shí)現(xiàn)div滾輪放大縮小

    Vue實(shí)現(xiàn)div滾輪放大縮小

    這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)div滾輪放大縮小,拖拽效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 在Vue中使用Viser說(shuō)明(基于AntV-G2可視化引擎)

    在Vue中使用Viser說(shuō)明(基于AntV-G2可視化引擎)

    這篇文章主要介紹了在Vue中使用Viser說(shuō)明(基于AntV-G2可視化引擎),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • Vue配合Vant使用時(shí)area省市區(qū)選擇器的使用方式

    Vue配合Vant使用時(shí)area省市區(qū)選擇器的使用方式

    這篇文章主要介紹了Vue配合Vant使用時(shí)area省市區(qū)選擇器的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • vue組件實(shí)現(xiàn)文字居中對(duì)齊的方法

    vue組件實(shí)現(xiàn)文字居中對(duì)齊的方法

    這篇文章主要為大家詳細(xì)介紹了vue組件實(shí)現(xiàn)文字居中對(duì)齊的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 詳解Vue用自定義指令完成一個(gè)下拉菜單(select組件)

    詳解Vue用自定義指令完成一個(gè)下拉菜單(select組件)

    本篇文章主要介紹了詳解Vue用自定義指令完成一個(gè)下拉菜單(select組件),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10

最新評(píng)論