From a42f4712085b8aebef57eaa86c3f39e93747c74f Mon Sep 17 00:00:00 2001 From: liugq Date: Mon, 11 Feb 2019 16:39:40 +0800 Subject: [PATCH] refine tree table --- src/components/TreeTable/eval.js | 40 +++--- src/components/TreeTable/index.vue | 168 ++++++++++++------------ src/components/TreeTable/readme.md | 134 ++++++++++--------- src/views/table/treeTable/treeTable.vue | 21 +-- 4 files changed, 184 insertions(+), 179 deletions(-) diff --git a/src/components/TreeTable/eval.js b/src/components/TreeTable/eval.js index d9b89e1c..dcb8fe24 100644 --- a/src/components/TreeTable/eval.js +++ b/src/components/TreeTable/eval.js @@ -1,27 +1,23 @@ -/** -* @Author: jianglei -* @Date: 2017-10-12 12:06:49 -*/ -'use strict' import Vue from 'vue' -export default function treeToArray(data, expandAll, parent = null, level = null) { + +// 给数据添加额外的几个属性,并且扁平化数组 +export default function formatData( + data, + { parent = null, leavel = 0, expand = false } = {} +) { + console.log('data', data) let tmp = [] - Array.from(data).forEach(function(record) { - if (record._expanded === undefined) { - Vue.set(record, '_expanded', expandAll) - } - let _level = 1 - if (level !== undefined && level !== null) { - _level = level + 1 - } - Vue.set(record, '_level', _level) - // 如果有父元素 - if (parent) { - Vue.set(record, 'parent', parent) - } - tmp.push(record) - if (record.children && record.children.length > 0) { - const children = treeToArray(record.children, expandAll, record, _level) + data.forEach(item => { + Vue.set(item, '__leavel', leavel) + Vue.set(item, '__expand', expand) + Vue.set(item, '__parent', parent) + + tmp.push(item) + if (item.children && item.children.length > 0) { + const children = formatData(item.children, { + parent: item, + leavel: leavel + 1 + }) tmp = tmp.concat(children) } }) diff --git a/src/components/TreeTable/index.vue b/src/components/TreeTable/index.vue index a48765c8..5421fb51 100644 --- a/src/components/TreeTable/index.vue +++ b/src/components/TreeTable/index.vue @@ -1,41 +1,37 @@ - diff --git a/src/components/TreeTable/readme.md b/src/components/TreeTable/readme.md index 5b598e11..c23d8cb1 100644 --- a/src/components/TreeTable/readme.md +++ b/src/components/TreeTable/readme.md @@ -1,89 +1,87 @@ ## 写在前面 -此组件仅提供一个创建TreeTable的解决思路 -## prop说明 -#### *data* - **必填** +此组件仅提供一个创建 TreeTable 的解决思路 - 原始数据,要求是一个数组或者对象 - ```javascript - [{ - key1: value1, - key2: value2, - children: [{ +## prop 说明 + +- data(**必填**) + +原始数据,要求是一个数组或者对象 + +```js +const data = [ + { + key1: value1, + key2: value2, + children: [ + { key1: value1 }, { key1: value1 - }] - }, - { - key1: value1 - }] - ``` - 或者 - ```javascript - { - key1: value1, - key2: value2, - children: [{ - key1: value1 - }, - { - key1: value1 - }] - } - ``` + } + ] + }, + { + key1: value1 + } +] +``` -#### columns - 列属性,要求是一个数组 +或者 - 1. text: 显示在表头的文字 - 2. value: 对应data的key。treeTable将显示相应的value - 3. width: 每列的宽度,为一个数字(可选) +```javascript + { + key1: value1, + key2: value2, + children: [{ + key1: value1 + }, + { + key1: value1 + }] + } +``` - 如果你想要每个字段都有自定义的样式或者嵌套其他组件,columns可不提供,直接像在el-table一样写即可,如果没有自定义内容,提供columns将更加的便捷方便 +- columns - 如果你有几个字段是需要自定义的,几个不需要,那么可以将不需要自定义的字段放入columns,将需要自定义的内容放入到slot中,详情见后文 - ```javascript - [{ - value:string, - text:string, - width:number - },{ - value:string, - text:string, - width:number - }] - ``` +列属性,要求是一个数组 -#### expandAll - 是否默认全部展开,boolean值,默认为false +1. label: 显示在表头的文字 +2. key: 对应 data 的 key。treeTable 将显示相应的 value +3. width: 每列的宽度,为一个数字(可选) + +树表组件将会根据 columns 的 key 属性生成具名插槽,如果你需要对列数据进行自定义,通过插槽即可实现 + +```javascript +const columns = [ + // 建议第一列做展开收缩操作 + { label: '', key: '__spread', width: '200' }, + { + value: string, + text: string, + width: number + }, + { + value: string, + text: string, + width: number + } +] +``` #### evalFunc - 解析函数,function,非必须 - 如果不提供,将使用默认的[evalFunc](./eval.js) +解析函数,function,非必须 - 如果提供了evalFunc,那么会用提供的evalFunc去解析data,并返回treeTable渲染所需要的值。如何编写一个evalFunc,请参考[*eval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/components/TreeTable/eval.js)或[*customEval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/table/treeTable/customEval.js) +如果不提供,将使用默认的[evalFunc](./eval.js) + +如果提供了 evalFunc,那么会用提供的 evalFunc 去解析 data,并返回 treeTable 渲染所需要的值。 #### evalArgs - 解析函数的参数,是一个数组 - **请注意,自定义的解析函数参数第一个为this.data,第二个参数为, this.expandAll,你不需要在evalArgs填写。一定记住,这两个参数是强制性的,并且位置不可颠倒** *this.data为需要解析的数据,this.expandAll为是否默认展开* +解析函数的参数,是一个对象,如果需要展开所有的数据,那么就传入`{expand:true}` - 如你的解析函数需要的参数为`(this.data, this.expandAll,1,2,3,4)`,那么你只需要将`[1,2,3,4]`赋值给`evalArgs`就可以了 +## 其他 - 如果你的解析函数参数只有`(this.data, this.expandAll)`,那么就可以不用填写evalArgs了 - - 具体可参考[*customEval.js*](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/table/treeTable/customEval.js)的函数参数和[customTreeTable](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/table/treeTable/customTreeTable.vue)的`evalArgs`属性值 - - ## slot - 这是一个自定义列的插槽。 - - 默认情况下,treeTable只有一行行展示数据的功能。但是一般情况下,我们会要给行加上一个操作按钮或者根据当行数据展示不同的样式,这时我们就需要自定义列了。请参考[customTreeTable](https://github.com/PanJiaChen/vue-element-admin/blob/master/src/views/table/treeTable/customTreeTable.vue),[实例效果](https://panjiachen.github.io/vue-element-admin/#/table/tree-table) - - `slot`和`columns属性`可同时存在,columns里面的数据列会在slot自定义列的左边展示 - - ## 其他 - 如果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的api自行修改index.vue +如果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的 api 自行修改 index.vue diff --git a/src/views/table/treeTable/treeTable.vue b/src/views/table/treeTable/treeTable.vue index d2ecf14d..541c1394 100644 --- a/src/views/table/treeTable/treeTable.vue +++ b/src/views/table/treeTable/treeTable.vue @@ -24,21 +24,26 @@ export default { return { columns: [ { - text: '事件', - value: 'event', + label: '', + key: '__sperad' + + }, + { + label: '事件', + key: 'event', width: 200 }, { - text: 'ID', - value: 'id' + label: 'ID', + key: 'id' }, { - text: '时间线', - value: 'timeLine' + label: '时间线', + key: 'timeLine' }, { - text: '备注', - value: 'comment' + label: '备注', + key: 'comment' } ], data: [