由于ElementUI目前还未开发树形表格组件,也参阅了网络上部分基于ElementUI表格封装的开源树形组件,如果想进行二次开发的话都不太理想,所以就萌生了自行开发树形表格。
本示例提供开发思路,移除了多余的样式,比较适合新手入门学习,如果应用于实际项目还请自行封装。
目前还仅仅实现了视觉的树结构的层级效果和控制结构的显示隐藏,后续还会进行不断的完善和优化,有必要的话会对组件进行二次封装,有点在重复造论的感觉哈。
效果图
完整代码
页面(tree-table.vue)
<template> <div> TreeTable <el-table :data="list" :row-style="tableRowStyle" border> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="id" label="ID" width="180"> <template slot-scope="scope"> <span class="collapse" :class="collapseClass(scope.row)" :style="tableRowPaddingStyle(scope.row)" @click="handleCollapseClick(scope.row)"> </span> <span>{{ scope.row.id }}</span> </template> </el-table-column> <el-table-column prop="name" label="NAME"></el-table-column> </el-table> </div> </template> <script lang="ts"> import {Component, Vue} from 'vue-property-decorator' // 引入两个封装好的工具方法 import { arrayToTree } from './utils/array.js' import { ergodicTree } from './utils/tree.js' @Component export default class TreeTable extends Vue { private list: object[] = []; private tree: object[] = []; created() { // 准备一组含有父子级关系的一维数组方便示例测试 // 在实际项目应用中,理应通过后端接口返回 let _list = [ { id: 'a', pid: '', name: '部门a', children: [] }, { id: 'a1', pid: 'a', name: '子部门a1', children: [] }, { id: 'a2', pid: 'a', name: '子部门a2', children: [] }, { id: 'a2-1', pid: 'a2', name: '子部门a2-1', children: [] }, { id: 'a2-2', pid: 'a2', name: '子部门a2-2', children: [] }, { id: 'a3', pid: 'a', name: '子部门a3', children: [] }, { id: 'a3-1', pid: 'a3', name: '子部门a3-1', children: [] }, { id: 'b', pid: '', name: '部门b', children: [] }, { id: 'b1', pid: 'b', name: '子部门b1', children: [] }, { id: 'c', pid: '', name: '部门c', children: [] }, ]; // 将一维数组转成树形结构并存储于tree变量 this.tree = arrayToTree(_list); // 考虑到实际应用过程中接口返回的数据是无序的,所以我们对tree进行先序遍历将节点一一插入到list变量 this.list = []; ergodicTree(this.tree, (node: any) => { this.list.push(node); // 遍历过程中并对每个节点挂载open和show属性 // open:控制节点的打开和关闭 // show:控制节点的显示和隐藏 this.$set(node, 'open', true); this.$set(node, 'show', true) }) } // 控制行的显示和隐藏 tableRowStyle(scope: any) { return { 'display': scope.row.show ? '' : 'none' } } // 通过每个节点的深度,设置行的缩进实现视觉上的层级效果 tableRowPaddingStyle(row: any) { return { 'margin-left': `${(row._depth - 1) * 24}px` } } // 控制展开按钮的展开和关闭状态 collapseClass(row: any) { return { 'collapse--open': row.open == false && row.children && row.children.length > 0, 'collapse--close': row.open == true && row.children && row.children.length > 0 } } // 处理展开按钮的点击事件 handleCollapseClick(row: any) { const _open = row.open; // 通过节点访问路径控制节点的显示隐藏,由于内存指针的关系list和tree的节点操作都会相互影响 ergodicTree(this.tree, (node: any) => { node._idPath.forEach((pathId: any) => { if (pathId == row.id) { this.$set(node, 'show', !_open); this.$set(node, 'open', !_open) } }) }); row.show = true; row.open = !_open; } } </script> <style lang="scss" scoped> .collapse { display: inline-block; width: 8px; cursor: pointer; margin-right: 8px; } .collapse--open:before { content: '+'; } .collapse--close:before { content: '-'; } </style>
工具方法
考虑数组转树和遍历树都是在实际项目中都是非常常用的,所以这边对这两个方法进行了封装。
数组转树结构(./utils/array.ts)
export function arrayToTree(list: object[], props = {id: 'id', pid: 'pid', children: 'children'}) { let tree: object[] = []; let map: any = {}; let listLength = list.length; for (let i = 0; i < listLength; i++) { let node: any = list[i]; let nodeId: any = node[props.id]; map[nodeId] = node; } for (let i = 0; i < listLength; i++) { let node: any = list[i]; let nodePid: any = node[props.pid]; let parentNode: any = map[nodePid]; if (parentNode) { parentNode[props.children] = parentNode[props.children] || []; parentNode[props.children].push(node) } else { tree.push(node) } } return tree }
遍历树结构(./utils/tree.ts)
结合实际项目应用,我们采用了先序遍历法对树进行遍历,为了方便在业务代码里的应用,在遍历过程中会对每个节点挂载节点访问路径 _idPath 属性和节点深度 _depth 属性。
export function ergodicTree(tree: object[], callback: any = () => {}, props = {id: 'id', pid: 'pid', children: 'children'}) { function _ergodicTree(tree: object[], parentIdPath?: any[], depth: number = 0) { const treeLength = tree.length; for (let i = 0; i < treeLength; i++) { let node: any = tree[i]; const _idPath: any[] = parentIdPath ? [...parentIdPath, node[props.id]] : [node[props.id]]; const _depth: number = depth + 1; node._idPath = _idPath; node._depth = _depth; callback(node); if (node[props.children] && node[props.children] instanceof Array) { _ergodicTree(node[props.children], _idPath, _depth) } } } _ergodicTree(tree); return tree; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
写在前面 此组件仅提供一个创建 TreeTable 的解决思路。它基于element-ui的 table 组件实现,通过el-table的row-style方法,在里面判断元素是否需要隐藏或者显示,从而实现TreeTable的展开与收起。 并且本组件充分利用 vue 插槽的特性来方便用户自定义。 evel.js 里面,addAttrs 方法会给数据添加几个属性,treeTotable 会对数组扁平
问题内容: 如何确保表格的每个单元格都应变成 正方形 而不使用固定大小?当他们改变宽度时要有所 反应 。 问题答案: 您可以使用以下技术中描述的技术:响应正方形的网格。 适应您的带有表和 方形表单元格的 用例,它看起来像这样:
我有一个脚本,可以从列表中获取项,为每个项编写值,我想做的只是将其管道到一个表中。我试过Format-Table、format-table-force、Select-Object和Format-Table,但都不起作用,结果只是显示在列表中。 当我运行该脚本(2个列表项的示例)时,它现在是如何显示的: ID:1 FileLeafref:MyFile.docx MySecurity:内部ID:2 F
本文向大家介绍vue+element UI实现树形表格,包括了vue+element UI实现树形表格的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了vue+element UI实现树形表格的具体代码,供大家参考,具体内容如下 一、在component文件夹下新建如下treeTable文件夹,里面有2个文件: eval.js:将数据转换成树形数据 index.vue:树形表格组件 二
使用方法的语法:$('#table').bootstrapTable('method', parameter);。 名称 参数 描述 getOptions none 返回表格的 Options。 getSelections none 返回所选的行,当没有选择任何行的时候返回一个空数组。 getAllSelections none 返回所有选择的行,包括搜索过滤前的,当没有选择任何行的时候返回一个空
vue表格实现 使用vxe-table(树形表格&&展开行表格) 这个使用什么组件库合适 思路 1.将数据处理为一维数组,并在父节点行数据中设置chirldren属性存放子数据,点击全部时通过删除数组中的子数据达到展开收缩效果,----这样不知道合理不合理,求一个更好的解决方法 更新进度: 没有使用上述方法,使用了两次vxe-table 中的tree-node属性,这样会有这样的警告,暂不处理 [
我正在学习Java,有一个非常简单的要求,我似乎不知道哪里出了问题。一个简单的ArrayList,用于写入控制台 名字 姓 多布 我似乎不知道我怎么能把它们打印在一行里 名字姓多布 另一个名字另一个姓氏另一个Dob 提前感谢你所有的帮助。
本文向大家介绍JavaScript动态改变表格单元格内容的方法,包括了JavaScript动态改变表格单元格内容的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript动态改变表格单元格内容的方法。分享给大家供大家参考。具体如下: JavaScript动态改变表格单元格的内容,下面的代码通过修改单元格的innerHTML来修改单元格内容 希望本文所述对大家的javascr