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可以联系博主([email protected])

代码:

<!-- 菜单树 -->
<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;
    width: 20px;
  }

  .level1 {
    margin-left: 5px;
  }

  .level2 {
    margin-left: 20px;
  }

  .level3 {
    margin-left: 35px;
  }
</style>

其他:

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

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

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

原文地址:https://www.cnblogs.com/HackerBlog/p/10318735.html

时间: 2024-08-30 13:00:30

vue 2.0 + ElementUI构建树形表格的相关文章

vue+vue-router+axios+element-ui构建vue实战项目之七(渲染content.vue内容)

在上一节<vue+vue-router+axios+element-ui构建vue实战项目之六(渲染index.vue列表)>中,我们从后端接口获取数据,并成功渲染出一个列表. 这节内容,我们来做内容页面. 编写src/page/content.vue 文件 话不多说,直接上代码 1 <template> 2 <div> 3 <h3>{{getMsg.title}}</h3> 4 <p>作者:{{getMsg.author.login

ELement-UI之树形表格(treeTable&amp;&amp;treeGrid)

先上图来一波 支持无限层级,支持新增子级时自动打开父级,支持编辑时自动打开父级,执行操作时自带动画效果,支持初始化时设置全部打开或者关闭,支持一键展开与关闭丝滑般的无延迟 由于基于el-table扩展的,所以当然能够使用el-table的所有功能 下面上代码: 1,核心JS,格式化数据源 'use strict' import Vue from 'vue' export default function treeToArray(data, expandAll, parent = null, le

基于Vue实现可以拖拽的树形表格实例详解

因业务需求,需要一个树形表格,并且支持拖拽排序,任意未知插入,github搜了下,真不到合适的,大部分树形表格都没有拖拽功能,所以决定自己实现一个.这里分享一下实现过程,项目源代码请看github,插件已打包封装好,发布到npm上 本博文会分为两部分,第一部分为使用方式,第二部分为实现方式 安装方式 npm i drag-tree-table --save-dev 使用方式 import dragTreeTable from 'drag-tree-table'  模版写法 ? 1 <dragTr

Vue+abp树形表格

项目中需要用到树形表格,其他同学找了一个ZkTable,我也就跟着用了,不太好用,有更好的记得联系我.先说下缺点,如果这些不能满足你,后面也没必要看了. 缺点如下(也可能我不会用,如果你会一定记得告诉我): 第一列不能使用模板数据,必须是简单的属性字段,也就不能使用自定义html标签了,如果你用了,不好意思,整个数据显示不出来 单选没有高亮(根本没有单选?),反正我用的多选框代替单选 模板使用的插槽而不是render函数,模板复选框绑定的数据只能单向绑定,即在界面点选可以修改属性值,但是修改属性

ElementUI制作树形表组件

提要 最近项目中需要用到树形表格来描述部门.区域之间的父子展开关系.但是已经在项目中使用的Vue的成熟组件ElementUI以及iViewUI组件都没有提供相应的树形表格组件,无奈找了其他替代方案也都被pass掉了,只能从改造现有组件放面着手. 在网上也找到了一些实践案例:http://blog.csdn.net/s8460049/article/details/61414751 第一种方案 第一种方案就是原作者介绍的,即将具有层级关系的数据进行提前处理.比如: 数据结构为: [ { id: 1

从零开始搭建自己的VueJS2.0+ElementUI单页面网站(一、环境搭建)

前言 VueJS可以说是近些年来最火的前端框架之一,越来越多的网站开始使用vuejs作为前端框架,vuejs轻量.简单的特性使得前端开发变得更加简易,而基于vuejs的前端组件库也越来越多.我们今天使用的ElementUI,是饿了么团队开发的一款基于vuejs的前端组件库,也是众多vuejs组件库里面比较优秀的一款.这里要说一下我们构建网站所需要用到的一些东西: NodeJS(npm) Webstorm (前端IDE) Nginx(后期用来转发请求到后台服务器) Eclipse(后台IDE) 正

java构建树形列表(带children属性)

一些前端框架提供的树形表格需要手动构建树形列表(带children属性的对象数组),这种结构一般是需要在Java后台构建好. 构建的方式是通过id字段与父id字段做关联,通过递归构建children字段来达到构建树形列表的目的. /** * 树形表格工具类 * * @author yanggb */ public class TreeTableUtil {/** * 把列表转换为树结构 * * @param originalList 原始list数据 * @param idFieldName 作

vue项目搭建和开发流程 vue项目配置ElementUI、jQuery和Bootstrap环境

目录 一.VUE项目的搭建 1. 环境搭建 2. 项目的创建和启动 二. 开发项目 1. 配置vue项目启动功能 2. 开发vue项目 (1)项目文件的作用 (2)vue项目开发流程 (3)vue项目的请求生命周期 三.vue项目中的功能 1. 路由相关的标签和方法 2. 路由配置 (1)无路由传参的路由配置方法 (2)路由传参的路由配置方法 3. 页面的跳转功能 (1)标签跳转 (2)逻辑跳转(路由跳转) 四.JS原型 五.vue组件生命周期钩子 六.vue的ajax插件:axios 七.vu

使用Vue.js制作仿Metronic高级表格(一)静态设计

Metronic高级表格是Metonic框架中自行实现的表格,其底层是Datatables,本教程将主要使用Vue实现交互部分,使用Bootstrap做样式库,jQuery做部分用户交互(弹窗). 使用到的库:Vue 2.0,Bootstrap3.jQuery2.font-awesome4,均可在CDN下载 需要注意的是,Vue最好使用开发版本 一.需求和原型设计 产品目标是一个图书管理表格,书籍字段:书籍名称.分类.价格.更新时间. 需求: ① 书籍信息的增删改 ② 分页功能,并且能自行选择