zoukankan      html  css  js  c++  java
  • vue 2.0 + ElementUI构建树形表格

    解决:

    本来想在网上博客找一找解决方法,奈何百度到的结果都不尽人意,思维逻辑不清,步骤复杂,代码混乱,找了半天也没找到一个满意的,所以干脆就自己动手写一个

    思路:

    1. table需要的数据是array,所以树结构数据要转化为array,所以需要2个局部变量,dataTree(原始数据)以及dataTable(封装数据)
    2. 把dataTree的数据封装到dataTable
    3. 点开某一层(row)的时候,把dataTree这一层数据的子集放在dataTable row下标后(就是数组组合数组)
    4. 通过div的class名称使用不同的css,展示层级关系效果
    5. 关闭某一层(row)的时候,把dataTree这一层数据的子集对比dataTable中数据,然后删除掉

    效果:

    可能样式还不是很好看,这是我个人能力的问题,写不出来好看的页面,有好的建议或者好看的demo可以联系博主(tangzedong.programmer@gmail)

    代码:

    <!-- 菜单树 -->
    <template>
      <div class="menus-tree">
        <el-table ref="menusTable" :row-style="showRow" :data="menusTable" v-bind="$attrs">
          <el-table-column
            prop="title"
            label="菜单名称">
            <template slot-scope="scope">
              <span :class="['level'+scope.row.level]">
              <i v-if="scope.row.children" @click="openToggle(scope.row)"
                 :class="[scope.row.open?'fa fa-chevron-down':'fa fa-chevron-right']"></i>
                </span>
              {{scope.row.title}}
            </template>
          </el-table-column>
          <el-table-column
            prop="icon"
            label="图标">
            <template slot-scope="scope">
              <i :class="scope.row.icon"></i>
            </template>
          </el-table-column>
          <el-table-column
            prop="index"
            label="路径">
          </el-table-column>
          <el-table-column
            prop="operation"
            label="操作">
            <template slot-scope="scope">
              <el-button type="text" size="small">增加</el-button>
              <!-- 判断下面是否有子菜单,有子菜单不能是有删除按钮 -->
              <el-button v-if="!scope.row.children" type="text" size="small">删除</el-button>
              <el-button type="text" size="small">编辑</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </template>
    
    <script>
      import Vue from 'vue';
    
      export default {
        data() {
          return {
            // 菜单树结构数据
            menusTree: [{
              id: '1', // 主键PK
              level: '1', // 菜单等级
              parentId: '', // 父id
              icon: 'fa fa-book fa-2', // 菜单图标
              title: '博客管理', //菜单标题
              children: [{
                id: '4',
                level: '2',
                parentId: '1',
                title: '博客发布',
                index: 'blog/edit',
              }, {
                id: '5',
                title: '博客列表',
                index: '1-2',
                level: '2',
                children: [{
                  id: '9',
                  level: '3',
                  parentId: '5',
                  title: '三次菜单',
                  index: 'blog/edit',
                }]
              }, {
                id: '6',
                level: '2',
                title: '博客编辑',
                index: '1-3',
              }]
            }, {
              id: '2',
              level: '1',
              icon: 'fa fa-address-book fa-2',
              title: '用户信息',
            }, {
              id: '3',
              level: '1',
              icon: 'fa fa-list-ul fa-2',
              title: "系统管理",
              children: [{
                id: '7',
                level: '2',
                title: '菜单管理',
                index: 'system/menu'
              }]
            }],
            defaultProps: {
              children: 'children',
              label: 'title'
            },
            // 菜单表格结构数据
            menusTable: []
          }
        },
        // 初始化函数,赋值,menusTree =>menusTable
        created() {
          this.menusTable = this.menusTree;
        },
        methods: {
          showRow: function (row) {
            const show = row.row.parent
              ? row.row.parent._expanded && row.row.parent._show
              : true;
            row.row._show = show;
            return show
              ? "animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;"
              : "display:none;";
          },
    
          // 树节点开关操作
          openToggle: function (item) {
            // 这里只是展开和关闭样式的变换方法
            Vue.set(item, 'open', !item.open);
            // 展开的时候,显示子节点,关闭的时候隐藏子节点
            // 遍历所有的子节点,加入到menuTable中
            for (let j = 0; j < this.menusTable.length; j++) {
              // 找到父节点的id,然后依次把子节点放到数组里面父节点后面
              if (this.menusTable[j].id !== item.id) {
                continue;
              }
              if (item.open) { // open => close
                console.log(item.children);
                let menusTable = this.menusTable;
                item.children.forEach(function (child, index) {
                  menusTable.splice(j + index + 1, 0, child); // 添加子节点
                })
              } else {
                this.menusTable.splice(j + 1, item.children.length); // 删除子节点
              }
              break;
            }
          }
        }
      }
    </script>
    
    <style scoped>
      .level1, .level2, .level3 {
        display: inline-block;
         20px;
      }
    
      .level1 {
        margin-left: 5px;
      }
    
      .level2 {
        margin-left: 20px;
      }
    
      .level3 {
        margin-left: 35px;
      }
    </style>

    其他:

    现在楼主也处于学习探讨阶段,有不好得地方大家可以指正,这里也只是简单的树表格的展开关闭功能,其他功能也会持续完善

    githb地址:https://github.com/dawn-tangzedong/web-manage/tree/master

    有意见或建议或问题都可以直接在下方评论

    我不作恶

    但有权拒绝为善

    我不赞同

    但是我捍卫你不为善的权力

  • 相关阅读:
    DRF项目创建流程(1)
    RESTful API规范
    超哥笔记--shell 基本命令(4)
    转:django模板标签{% for %}的使用(含forloop用法)
    自定django登录跳转限制
    jquery Ajax应用
    js重定向跳转页面
    django项目mysql中文编码问题
    python进阶(六) 虚拟环境git clone报错解决办法
    Linux基础(六) Vim之vundle插件
  • 原文地址:https://www.cnblogs.com/HackerBlog/p/10318735.html
Copyright © 2011-2022 走看看