cloud-ui.vusion
Version:
Vusion Cloud UI
1,267 lines (1,199 loc) • 48.3 kB
Markdown
# 表格视图 TableView
## 示例
### 基本形式
`layout`布局方式,支持`auto`,`fixed`两种布局,默认是`fixed`布局, `auto`布局一个缺点是数据发生变化各列对应的宽度可能发生变化,取决于内容宽度,推荐使用`fixed`布局
``` vue
<template>
<div>
<u-table-view :data="tdata" layout="auto" border expandPattern="normal">
<u-table-view-column type="expand" title="序列" default-text="">
<template slot="expandContent">
<span>11</span>
</template>
</u-table-view-column>
<u-table-view-column title="日期" label="date" sortable></u-table-view-column>
<u-table-view-column ellipsis title="姓名" label="name" :formatter="formatter"></u-table-view-column>
<u-table-view-column title="地址" label="address" sortable></u-table-view-column>
</u-table-view>
</div>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: '2016-05-02',
name: '王小虎aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
address: '浙江省杭州市滨江区网商路 599号',
}, {
date: '2016-05-04',
name: '王大虎ssssssssssssssssssssssssssssssssssssssssssssssssssssss',
address: '浙江省杭州市滨江区英飞特 D栋3楼'
}, {
date: '2016-05-01',
name: '天王盖地虎dddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
address: '浙江省杭州市滨江区 西可科技园'
}, {
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园'
}, {
date: '2016-05-02',
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
}, {
date: '2016-05-04',
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼'
}, {
date: '2016-05-01',
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园'
}, {
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园'
}, {
date: '2016-05-02',
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
}, {
date: '2016-05-04',
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼'
}, {
date: '2016-05-01',
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园'
}, {
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园'
}],
};
},
methods: {
formatter(row, column) {
if (row.name === '天王盖地虎')
return '逗比一号';
else
return row.name;
}
}
};
</script>
```
#### 默认显示指定limit条行数据
表格列`pattern`属性设置为`limit`值即可,可通过设置`limit`属性控制显示条数
``` vue
<template>
<div>
<u-table-view :data="tdata" border pattern="limit" :limit="4">
<u-table-view-column type="expand" default-text="">
<template slot="expandContent">
<span>11</span>
</template>
</u-table-view-column>
<u-table-view-column title="日期" label="date" sortable></u-table-view-column>
<u-table-view-column ellipsis title="姓名" label="name" :formatter="formatter"></u-table-view-column>
<u-table-view-column ellipsis title="地址" label="address" sortable>
<template slot-scope="scope">
{{scope.row.address}}
</template>
</u-table-view-column>
<u-table-view-column title="性别" label="female" filter :options="options" :value="value" :filter-method="filterMethod"></u-table-view-column>
</u-table-view>
</div>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: '2016-05-02',
name: '王小虎aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
address: '浙江省杭州市滨江区网商路 599号 11111111111111111111111111111111',
female: '男',
}, {
date: '2016-05-04',
name: '王大虎ssssssssssssssssssssssssssssssssssssssssssssssssssssss',
address: '浙江省杭州市滨江区英飞特 D栋3楼',
female: '男',
}, {
date: '2016-05-01',
name: '天王盖地虎dddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
address: '浙江省杭州市滨江区 西可科技园',
female: '女',
}, {
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园',
female: '男',
}, {
date: '2016-05-02',
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
female: '男',
}, {
date: '2016-05-04',
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼',
female: '女',
}, {
date: '2016-05-01',
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园',
female: '女',
}, {
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园',
female: '女',
}, {
date: '2016-05-02',
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
female: '男',
}, {
date: '2016-05-04',
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼',
female: '女',
}, {
date: '2016-05-01',
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园',
female: '男',
}, {
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园',
female: '女',
}],
options: [
{
name: '全部',
value: '',
},
{
name: '男',
value: '男'
},
{
name: '女',
value: '女'
},
],
value: ''
};
},
methods: {
formatter(row, column) {
if (row.name === '天王盖地虎')
return '逗比一号';
else
return row.name;
},
filterMethod(value, columnValue) {
if (value === '')
return true;
return columnValue === value;
},
}
};
</script>
```
#### 排序和格式化
``` vue
<template>
<div>
<u-table-view :data="tdata" border max-height="400">
<u-table-view-column label="date">
<div slot="headerTitle">
日期
</div>
</u-table-view-column>
<u-table-view-column ellipsis title="姓名" label="name" :formatter="formatter"></u-table-view-column>
<u-table-view-column title="地址" label="address" width="200px" sortable></u-table-view-column>
</u-table-view>
</div>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: '2016-05-02',
name: '王小虎aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
address: '浙江省杭州市滨江区网商路 599号',
}, {
date: '2016-05-04',
name: '王大虎ssssssssssssssssssssssssssssssssssssssssssssssssssssss',
address: '浙江省杭州市滨江区英飞特 D栋3楼'
}, {
date: '2016-05-01',
name: '天王盖地虎dddddddddddddddddddddddddddddddddddddddddddddddddddddddd',
address: '浙江省杭州市滨江区 西可科技园'
}, {
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园'
}, {
date: '2016-05-02',
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
}, {
date: '2016-05-04',
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼'
}, {
date: '2016-05-01',
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园'
}, {
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园'
}, {
date: '2016-05-02',
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
}, {
date: '2016-05-04',
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼'
}, {
date: '2016-05-01',
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园'
}, {
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园'
}],
};
},
methods: {
formatter(row, column) {
if (row.name === '天王盖地虎')
return '逗比一号';
else
return row.name;
}
}
};
</script>
```
#### 自定义排序方法
``` vue
<template>
<u-table-view :data="tdata" @sort-change="sortChange">
<u-table-view-column type="expand" default-text="">
<template slot="expandContent">
<span>11</span>
</template>
</u-table-view-column>
<u-table-view-column title="日期" label="date" sortable width="500" :sort-method="sortMethod"></u-table-view-column>
<u-table-view-column title="姓名" label="name" width="50%"></u-table-view-column>
<u-table-view-column title="地址" label="address" width="1000" ></u-table-view-column>
</u-table-view>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: '2016-05-02',
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
}, {
date: '2016-05-04',
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼'
}, {
date: '2016-05-01',
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园'
}, {
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园'
}],
};
},
methods: {
sortMethod(a, b) {
console.log(arguments)
let va = new Date(a).getTime();
let vb = new Date(b).getTime();
if (va -vb < 0)
return true;
else
return false;
},
sortChange(value) {
console.log(value.column, value.label, value.order);
},
}
};
</script>
```
#### 删除选中行
对于`type`类型为`selection`的表格列,可以控制`checkbox`的选择状态,传入`data`中每个对象中属性`selected`属性表示默认是否处于选中状态,`disabled`表示是否可选择
同时也可在表格列规定`headSelection`属性,来控制列表是否可以全选。
``` vue
<template>
<u-linear-layout direction="vertical">
<u-button color="primary" style="width:160px;" :disabled="checkedData.length === 0" @click="delData">删除</u-button>
<u-table-view :data="tdata" @selection-change="selectionChange($event)">
<u-table-view-column type="selection"></u-table-view-column>
<u-table-view-column title="日期" label="date" type="time"></u-table-view-column>
<u-table-view-column title="姓名" label="name" ></u-table-view-column>
<u-table-view-column title="地址" label="address" ></u-table-view-column>
</u-table-view>
</u-linear-layout>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: 1521551897133,
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
selected: true,
}, {
date: 1521551897133,
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼',
disabled: true,
}, {
date: 1521551897133,
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园'
}, {
date: 1521551897133,
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园',
disabled: true,
}],
allChecked: false,
checkedData: [],
};
},
watch: {
allChecked(newValue) {
console.log(newValue);
},
},
methods: {
formatter(row, column) {
if (row.name === '天王盖地虎')
return '逗比一号';
else
return row.name;
},
selectionChange(data) {
console.log(data);
this.checkedData = data;
},
delData() {
let indexs = undefined;
this.checkedData.forEach((item) => {
this.tdata.some((checked, index) => {
if (item.name === checked.name) {
indexs = index;
return true;
}
});
if (indexs !== undefined)
this.tdata.splice(indexs, 1);
});
this.checkedData = [];
},
}
};
</script>
```
#### 有标题的selection
``` vue
<template>
<u-linear-layout direction="vertical">
<u-table-view :data="tdata" @selection-change="selectionChange($event)">
<u-table-view-column type="selection"></u-table-view-column>
<u-table-view-column title="日期" label="date" type="time"></u-table-view-column>
<u-table-view-column title="姓名" label="name" ></u-table-view-column>
<u-table-view-column title="地址" label="address" ></u-table-view-column>
</u-table-view>
</u-linear-layout>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: 1521551897133,
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
selected: true,
}, {
date: 1521551897133,
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼',
disabled: true,
}, {
date: 1521551897133,
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园'
}, {
date: 1521551897133,
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园',
disabled: true,
}],
allChecked: false,
checkedData: [],
};
},
watch: {
allChecked(newValue) {
console.log(newValue);
},
},
methods: {
formatter(row, column) {
if (row.name === '天王盖地虎')
return '逗比一号';
else
return row.name;
},
selectionChange(data) {
console.log(data);
this.checkedData = data;
},
}
};
</script>
```
#### 过滤异步数据
带有过滤数据功能的表格,如果要实现过滤异步加载数据,请监听`filter-change`方法,并发送异步请求获取数据,更改`tdata`即可
``` vue
<template>
<u-table-view :data="tdata" @filter-change="filterChange">
<u-table-view-column title="日期" label="date" sortable :formatter="dateFormat"></u-table-view-column>
<u-table-view-column title="姓名" label="name" ></u-table-view-column>
<u-table-view-column title="地址" label="address" ></u-table-view-column>
<u-table-view-column title="性别" label="female" filter :options="options" :value="value" :filter-method="filterMethod"></u-table-view-column>
</u-table-view>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: 1501977600000,
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
female: '男',
use: 12,
total: 20,
}, {
date: 1502236800000,
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼',
female: '女',
use: 12,
total: 20,
}, {
date: 1503100800000,
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园',
female: '男',
use: 12,
total: 20,
}, {
date: 1503964800000,
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园',
female: '女',
use: 12,
total: 20,
}],
options: [
{
name: '全部',
value: '',
},
{
name: '男',
value: '男'
},
{
name: '女',
value: '女'
},
],
value: ''
};
},
methods: {
filterMethod(value, columnValue) {
if (value === '')
return true;
return columnValue === value;
},
dateFormat(row) {
const value = row.date;
const year = new Date(value).getFullYear();
let month = new Date(value).getMonth() + 1;
month += '';
if(month.length === 1)
month = '0' + month;
const date = new Date(value).getDate();
return year + '-' + month + '-' + date;
},
filterChange(data){
console.log(data);
}
}
};
</script>
```
#### 作用域插槽方式
``` vue
<template>
<div>
<u-table-view :data="tdata" v-show="show">
<u-table-view-column title="日期" width="20%" label="date" sortable :formatter="dateFormat"></u-table-view-column>
<u-table-view-column title="姓名" width="10%" label="name" ></u-table-view-column>
<u-table-view-column title="地址" width="15%" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="10%" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="20%" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="10%" label="address"></u-table-view-column>
<u-table-view-column title="性别" width="15%" label="female" filter :options="options" :value="value" :filter-method="filterMethod"></u-table-view-column>
<u-table-view-column title="占比" width="200">
<template slot-scope="scope">
<u-button @click="click(scope.row)">配置</u-button>
</template>
</u-table-view-column>
</u-table-view>
<u-modal :visible.sync="visible">
<div>
<span>{{current.name}}</span>
<span style="margin-left:10px;">{{current.address}}</span>
</div>
</u-modal>
<u-button @click="tableShow"> show </u-button>
</div>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: 1501977600000,
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
female: '男',
use: 12,
total: 20,
}, {
date: 1502236800000,
name: '王大虎',
address: '浙江省杭州市滨江区英飞特 D栋3楼',
female: '女',
use: 12,
total: 20,
}, {
date: 1503100800000,
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园',
female: '男',
use: 12,
total: 20,
}, {
date: 1503964800000,
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园',
female: '女',
use: 12,
total: 20,
}],
options: [
{
name: '全部',
value: '',
},
{
name: '男',
value: '男'
},
{
name: '女',
value: '女'
},
],
value: '',
current: {},
visible: false,
show: false,
};
},
methods: {
filterMethod(value, columnValue) {
if (value === '')
return true;
return columnValue === value;
},
dateFormat(row) {
const value = row.date;
const year = new Date(value).getFullYear();
let month = new Date(value).getMonth() + 1;
month += '';
if(month.length === 1)
month = '0' + month;
const date = new Date(value).getDate();
return year + '-' + month + '-' + date;
},
click(row) {
console.log('click');
console.log(row);
this.visible = true;
this.current = row;
},
tableShow() {
this.show = !this.show;
}
}
};
</script>
```
#### loading 加载中的状态
``` vue
<template>
<div>
<u-table-view :data="tdata" loading load-text="正在加载中…">
<u-table-view-column title="日期" label="date" sortable></u-table-view-column>
<u-table-view-column title="姓名" label="name" :formatter="formatter"></u-table-view-column>
<u-table-view-column title="地址" label="address" ></u-table-view-column>
</u-table-view>
</div>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: '2016-05-03',
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区 东忠科技园'
}],
};
}
};
</script>
```
#### data为空数组自定义显示文本
``` vue
<template>
<div>
<u-table-view :data="tdata" >
<u-table-view-column type="selection"></u-table-view-column>
<u-table-view-column title="日期" label="date" sortable></u-table-view-column>
<u-table-view-column title="姓名" label="name" :formatter="formatter"></u-table-view-column>
<u-table-view-column title="地址" label="address" ></u-table-view-column>
<div slot="no-data-text">
<span style="margin-right:10px">暂无数据,</span>
<u-link>请刷新页面</u-link>
</div>
</u-table-view>
</div>
</template>
<script>
export default {
data: function () {
return {
tdata: [],
};
}
};
</script>
```
### 对于表格内容过多的情况,提供以下两种解决方案,可以任选一种合适的方式使用
#### 表格行可展开
使用场景:表格的内容过多,展示不下,需要注意的是expand中自定义的内容会受到表格添加的样式对其产生的影响,比如说不换行,居中等,如果不是需要的效果,需要自己自定义消除父元素对其自定义元素内容样式的影响
``` vue
<template>
<div>
<u-table-view :data="tdata">
<u-table-view-column type="expand" default-text="">
<template slot="expandContent" slot-scope="scope">
<u-info-list style="overflow:hidden;text-align:left;white-space:initial;">
<u-info-list-group title="基本信息">
<u-info-list-item label="VPC名称">{{scope.row.name}}</u-info-list-item>
<u-info-list-item label="UUID">152f36a3cfff4572a3a35</u-info-list-item>
<u-info-list-item label="网段">10.3.0.4/16</u-info-list-item>
<u-info-list-item label="默认VPC">是</u-info-list-item>
<u-info-list-item label="创建时间">2018-02-22</u-info-list-item>
</u-info-list-group>
<u-info-list-group title="基本信息">
<u-info-list-item label="VPC名称">defaultVPC</u-info-list-item>
<u-info-list-item label="UUID">152f36a3cfff4572a3a35</u-info-list-item>
<u-info-list-item label="网段">10.3.0.4/16</u-info-list-item>
<u-info-list-item label="默认VPC">是</u-info-list-item>
<u-info-list-item label="创建时间">2018-02-22</u-info-list-item>
</u-info-list-group>
</u-info-list>
</template>
</u-table-view-column>
<u-table-view-column width="200" title="日期" label="date" sortable type="time" time-format="YYYY-MM-DD"></u-table-view-column>
<u-table-view-column title="姓名" width="200" label="name" ></u-table-view-column>
<u-table-view-column title="地址" width="200" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="200" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="200" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="200" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="200" label="address"></u-table-view-column>
<u-table-view-column title="性别" width="200" label="female" filter :options="options" :value="value" :filter-method="filterMethod"></u-table-view-column>
<u-table-view-column title="操作" width="150">
<template slot-scope="scope">
<u-button @click="click(scope.row)">配置</u-button>
</template>
</u-table-view-column>
</u-table-view>
<u-modal :visible.sync="visible">
<div>
<span>{{current.name}}</span>
<span style="margin-left:10px;">{{current.address}}</span>
</div>
</u-modal>
</div>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: 1501977600000,
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
female: '男',
use: 12,
total: 20,
}, {
date: 1502236800000,
name: '王大虎',
address: '浙江省杭州市滨江区网商路 599号',
female: '女',
use: 12,
total: 20,
}, {
date: 1503100800000,
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园',
female: '男',
use: 12,
total: 20,
}, {
date: 1503964800000,
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区英飞特 D栋3楼',
female: '女',
use: 12,
total: 20,
}],
options: [
{
name: '全部',
value: '',
},
{
name: '男',
value: '男'
},
{
name: '女',
value: '女'
},
],
value: '',
current: {},
visible: false,
show: false,
};
},
methods: {
filterMethod(value, columnValue) {
if (value === '')
return true;
return columnValue === value;
},
dateFormat(row) {
const value = row.date;
const year = new Date(value).getFullYear();
let month = new Date(value).getMonth() + 1;
month += '';
if(month.length === 1)
month = '0' + month;
const date = new Date(value).getDate();
return year + '-' + month + '-' + date;
},
click(row) {
console.log('click');
console.log(row);
this.visible = true;
this.current = row;
},
tableShow() {
this.show = true;
}
}
};
</script>
```
#### 固定左右列
使用场景:表格的内容过多,展示不下,可以通过制定表格的宽度和单元列的宽度来展示
``` vue
<template>
<div>
<u-table-view :data="tdata" width="800" height="400" border>
<u-table-view-column width="200" fixed="left" title="日期" label="date" sortable type="time" time-format="YYYY-MM-DD"></u-table-view-column>
<u-table-view-column title="姓名" width="200" label="name" ></u-table-view-column>
<u-table-view-column title="地址" width="200" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="200" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="200" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="200" label="address"></u-table-view-column>
<u-table-view-column title="地址" width="200" label="address"></u-table-view-column>
<u-table-view-column title="性别" width="200" label="female" filter :options="options" :value="value" :filter-method="filterMethod"></u-table-view-column>
<u-table-view-column title="操作" fixed="right" width="150">
<template slot-scope="scope">
<u-button @click="click(scope.row)">配置</u-button>
</template>
</u-table-view-column>
<div slot="no-data-text">
<span style="margin-right:10px">暂无数据,</span>
<u-link>请刷新页面</u-link>
</div>
</u-table-view>
<u-modal :visible.sync="visible">
<div>
<span>{{current.name}}</span>
<span style="margin-left:10px;">{{current.address}}</span>
</div>
</u-modal>
</div>
</template>
<script>
export default {
data: function () {
return {
tdata: [{
date: 1501977600000,
name: '王小虎',
address: '浙江省杭州市滨江区网商路 599号',
female: '男',
use: 12,
total: 20,
}, {
date: 1502236800000,
name: '王大虎',
address: '浙江省杭州市滨江区',
female: '女',
use: 12,
total: 20,
}, {
date: 1503100800000,
name: '天王盖地虎',
address: '浙江省杭州市滨江区 西可科技园',
female: '男',
use: 12,
total: 20,
}, {
date: 1503964800000,
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区',
female: '女',
use: 12,
total: 20,
},
{
date: 1503964800000,
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区',
female: '女',
use: 12,
total: 20,
},
{
date: 1503964800000,
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区',
female: '女',
use: 12,
total: 20,
},
{
date: 1503964800000,
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区',
female: '女',
use: 12,
total: 20,
},
{
date: 1503964800000,
name: '小鸡炖蘑菇',
address: '浙江省杭州市滨江区',
female: '女',
use: 12,
total: 20,
},
],
options: [
{
name: '全部',
value: '',
},
{
name: '男',
value: '男'
},
{
name: '女',
value: '女'
},
],
value: '',
current: {},
visible: false,
show: false,
};
},
methods: {
filterMethod(value, columnValue) {
if (value === '')
return true;
return columnValue === value;
},
dateFormat(row) {
const value = row.date;
const year = new Date(value).getFullYear();
let month = new Date(value).getMonth() + 1;
month += '';
if(month.length === 1)
month = '0' + month;
const date = new Date(value).getDate();
return year + '-' + month + '-' + date;
},
click(row) {
console.log('click');
console.log(row);
this.visible = true;
this.current = row;
},
tableShow() {
this.show = true;
}
}
};
</script>
```
### expand 的高级用法
默认只会展开一个icon中的内容,如果不想有此限制,请给`u-table-view`传入`expandPattern`属性,只要值不等于`'toggle'`就可以,建议传入`'normal'`
```vue
<template>
<u-table-view :show-header="false" expand-pattern="normal" :data="tdata" :row-class-name="rowClassName" @toggle-expand="toggleExpand" border>
<u-table-view-column title="日期" label="date"></u-table-view-column>
<u-table-view-column title="详细信息" label="info"></u-table-view-column>
<u-table-view-column title="icon" expand-class="infoIcon" type="expand" label="listlogs" default-text="" expand-strict expand-icon="up-down">
<template slot="expandContent" slot-scope="scope">
<div>
<p v-for="item in scope.row.listlogs" v-text="item"></p>
</div>
</template>
</u-table-view-column>
</u-table-view>
</template>
<script>
export default {
data() {
return {
tdata: [
{
date: '2018-04-19 14:54:02',
info: '创建实例完成',
listlogs:[
'2018-04-19 14:52:49实例开始创建..',
'2018-04-19 14:52:49云主机开始创建...',
'2018-04-19 14:53:20云主机创建完成,云主机 UUID:05ab50b1-a981-492d-bfac-ebbbf94cea5e',
'2018-04-19 14:53:20云硬盘开始创建...',
],
},
{
date: '2018-05-19 14:54:02',
info: '创建实例完成',
listlogs:[
'2018-05-19 14:52:49实例开始创建..',
'2018-05-19 14:52:49云主机开始创建...',
'2018-05-19 14:53:20云主机创建完成,云主机 UUID:05ab50b1-a981-492d-bfac-ebbbf94cea5e',
'2018-05-19 14:53:20云硬盘开始创建...',
],
},
{
date: '2018-06-19 14:54:02',
info: '创建实例完成',
listlogs:[
'2018-06-19 14:52:49实例开始创建..',
'2018-06-19 14:52:49云主机开始创建...',
'2018-06-19 14:53:20云主机创建完成,云主机 UUID:05ab50b1-a981-492d-bfac-ebbbf94cea5e',
'2018-06-19 14:53:20云硬盘开始创建...',
],
},
{
date: '2018-07-19 14:54:02',
info: '创建实例完成',
},
],
currentIndex: 0,
direction: '', }
},
methods: {
toggleExpand(e) {
// {index, direction, row} index 表示第几行,direction表示方向, row表示当前行的所有数据对象
this.currentIndex = e.index;
this.direction = e.direction;
},
rowClassName (index, row) {
if (index === this.currentIndex && this.direction === 'down') {
return 'infoRow';
}
return '';
}
}
}
</script>
<style module>
:global(.infoRow)[class]{
background: #d8d8d8;
}
:global(.infoIcon){
margin-left: 5px;
}
</style>
```
## TableView API
### Attrs/Props
#### 视图相关属性
| Attr/Prop | Type | Default | Description |
| --------- | ---- | ------- | ----------- |
| color | String | | 值为`'light'`的时,表格头背景是`#fff` |
| visible| Boolean | `true` | 表格是否可见 |
| showHeader| Boolean | `true` | 是否展示表格头 |
| layout| String | `'fixed'` | 表格的布局方式, 可选值: `'fixed'`, `'auto'` |
| border | Boolean | `'false'` | 是否展示表格边框 |
| width | Integer/String | | 表格组件的宽度 |
| height| Integer/String | | 表格组件的高度 |
| maxHeight| Integer/String | | 表格组件的最大高度 |
| minHeight| Integer/String | | 表格组件的最小高度 |
| defaultText | String | `'-'` | 默认当单元格取值为空时,默认显示的内容,此处是设置整个表格 |
| loading| Boolean | `false` | 是否展示加载中的状态信息 |
| loadText| String | `''` | 加载中的文字信息提示 |
| noDataText | String | `''` | 当`data`属性为空数组时,展示的信息 |
| pattern| String | `'normal'` | 值设置为`'limit'`可支持显示指定数目的数据,可选值: `'normal'`, `'limit'` |
| limit| String, Number | `5` | 在`pattern`属性值为`'limit'`时,默认显示数据的数目 |
| limitText| String | `'查看更多'` | 在`pattern`属性值为`'limit'`时,数据的数目大于`'limit'`属性 的值时默认在表格最后一行显示的提示内容 |
| allText| String | `'收起'`| 在`pattern`属性值为`'limit'`时,显示所有数据后默认在表格最后一行显示的提示内容 |
| expandPattern | String | `'toggle'` | 规定`type`属性值为`'expand'`列的展开行为,可选值: `'toggle'`,`'normal'`。值为`'toggle'`时,展开一行后其他行将收回。 值为`'normal'`时,每行都可以展开。|
| rowClassName | Function | | 给表格行添加自定义class函数,第一个参数表示索引,即在第几行中,第二个参数是表格当前行数据 |
| xScroll | Boolean | `false` | 鼠标滚动时表格是否可以横向滚动 |
#### 数据相关属性
| Attr/Prop | Type | Default | Description |
| --------- | ---- | ------- | ----------- |
| title | String | | 表格的标题 |
| data | Array | | 表格默认要显示的数据 |
| allChecked.sync | Boolean | `false` | 默认是否全部选中 |
| defaultSort | Object\< title, order \> | | 默认的排序列和顺序值,其中`title`属性指定默认排序的列。`order`指定默认排序的顺序,可选值: `'desc'`,`'asc'`。 |
| defaultFilter | Object\< title, value, column \> | | 默认采用某列进行过滤,其中`title`属性指定默认过滤的列,`value`指定默认过滤的值,在存在多个过滤列的时候可以使用此属性指定,当前只有一个列的时候可以不指定,默认会使用第一个filter列 |
| forceFilter | Boolean | `true` | 数据发生变化时,存在数据过滤列,是否需要进行过滤,默认是需要的,但是异步获取的情况下,会出现死循环,需要将此值置为`false` |
### Slots
#### (default)
插入`<u-table-view-column>`子组件。
#### title
自定义表格标题
#### limit-text
在`pattern`属性值为`'limit'`时,数据的数目大于`'limit'`属性 的值时默认在表格最后一行显示的提示内容
#### all-text
在`pattern`属性值为`'limit'`时,显示所有数据后默认在表格最后一行显示的提示内容
#### no-data-text
数据为空时自定义显示文本
#### expandIcon
在列中`type`属性值为`'expand'`时,替换默认的切换图标
### Events
#### @sort-change
点击排序标签触发
| Param | Type | Description |
| ----- | ---- | ----------- |
| $event.column | Object | 当前列`column`的实例,含有当前列的所有信息,实质是`table-view-column`实例 |
| $event.label | String | 当前列的标签值 |
| $event.order | String | 当前列排序值: `'asc'`或`'desc'` |
#### @filter-change
点击过滤标签触发
| Param | Type | Description |
| ----- | ---- | ----------- |
| $event.column | Object | 当前列`column`的实例,含有当前列的所有信息,实质是`table-view-column`实例 |
| $event.value | String | 选中的标签值 |
| $event.index | Number | 当前列的索引值 |
#### @selection-change
点击checkbox触发
| Param | Type | Description |
| ----- | ---- | ----------- |
| $event | Array | 选中的行的数据集合 |
#### @row-click
点击表格行触发
| Param | Type | Description |
| ----- | ---- | ----------- |
| $event.data | Object | 选中的行的数据集合 |
| $event.index | Int | 行数据所在的索引值 |
#### @toggle-expand
列展开或收回时触发
| Param | Type | Description |
| ----- | ---- | ----------- |
| $event.index | Int | 选中的行的数据索引 |
| $event.direction | String | icon的方向,向哪个方向展开或收起 |
| $event.row | Object | 选中行的数据 |
## TableViewColumn API
### Props/Attrs
#### 视图相关属性
| Prop/Attr | Type | Default | Description |
| --------- | ---- | ------- | ----------- |
| width | String | | 是指列的宽度值 |
| border | Boolean | `false` | 是否有边框,默认无 |
| fixed | String | | 将列固定在左边或右边,参见例子`固定左右列`,可选值:`'left'`,`'right'`,`''` |
| ellipsis | Boolean | `false` | 是否换行,默认换行,值为`true`则开启不换行,超出部分显示为省略号 |
| defaultText | String | `'-'` | 默认当单元格取值为空时,默认显示的内容,此处是设置某一列的显示 |
| headClass | String | `''` | 给表格头部`'th'`添表格内容过多加自定义`'class'`名称,方便对表格头部自定义样式 |
| placement | String | `'bottom-start'` | 可过滤列选项弹出层的弹出方向,可选值:`'top'`, `'bottom'`, `'left'`, `'right'`, `'top-start'`, `'top-end'`, `'bottom-start'`, `'bottom-end'`, `'left-start'`,`'left-end'`, `'right-start'`, `'right-end'` |
| expandIcon | String | `'right-down'` | `icon`的图标展开方向,提供两种类型,一种是默认向右点击向下`'right-down'`,另一种是默认向下点击向上`'up-down'` |
| expandStrict | Boolean | `false` | 当`type`属性值为`'expand'`时,开启`'expand'`严格匹配模式, 只有对应的`label`字段有值才显示`icon` |
| expandLabel | String | | 当`type`属性值为`'expand'`时,当出现组合形式的时候,使用此字段指定`icon`展开依赖的属性字段 |
| expandClass | String | | 当`type`属性值为`'expand'`时,定义`icon`的样式 |
#### 数据相关属性
| Prop/Attr | Type | Default | Description |
| --------- | ---- | ------- | ----------- |
| title | String | | 列的标题 |
| value | String | | 默认过滤项选中的值 |
| label | String | | 对象data中对象的属性 |
| type | String | | 可选值:`'selection'`,`'expand'`,`'time'`。值为`'selection'`,表示此列是否是可选择的, 对于日期类型的值可以设置值为`'time'`,配合`timeFormat`属性,转换成想要的日期格式, `'expand'`表示在当前行出现icon标识,点击icon当前行下新增新一行数据 |
| timeFormat | String | `'YYYY-MM-DD HH:mm:ss'` | 定义`type`属性值为`'time'`时,返回的指定日期格式的值 |
| sortable | Boolean | `false` | 列是否可排序 |
| filter | Boolean | `false` | 列是否可过滤 |
| headSelection | Boolean | `true` | 列表是否可全选 |
| options | Array\{name, value} | | 过滤项列表 |
| formatter | Function | | 自定义格式化列数据,第一个参数是含有该行数据的对象,第二个参数是列实例 |
| sortMethod | Function | | 自定义排序方法,第一个参数为该列前一行数据,第二个参数为该列后一行数据,方法需要返回值,返回类型为`Boolean`|
| sortRemoteMethod | Function| | 异步执行排序传入的方法,第一个参数是列字段,第二个参数是排序顺序,第三个参数是列对象 |
| filterMethod | Function | | 自定义过滤方法,第一个参数为该列数据,第二个参数为列实例 |
### Slots
#### headerTitle
插入自定义`th`标签内容。
#### expandContent
插入自定义`icon`展开的内容。