forked from PanJiaChen/vue-element-admin
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat[treeTable]: add treeTable (PanJiaChen#415)(PanJiaChen#319)
* 1.增加treeTable 2.增加两个treeTable的demo * 1.增加treeTable的使用功能说明 * 优化代码,去除console * 修复bug * 修复marLTemp变量未清空的bug * 修复marLTemp变量未清空的bug * 修复marLTemp变量未清空的bug * 修改customTree,使其展示无columns时的功能
- Loading branch information
1 parent
840eda6
commit 1610945
Showing
9 changed files
with
529 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
/** | ||
* @Author: jianglei | ||
* @Date: 2017-10-12 12:06:49 | ||
*/ | ||
'use strict' | ||
import Vue from 'vue' | ||
export default function treeToArray(data, expandedAll, parent, level) { | ||
let tmp = [] | ||
Array.from(data).forEach(function(record) { | ||
if (record._expanded === undefined) { | ||
Vue.set(record, '_expanded', expandedAll) | ||
} | ||
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, expandedAll, record, _level) | ||
tmp = tmp.concat(children) | ||
} | ||
}) | ||
return tmp | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
<template> | ||
<el-table :data="formatData" :row-style="showRow"> | ||
<el-table-column v-if="columns.length===0" width="150"> | ||
<template slot-scope="scope"> | ||
<span v-for="space in scope.row._level" | ||
class="ms-tree-space"></span> | ||
<span class="tree-ctrl" v-if="iconShow(0,scope.row)" | ||
@click="toggleExpanded(scope.$index)"> | ||
<i v-if="!scope.row._expanded" class="el-icon-plus"></i> | ||
<i v-else class="el-icon-minus"></i> | ||
</span> | ||
{{scope.$index}} | ||
</template> | ||
</el-table-column> | ||
<el-table-column v-else v-for="(column, index) in columns" :key="column.value" | ||
:label="column.text" :width="column.width"> | ||
<template slot-scope="scope"> | ||
<span v-if="index === 0" v-for="space in scope.row._level" | ||
class="ms-tree-space"></span> | ||
<span class="tree-ctrl" v-if="iconShow(index,scope.row)" | ||
@click="toggleExpanded(scope.$index)"> | ||
<i v-if="!scope.row._expanded" class="el-icon-plus"></i> | ||
<i v-else class="el-icon-minus"></i> | ||
</span> | ||
{{scope.row[column.value]}} | ||
</template> | ||
</el-table-column> | ||
<slot></slot> | ||
</el-table> | ||
</template> | ||
|
||
<script> | ||
/** | ||
Auth: Lei.j1ang | ||
Created: 2018/1/19-13:59 | ||
*/ | ||
import treeToArray from './eval' | ||
export default { | ||
name: 'treeTable', | ||
props: { | ||
a: 1, | ||
data: { | ||
type: [Array, Object], | ||
required: true | ||
}, | ||
columns: { | ||
type: Array, | ||
default: () => [] | ||
}, | ||
evalFunc: Function, | ||
evalArgs: Array, | ||
expandAll: { | ||
type: Boolean, | ||
default: false | ||
} | ||
}, | ||
computed: { | ||
// 格式化数据源 | ||
formatData: function() { | ||
let tmp | ||
if (!Array.isArray(this.data)) { | ||
tmp = [this.data] | ||
} else { | ||
tmp = this.data | ||
} | ||
const func = this.evalFunc || treeToArray | ||
const args = this.evalArgs ? Array.concat([tmp], this.evalArgs) : [tmp, this.expandAll] | ||
return func.apply(null, args) | ||
} | ||
}, | ||
methods: { | ||
showRow: function(row) { | ||
const show = (row.row.parent ? (row.row.parent._expanded && row.row.parent._show) : true) | ||
row.row._show = show | ||
return show ? '' : 'display:none;' | ||
}, | ||
// 切换下级是否展开 | ||
toggleExpanded: function(trIndex) { | ||
const record = this.formatData[trIndex] | ||
record._expanded = !record._expanded | ||
}, | ||
// 图标显示 | ||
iconShow(index, record) { | ||
return (index === 0 && record.children && record.children.length > 0) | ||
} | ||
} | ||
} | ||
</script> | ||
|
||
<style lang="scss" rel="stylesheet/scss" scoped> | ||
$color-blue: #2196F3; | ||
$space-width: 18px; | ||
.ms-tree-space { | ||
position: relative; | ||
top: 1px; | ||
display: inline-block; | ||
font-style: normal; | ||
font-weight: 400; | ||
line-height: 1; | ||
width: $space-width; | ||
height: 14px; | ||
&::before { | ||
content: "" | ||
} | ||
} | ||
.processContainer{ | ||
width: 100%; | ||
height: 100%; | ||
} | ||
table td { | ||
line-height: 26px; | ||
} | ||
.tree-ctrl{ | ||
position: relative; | ||
cursor: pointer; | ||
color: $color-blue; | ||
margin-left: -$space-width; | ||
} | ||
</style> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
## 写在前面 | ||
此组件仅提供一个创建TreeTable的解决方案 | ||
##prop说明 | ||
###data | ||
必输 | ||
|
||
原始数据,要求是一个数组或者对象 | ||
```javascript | ||
[{ | ||
key1:value1, | ||
key2:value2, | ||
children:[{ | ||
key1:value1 | ||
},{ | ||
key1:value1 | ||
}] | ||
},{ | ||
key1:value1 | ||
}] | ||
``` | ||
或者 | ||
```javascript | ||
{ | ||
key1:value1, | ||
key2:value2, | ||
children:[{ | ||
key1:value1 | ||
},{ | ||
key1:value1 | ||
}] | ||
} | ||
``` | ||
|
||
###columns | ||
列属性,要求是一个数组 | ||
|
||
1. text: 显示在表头 | ||
2. value: 对应data的key,treeTable将显示相应的value | ||
3. width: 每列的宽度,为一个数字 | ||
如果你想要每个字段都有自定义的样式或者嵌套其他组件,columns可不提供,直接像在el-table一样写即可,如果没有自定义内容,提供columns将更加的便捷方便 | ||
```javascript | ||
[{ | ||
value:string, | ||
text:string, | ||
width:number | ||
},{ | ||
value:string, | ||
text:string, | ||
width:number | ||
}] | ||
``` | ||
|
||
### expandAll | ||
是否默认全部展开,boolean值,默认为false | ||
|
||
### evalFunc | ||
解析函数,function,非必须 | ||
|
||
如果不提供,将使用默认的evalFunc | ||
|
||
如果提供了evalFunc,那么会用提供的evalFunc去解析data,并返回treeTable渲染所需要的值。如何编写一个evalFunc,请参考此目录下的*eval.js* | ||
|
||
### evalArgs | ||
解析函数的参数,是一个数组 | ||
|
||
**请注意,自定义的解析函数参数第一个为this.data,你不需要在evalArgs填写。** | ||
|
||
如你的解析函数需要的参数为`(this.data,1,2,3,4)`,那么你只需要将`[1,2,3,4]`赋值给`evalArgs`就可以了 | ||
## slot | ||
请参考`customTreeTable` | ||
|
||
## 其他 | ||
如果有其他的需求,请参考[el-table](http://element-cn.eleme.io/#/en-US/component/table)的api自行修改index.vue |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
/** | ||
* @Author: jianglei | ||
* @Date: 2017-10-12 12:06:49 | ||
*/ | ||
'use strict' | ||
import Vue from 'vue' | ||
export default function treeToArray(data, parent, level, expandedAll, item) { | ||
const marLTemp = [] | ||
let tmp = [] | ||
Array.from(data).forEach(function(record) { | ||
if (record._expanded === undefined) { | ||
Vue.set(record, '_expanded', expandedAll) | ||
} | ||
let _level = 1 | ||
if (level !== undefined && level !== null) { | ||
_level = level + 1 | ||
} | ||
Vue.set(record, '_level', _level) | ||
// 如果有父元素 | ||
if (parent) { | ||
Vue.set(record, 'parent', parent) | ||
// 如果父元素有偏移量,需要计算在this的偏移量中 | ||
// 偏移量还与前面同级元素有关,需要加上前面所有元素的长度和 | ||
if (!marLTemp[_level]) { | ||
marLTemp[_level] = 0 | ||
} | ||
Vue.set(record, '_marginLeft', marLTemp[_level] + parent._marginLeft) | ||
Vue.set(record, '_width', record[item] / parent[item] * parent._width) | ||
// 在本次计算过偏移量后加上自己长度,以供下一个元素使用 | ||
marLTemp[_level] += record._width | ||
} else { | ||
// 如果为根 | ||
// 初始化偏移量存储map | ||
marLTemp[record.id] = [] | ||
// map中是一个数组,存储的是每级的长度和 | ||
// 初始情况下为0 | ||
marLTemp[record.id][_level] = 0 | ||
Vue.set(record, '_marginLeft', 0) | ||
Vue.set(record, '_width', 1) | ||
} | ||
tmp.push(record) | ||
if (record.children && record.children.length > 0) { | ||
const children = treeToArray(record.children, record, _level, expandedAll, item) | ||
tmp = tmp.concat(children) | ||
} | ||
}) | ||
return tmp | ||
} |
Oops, something went wrong.