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 相关文章推荐
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
JS小游戏之仙剑翻牌源码详解
Sep 25 Javascript
jQuery制作效果超棒的手风琴折叠菜单
Apr 03 Javascript
jquery ztree实现模糊搜索功能
Feb 25 Javascript
利用jquery获取select下拉框的值
Nov 23 Javascript
bootstrap提示标签、提示框实现代码
Dec 28 Javascript
详解微信小程序开发之城市选择器 城市切换
Jan 17 Javascript
JavaScript判断浏览器和hack滚动条的写法
Jul 23 Javascript
vuex 的简单使用
Mar 22 Javascript
了解ESlint和其相关操作小结
May 21 Javascript
ES10 特性的完整指南小结
Mar 04 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
Nov 09 Javascript
微信小程序常用赋值方法小结
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
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
laravel框架分组控制器和分组路由实现方法示例
2020/01/25 PHP
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
JS localStorage实现本地缓存的方法
2013/06/22 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
详解小程序input框失焦事件在提交事件前的处理
2019/05/05 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
es6中使用map简化复杂条件判断操作实例详解
2020/02/19 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
详解Django模版中加载静态文件配置方法
2019/07/21 Python
Python Django实现layui风格+django分页功能的例子
2019/08/29 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
python 发送json数据操作实例分析
2019/10/15 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
苹果美国官方商城:Apple美国
2016/08/24 全球购物
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
办公室前台岗位职责
2014/01/04 职场文书
HR求职自荐信范文
2014/06/21 职场文书
幼儿园秋季开学寄语
2014/08/02 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
关于十八大的演讲稿
2014/09/15 职场文书
综合办公室岗位职责
2015/04/11 职场文书
刑事法律意见书
2015/06/04 职场文书
基于tensorflow权重文件的解读
2021/05/26 Python
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript