vue2.0基于vue-cli+element-ui制作树形treeTable


Posted in Javascript onApril 30, 2019

该组件基于技术栈,主要涉及vue-cli生成的webpack项目脚手架,在此脚手架项目基础上完成的,整合了element-ui开源vue的UI项目

1.vue-cli的安装使用

npm install -g vue-cli

全局安装vue-cli之后,使用该脚手架的相关命令,可快速生成一个比较规范的vue项目结构

vue init <template-name> <project-name>

例子

vue init webpack treeTable

这样一个快速的项目结构生成,如下所示,中间一路回车就可以了,主要是设置了是否支持eslint等等

vue2.0基于vue-cli+element-ui制作树形treeTable

2.整合element-ui

cd treeTable

进入刚刚生成的项目目录中,安装element-ui

npm i element-ui -S

在main.js中,

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-default/index.css'

Vue.use(ElementUI)

整合就可以了,具体element-ui更多的使用和操作,可以去官网查看 http://element.eleme.io/#/zh-CN/component/quickstart
我这里主要是利用他的table组件来制作一个树形结构的table。

vue2.0基于vue-cli+element-ui制作树形treeTable

3.树形table组件制作

在src目录的components目录中,

vue2.0基于vue-cli+element-ui制作树形treeTable

其中utils下面提供一些需要用的工具类

vue目录下面是组件的源码

index.js是外包入口

相关代码

dataTranslate.js主要是提供了把数组数据转换成树形结构的数据,并且进行相关属性的添加

/*
* @Author: sunlandong
* @Date:   2017-03-11 12:06:49
* @Last Modified by:   sunlandong
* @Last Modified time: 2017-03-11 16:30:03
*/
 
 
import Vue from 'vue'
function DataTransfer (data) {
  if (!(this instanceof DataTransfer)) {
    return new DataTransfer(data, null, null)
  }
}
 
 
DataTransfer.treeToArray = function (data, parent, level, expandedAll) {
  let tmp = []
  Array.from(data).forEach(function (record) {
    if (record._expanded === undefined) {
      Vue.set(record, '_expanded', expandedAll)
    }
    if (parent) {
      Vue.set(record, '_parent', parent)
    }
    let _level = 0
    if (level !== undefined && level !== null) {
      _level = level + 1
    }
    Vue.set(record, '_level', _level)
    tmp.push(record)
    if (record.children && record.children.length > 0) {
      let children = DataTransfer.treeToArray(record.children, record, _level, expandedAll)
      tmp = tmp.concat(children)
    }
  })
  return tmp
}
 
 
export default DataTransfer

utils/index.js

/*
* @Author: sunlandong
* @Date:   2017-03-11 12:06:55
* @Last Modified by:   sunlandong
* @Last Modified time: 2017-03-11 16:36:56
*/
import MSDataTransfer from './dataTranslate.js'
export default {
	MSDataTransfer
}

TreeGrid.vue是树形table组件的源码

<template>
 <el-table
  :data="data"
  border
  style="width: 100%"
  :row-style="showTr">
  <el-table-column v-for="(column, index) in columns" :key="column.dataIndex"
   :label="column.text">
   <template scope="scope">
    <span v-if="spaceIconShow(index)" v-for="(space, levelIndex) in scope.row._level" class="ms-tree-space"></span>
    <button class="button is-outlined is-primary is-small" v-if="toggleIconShow(index,scope.row)" @click="toggle(scope.$index)">
     <i v-if="!scope.row._expanded" class="el-icon-caret-right" aria-hidden="true"></i>
     <i v-if="scope.row._expanded" class="el-icon-caret-bottom" aria-hidden="true"></i>
    </button>
    <span v-else-if="index===0" class="ms-tree-space"></span>
    {{scope.row[column.dataIndex]}}
   </template>
  </el-table-column>
  <el-table-column label="操作" v-if="treeType === 'normal'" width="260">
   <template scope="scope">
    <button type="button" class="el-button el-button--default el-button--small">
     <router-link
      :to="{ path: requestUrl + 'edit', query: {id: scope.row.Oid} }"
      tag="span">
      编辑
     </router-link>
    </button>
    <el-button
     size="small"
     type="danger"
     @click="handleDelete()">
     删除
    </el-button>
    <button type="button" class="el-button el-button--success el-button--small">
     <router-link :to="{ path: requestUrl, query: {parentId: scope.row.parentOId} }"
            tag="span">
      添加下级树结构
     </router-link>
    </button>
   </template>
  </el-table-column>
 </el-table>
</template>
<script>
 import Utils from '../utils/index.js'
