美文网首页前后端之路VueJS
Vue 组件库Element布局容器动态生成侧边栏。

Vue 组件库Element布局容器动态生成侧边栏。

作者: 吃盖浇饭 | 来源:发表于2018-11-16 14:01 被阅读127次

    为了让大家可以继续看下去,代码展示效果我先给出来
    https://htmlzhoyan.github.io/ElementUi/#/ele/elc/%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86
    我这里要实现 Vue 2.0 的桌面端组件库Element中的侧边栏内容动态生成,换句话说,我并不知道侧边栏菜单里会有多少个子选项,所以我这样设计
    目录结构如下:

    vue布局

    我这边使用了组件里面再次调用组件的方法。
    所以 我这样先声明个组件 eleTemplate.vue

    <template>
      <div class="navMenu">
    
        <label v-for="navMenu in navMenus">
          <router-link :to="{ name: 'elc', params: {id:navMenu.entity.name} }">
            <el-menu-item v-if="navMenu.childs==null&&navMenu.entity&&navMenu.entity.state==='ENABLE'"
                          :key="navMenu.entity.id" :data="navMenu" :index="navMenu.entity.name" :route="navMenu.entity.value">
              <i :class="navMenu.entity.icon"></i>
              <span slot="title">{{navMenu.entity.alias}}</span>
            </el-menu-item>
          </router-link>
    
    
          <el-submenu v-if="navMenu.childs&&navMenu.entity&&navMenu.entity.state==='ENABLE'"
                      :key="navMenu.entity.id" :data="navMenu" :index="navMenu.entity.name">
            <template slot="title">
              <i :class="navMenu.entity.icon"></i>
              <span> {{navMenu.entity.alias}}</span>
            </template>
            <NavMenu :navMenus="navMenu.childs"></NavMenu>
          </el-submenu>
        </label>
    
      </div>
    </template>
    
    <script>
      export default {
        name: 'NavMenu',
        props: ['navMenus'],
        data() {
          return {}
        },
        methods: {}
      }
    </script>
    
    <style scoped>
        a{
          text-decoration:none
        }
    </style>
    
    
    
    

    然后我在父组件里调用它,这里我使用了router-view来展示子路由里的页面效果,同时我为了实现路由进来的时候去触发侧边栏的指向,我在el-menu里添加了default-active

    <template lang="html">
      <div class="">
        <el-container style="height: 500px; border: 1px solid #eee">
      <el-aside width="200px" style="background-color: rgb(238, 241, 246)">
        <!--左侧菜单组件-->
           <el-menu
             :default-active="isId"
             @select="handleSelect"
             class="el-menu-vertical-demo"
             background-color="#F0F6F6"
             text-color="#3C3F41"
             active-text-color="#f60">
             <NavMenu :navMenus="totalList"></NavMenu>
           </el-menu>
         </el-aside>
    
    <el-container>
      <el-main>
       <router-view></router-view>
      </el-main>
    </el-container>
    </el-container>
      </div>
    
    </template>
    
    <script>
    import config from './config'
    import NavMenu from './eleTemplate';
    export default {
      data() {
        return{
          totalList:[],
          isId:"权限管理"
        }
    
      },
      methods: {
        handleSelect(key,keyPath){
          console.log(key,keyPath)
        }
      },
      components: {
                    NavMenu
        },
       beforeRouteEnter (to, from, next) {
          console.log("我从哪里来",to.params.id,from)
          var self = this
         
          next(vm=>{
    
            vm.isId = to.params.id
          
          })
    
       
        },
     watch:{
         $route(to,from){
            this.isId = to.params.id
         }
       },
      created(){
        this.totalList = config.childs
      },
    }
    </script>
    
    <style lang="css">
    </style>
    
    

    其中 我为了模拟数据,引入config.js,后期是通过后端返回的数据来实现的

    let config = {
        "entity": null,
        "childs": [
            {
                "entity": {
                    "id": 1,
                    "parentMenuId": 0,
                    "name": "系统管理",
                    "icon": "el-icon-message\r\n",
                    "alias": "系统管理",
                    "state": "ENABLE",
                    "sort": 0,
                    "value": null,
                    "type": "NONE",
                    "createUserId": 1
                },
                "childs": [
                    {
                        "entity": {
                            "id": 3,
                            "parentMenuId": 1,
                            "name": "权限管理",
                            "icon": "el-icon-loading",
                            "alias": "权限管理",
                            "state": "ENABLE",
                            "sort": 0,
                            "value": "/system/auth",
                            "type": "LINK",
                            "createUserId": 1
                        },
                        "childs": null
                    },
                    {
                        "entity": {
                            "id": 4,
                            "parentMenuId": 1,
                            "name": "角色管理",
                            "icon": "el-icon-bell",
                            "alias": "角色管理",
                            "state": "ENABLE",
                            "sort": 1,
                            "value": "/system/role",
                            "type": "LINK",
                            "createUserId": 1
                        },
                        "childs": null
                    },
                    {
                        "entity": {
                            "id": 2,
                            "parentMenuId": 1,
                            "name": "菜单管理",
                            "icon": "el-icon-edit",
                            "alias": "菜单管理",
                            "state": "ENABLE",
                            "sort": 2,
                            "value": "/system/menu",
                            "type": "LINK",
                            "createUserId": 1
                        },
                        "childs": null
                    },
                    {
                        "entity": {
                            "id": 5,
                            "parentMenuId": 1,
                            "name": "分组管理",
                            "icon": "el-icon-mobile-phone\r\n",
                            "alias": "分组管理",
                            "state": "ENABLE",
                            "sort": 3,
                            "value": "/system/group",
                            "type": "LINK",
                            "createUserId": 1
                        },
                        "childs": null
                    }
                ]
            },
            {
                "entity": {
                    "id": 6,
                    "parentMenuId": 0,
                    "name": "用户管理",
                    "icon": "el-icon-news",
                    "alias": "用户管理",
                    "state": "ENABLE",
                    "sort": 1,
                    "value": null,
                    "type": "NONE",
                    "createUserId": 1
                },
                "childs": [
                    {
                        "entity": {
                            "id": 7,
                            "parentMenuId": 6,
                            "name": "帐号管理",
                            "icon": "el-icon-phone-outline\r\n",
                            "alias": "帐号管理",
                            "state": "ENABLE",
                            "sort": 0,
                            "value": "",
                            "type": "NONE",
                            "createUserId": 1
                        },
                        "childs": [
                            {
                                "entity": {
                                    "id": 14,
                                    "parentMenuId": 7,
                                    "name": "邮箱管理",
                                    "icon": "el-icon-sold-out\r\n",
                                    "alias": "邮箱管理",
                                    "state": "ENABLE",
                                    "sort": 0,
                                    "value": "/content/email",
                                    "type": "LINK",
                                    "createUserId": 1
                                },
                                "childs": null
                            },
                            {
                                "entity": {
                                    "id": 13,
                                    "parentMenuId": 7,
                                    "name": "密码管理",
                                    "icon": "el-icon-service\r\n",
                                    "alias": "密码管理",
                                    "state": "ENABLE",
                                    "sort": 1,
                                    "value": "/content/pass",
                                    "type": "LINK",
                                    "createUserId": 1
                                },
                                "childs": null
                            }
                        ]
                    },
                    {
                        "entity": {
                            "id": 8,
                            "parentMenuId": 6,
                            "name": "积分管理",
                            "icon": "el-icon-picture",
                            "alias": "积分管理",
                            "state": "ENABLE",
                            "sort": 1,
                            "value": "/user/integral",
                            "type": "LINK",
                            "createUserId": 1
                        },
                        "childs": null
                    }
                ]
            },
            {
                "entity": {
                    "id": 9,
                    "parentMenuId": 0,
                    "name": "内容管理",
                    "icon": "el-icon-rank",
                    "alias": "内容管理",
                    "state": "ENABLE",
                    "sort": 2,
                    "value": null,
                    "type": "NONE",
                    "createUserId": 1
                },
                "childs": [
                    {
                        "entity": {
                            "id": 10,
                            "parentMenuId": 9,
                            "name": "分类管理",
                            "icon": "el-icon-printer",
                            "alias": "分类管理",
                            "state": "ENABLE",
                            "sort": 0,
                            "value": "/content/classify",
                            "type": "LINK",
                            "createUserId": 1
                        },
                        "childs": null
                    },
                    {
                        "entity": {
                            "id": 11,
                            "parentMenuId": 9,
                            "name": "文章管理",
                            "icon": "el-icon-star-on",
                            "alias": "文章管理",
                            "state": "ENABLE",
                            "sort": 1,
                            "value": "/content/article",
                            "type": "LINK",
                            "createUserId": 1
                        },
                        "childs": null
                    },
                    {
                        "entity": {
                            "id": 12,
                            "parentMenuId": 9,
                            "name": "评论管理",
                            "icon": "el-icon-share",
                            "alias": "评论管理",
                            "state": "ENABLE",
                            "sort": 2,
                            "value": "/content/comment",
                            "type": "LINK",
                            "createUserId": 1
                        },
                        "childs": null
                    }
                ]
            }
        ]
    }
    export default config
    
    
    

    和附加内容elc.vue,来填充contain内容。我实现了tab选项的增和删,同时,添加了如果重复去跳转之前添加的tab,删除tab之前有bug,这次修改后,通过监听路由改动,保证路由实时改动,侧边栏也可以进行改变

    <template lang="html">
      <div>
        <div style="margin-bottom: 20px;">
    
        </div>
        
        <el-tabs v-model="editableTabsValue2" type="card" closable @tab-remove="removeTab">
      <el-tab-pane
        v-for="(item, index) in editableTabs2"
        :key="item.name"
        :label="item.title"
        :name="item.name"
      >
        {{item.title}}
      </el-tab-pane>
      </el-tabs>
    
        <el-table :data="tableData">
        <el-table-column prop="date" label="日期" width="140">
        </el-table-column>
        <el-table-column prop="name" label="姓名" width="120">
        </el-table-column>
        <el-table-column prop="address" label="地址">
        </el-table-column>
      </el-table>
    </div>
      
    </template>
    
    <script>
    export default {
      data(){
        return {
          btn:true,
          item:{
            date: '2018-11-11',
            name: 'OnePiece',
            address: '郑州市高新区推进城',
            
          },
          editableTabsValue2: '2',
          editableTabs2: [],
          tabIndex: 0,
          tableData: [],
          totalList:[],
    
        }
      },
      methods:{
        addTab(targetName) {
          this.btn= true
            this.editableTabs2.forEach((v,k)=>{
             
              if(v.title==targetName){
               
                this.btn = false;
                this.editableTabsValue2 = v.name
              }
            })
            if(this.btn){
              let newTabName = ++this.tabIndex + '';
            this.editableTabs2.push({
              title: targetName,
              name: newTabName,
              content: targetName
            });
            this.editableTabsValue2 = newTabName;
            }
            
          },
           removeTab(targetName) {
            let tabs = this.editableTabs2;
            let activeName = this.editableTabsValue2;
           
            if (activeName === targetName) {
              tabs.forEach((tab, index) => {
                if (tab.name === targetName) {
                  let nextTab = tabs[index + 1] || tabs[index - 1];
                  if (nextTab) {
                    activeName = nextTab.name;
                     this.$router.push({
                      name: "elc",
                      params: {
                        id: nextTab.title
                      }
                  });
                  }
                }
              });
            }
            
            this.editableTabsValue2 = activeName;
    
            this.editableTabs2 = tabs.filter(tab => tab.name !== targetName);
           
          }
        },
      created () {
        this.tableData = Array(20).fill(this.item);
    
      },
      beforeRouteEnter (to, from, next) {
          console.log("我从哪里来",to.params.id,from)
          var self = this
         
          next(vm=>{
          vm.item.name =to.params.id;
           vm.addTab(to.params.id);
          })
    
       
        },
      watch:{
         $route(to,from){
             this.item.name =this.$route.params.id;
             this.addTab(to.params.id);
         }
       },
    }
    </script>
    
    <style lang="css">
    </style>
    
    
    
    

    路由的内容


    路由代码

    这样我就实现了,可以根据后端返回数据来动态加载数据。

    相关文章

      网友评论

        本文标题:Vue 组件库Element布局容器动态生成侧边栏。

        本文链接:https://www.haomeiwen.com/subject/ivkmfqtx.html