// import Vue from 'vue'
 export default {
  name: 'tree-grid',
  props: {
// 该属性是确认父组件传过来的数据是否已经是树形结构了,如果是,则不需要进行树形格式化
   treeStructure: {
    type: Boolean,
    default: function () {
     return false
    }
   },
// 这是相应的字段展示
   columns: {
    type: Array,
    default: function () {
     return []
    }
   },
// 这是数据源
   dataSource: {
    type: Array,
    default: function () {
     return []
    }
   },
// 这个作用是根据自己需求来的,比如在操作中涉及相关按钮编辑,删除等,需要向服务端发送请求,则可以把url传过来
   requestUrl: {
    type: String,
    default: function () {
     return ''
    }
   },
// 这个是是否展示操作列
   treeType: {
    type: String,
    default: function () {
     return 'normal'
    }
   },
// 是否默认展开所有树
   defaultExpandAll: {
    type: Boolean,
    default: function () {
     return false
    }
   }
  },
  data () {
   return {}
  },
  computed: {
  // 格式化数据源
   data: function () {
    let me = this
    if (me.treeStructure) {
     let data = Utils.MSDataTransfer.treeToArray(me.dataSource, null, null, me.defaultExpandAll)
     console.log(data)
     return data
    }
    return me.dataSource
   }
  },
  methods: {
  // 显示行
   showTr: function (row, index) {
    let show = (row._parent ? (row._parent._expanded && row._parent._show) : true)
    row._show = show
    return show ? '' : 'display:none;'
   },
  // 展开下级
   toggle: function (trIndex) {
    let me = this
    let record = me.data[trIndex]
    record._expanded = !record._expanded
   },
  // 显示层级关系的空格和图标
   spaceIconShow (index) {
    let me = this
    if (me.treeStructure && index === 0) {
     return true
    }
    return false
   },
  // 点击展开和关闭的时候,图标的切换
   toggleIconShow (index, record) {
    let me = this
    if (me.treeStructure && index === 0 && record.children && record.children.length > 0) {
     return true
    }
    return false
   },
   handleDelete () {
    this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
     confirmButtonText: '确定',
     cancelButtonText: '取消',
     type: 'error'
    }).then(() => {
     this.$message({
      type: 'success',
      message: '删除成功!'
     })
    }).catch(() => {
     this.$message({
      type: 'info',
      message: '已取消删除'
     })
    })
   }
  }
 }
</script>
<style scoped>
 .ms-tree-space{position: relative;
  top: 1px;
  display: inline-block;
  font-family: 'Glyphicons Halflings';
  font-style: normal;
  font-weight: 400;
  line-height: 1;
  width: 18px;
  height: 14px;}
 .ms-tree-space::before{content: ""}
 table td{
  line-height: 26px;
 }
</style>

index.js

import TreeGrid from './vue/TreeGrid.vue'
 module.exports = {
 TreeGrid
}

使用

<template>
 <div class="hello">
  <tree-grid :columns="columns" :tree-structure="true" :data-source="dataSource"></tree-grid>
 </div>
</template>
 
<script>
import {TreeGrid} from './treeTable'
export default {
 name: 'hello',
 data () {
  return {
   columns: [
     {
      text: '姓名',
      dataIndex: 'name'
     },
     {
      text: '年龄',
      dataIndex: 'age'
     },
     {
      text: '性别',
      dataIndex: 'sex'
     }
    ],
   dataSource: [
    {
     id: 1,
     parentId: 0,
     name: '测试1',
     age: 18,
     sex: '男',
     children: [
      {
       id: 2,
       parentId: 1,
       name: '测试2',
       age: 22,
       sex: '男'
      }
     ]
    },
    {
     id: 3,
     parentId: 0,
     name: '测试3',
     age: 23,
     sex: '女',
     children: [
      {
       id: 4,
       parentId: 3,
       name: '测试4',
       age: 22,
       sex: '男'
      },
      {
       id: 5,
       parentId: 3,
       name: '测试5',
       age: 25,
       sex: '男'
      },
      {
       id: 6,
       parentId: 3,
       name: '测试6',
       age: 26,
       sex: '女',
       children: [
        {
         id: 7,
         parentId: 6,
         name: '测试7',
         age: 27,
         sex: '男'
        }
       ]
      }
     ]
    },
    {
     id: 18,
     parentId: 0,
     name: '测试8',
     age: 18,
     sex: '男'
    }
   ]
  }
 },
 components: {
  TreeGrid
 }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

效果图

vue2.0基于vue-cli+element-ui制作树形treeTable

https://github.com/sunlandong/treeTable   github上下载源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery html()等方法介绍
Nov 18 Javascript
js获取当前select 元素值的代码
Apr 19 Javascript
js中字符替换函数String.replace()使用技巧
Aug 14 Javascript
javascript学习笔记(八) js内置对象
Jun 19 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
Oct 11 Javascript
JS正则表达式获取分组内容的方法详解
Nov 15 Javascript
详解Backbone.js框架中的模型Model与其集合collection
May 05 Javascript
KnockoutJS 3.X API 第四章之click绑定
Oct 10 Javascript
原生javascript移动端滑动banner效果
Mar 10 Javascript
JavaScript截屏功能的实现代码
Jul 28 Javascript
让你30分钟快速掌握vue3教程
Oct 26 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
Dec 04 Vue.js
微信小程序常用赋值方法小结
Apr 30 #Javascript
微信小程序实现同一页面取值的方法分析
Apr 30 #Javascript
一百行JS代码实现一个校验工具
Apr 30 #Javascript
Vue-cli3简单使用(图文步骤)
Apr 30 #Javascript
微信小程序单选radio及多选checkbox按钮用法示例
Apr 30 #Javascript
VSCode使用之Vue工程配置eslint
Apr 30 #Javascript
微信小程序API—获取定位的详解
Apr 30 #Javascript
You might like
第八节--访问方式
2006/11/16 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
PHP中散列密码的安全性分析
2019/07/26 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
js中生成map对象的方法
2014/01/09 Javascript
一款基于jQuery的图片场景标注提示弹窗特效
2015/01/05 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
Vue 2.0双向绑定原理的实现方法
2019/10/23 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
python中常用检测字符串相关函数汇总
2015/04/15 Python
python 生成图形验证码的方法示例
2018/11/11 Python
python之mock模块基本使用方法详解
2019/06/27 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
2019/10/11 Python
python ftplib模块使用代码实例
2019/12/31 Python
python实现在线翻译
2020/06/18 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
html5时钟实现代码
2010/10/22 HTML / CSS
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
关于Assembly命名空间的三个面试题
2015/07/23 面试题
八项规定整改措施
2014/02/12 职场文书
2015年计划生育责任书
2015/05/08 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
使用python绘制横竖条形图
2022/04/21 Python