Table 表格 #
介绍 #
TIP
功能 #
展示行列数据。
表格属性 #
属性 | 描述 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
columns | 列配置 - 更多 | -- | -- | -- |
dataSource | 数据源 | -- | -- | -- |
checkbox | 开启复选框 | boolean | false | true false |
id | 主键 | string | -- | -- |
v-model:selectedKeys | 选中项 (多选) | -- | -- | -- |
v-model:selectedKey | 选中项 (单选) | -- | -- | -- |
default-toolbar | 工具栏 | boolean array | false | true false ['filter','export','print'] |
size | 尺寸 | string | md | lg md sm |
children-column-name | 树节点字段 | string | children | -- |
indent-size | 树表行级缩进 | number | 30 | -- |
height | 表格高度 | number | -- | -- |
maxHeight | 表格最大高度 | number | -- | -- |
even | 斑马条纹 | boolean | false | true false |
cellStyle | 列样式 function(row, column, rowIndex, columnIndex) | string function | -- | -- |
rowStyle | 行样式 function(row, rowIndex) | string function | -- | -- |
cellClassName | 列类名称 function(row, column, rowIndex, columnIndex) | string function | -- | -- |
rowClassName | 行类名称 function(row, rowIndex) | string function | -- | -- |
skin | 风格 | string | -- | line row nob |
expand-index | 展开所在列 | number | -- | -- |
default-expand-all | 默认展开所有列 | boolean | false | true false |
expand-keys | 展开的列 | array | [] | -- |
span-method | 合并算法 | function | -- | -- |
getCheckboxProps | 多选行属性 | function | -- | -- |
getRadioProps | 单选行属性 | function | -- | -- |
列属性 #
插槽 | 描述 | 类型 | 默认值 | 可选值 |
---|---|---|---|---|
title | 列标题 | -- | -- | -- |
key | 数据字段 | -- | -- | -- |
customSlot | 自定义插槽 | -- | -- | -- |
width | 宽度 | -- | -- | -- |
minWidth | 最小宽度 | -- | 100px | -- |
sort | 排序 | -- | -- | -- |
titleSlot | 标题插槽 | -- | -- | -- |
align | 对齐方式 | string | left | left right center |
ellipsisTooltip | 当内容过长被隐藏时显示 tooltip | boolean | false | true false |
fixed | 列固定 | string | -- | left right |
type | 列类型 | string | -- | number checkbox radio |
children | 表头分组 | string | -- | number checkbox radio |
事件 #
属性 | 描述 | 参数 |
---|---|---|
row | 行单击 | { row: 当前行数据 } |
row-double | 行双击 | { row: 当前行数据 } |
row-contextmenu | 行右击 | { row: 当前行数据 } |
change | 分页事件 | { current: 当前页码, limit: 每页数量 } |
插槽 #
插槽 | 描述 | 参数 |
---|---|---|
toolbar | 自定义工具栏 | -- |
footer | 底部扩展 | -- |
expand | 嵌套面板 | { row } ,data 参数由 row 替代,但 data 仍然可用 |
customSlot | 自定义列插槽 | { row,rowIndex,column,columnIndex } ,data 参数由 row 替代,但 data 仍然可用,rowIndex 行索引 columnIndex 列索引 column 列信息参数 |
使用 #
基础使用 #
账户 | 密码 | 资金往来 | ||
---|---|---|---|---|
银行收入(¥) | 银行支出(¥) | 银行余额(¥) |
root | root | 66666 | 77777 | 88888 |
root | root | 66666 | 77777 | 88888 |
woow | woow | 66666 | 77777 | 88888 |
使用
WvTable
标签, 创建表格<template>
<WvTable :columns="columns66" :data-source="dataSource1">
<template #income> 66666 </template>
<template #outlays> 77777 </template>
<template #balance> 88888 </template>
</WvTable>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns66 = ref([
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '180px',
key: 'password',
},
{
title: '资金往来',
align: 'center',
children: [
{
title: '银行收入(¥)',
key: 'income',
align: 'center',
customSlot: 'income',
},
{
title: '银行支出(¥)',
key: 'outlays',
align: 'center',
customSlot: 'outlays',
},
{
title: '银行余额(¥)',
key: 'balance',
align: 'center',
customSlot: 'balance',
},
],
},
])
const dataSource1 = [
{
username: 'root',
password: 'root',
age: '18',
remark: 'weView',
},
{
username: 'root',
password: 'root',
age: '18',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
age: '20',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
]
return {
columns66,
dataSource1,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
tr:nth-child(2n) {
background-color: revert;
}
</style>
显示代码
复制代码片段
不同尺寸 #
账户 | 密码 | 年龄 |
---|
root | root | 18 |
woow | woow | 20 |
不同尺寸
<template>
<form>
<WvRadio v-model="size2" name="action" value="sm">sm</WvRadio>
<WvRadio v-model="size2" name="action" value="md">md</WvRadio>
<WvRadio v-model="size2" name="action" value="lg">lg</WvRadio>
</form>
<WvTable
:columns="columns2"
:data-source="dataSource2"
:size="size2"
></WvTable>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns2 = [
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '180px',
key: 'password',
},
{
title: '年龄',
width: '180px',
key: 'age',
},
]
const dataSource2 = [
{ username: 'root', password: 'root', age: '18' },
{ username: 'woow', password: 'woow', age: '20' },
]
const size2 = ref('md')
return {
size2,
columns2,
dataSource2,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
通过 size
属性表格尺寸。
开启分页 #
开启分页
<template>
<WvTable
:columns="columns3"
:data-source="dataSource3"
:page="page3"
@change="change3"
></WvTable>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const page3 = ref({
total: 100,
limit: 10,
current: 2,
showRefresh: true,
})
const change3 = ({ current, limit }) => {
alert('current:' + current + ' limit:' + limit)
}
const columns3 = [
{
type: 'number',
},
{
title: '账户',
width: '200px',
slot: 'username',
key: 'username',
},
{
title: '密码',
width: '180px',
slot: 'password',
key: 'password',
},
{
title: '年龄',
width: '180px',
key: 'age',
},
]
const dataSource3 = [
{ username: 'root', password: 'root', age: '18' },
{ username: 'woow', password: 'woow', age: '20' },
]
return {
page3,
change3,
columns3,
dataSource3,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
.pager *:not(select),
.wv-table-page {
box-sizing: content-box;
}
.wv-table-page {
padding: 7px 0 0;
height: 50px;
}
</style>
显示代码
复制代码片段
TIP
通过 page
属性设置分页。
开启排序 #
姓名 | 成绩 |
---|
张三 | 100 |
李四 | 80 |
王五 | 99 |
有名 | 92 |
无名 | 60 |
开启排序
<template>
<wv-table :columns="columns4" :data-source="dataSource4"></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns4 = [
{
title: '姓名',
width: '200px',
key: 'name',
},
{
title: '成绩',
width: '180px',
key: 'score',
sort: true,
},
]
const dataSource4 = [
{ name: '张三', score: 100 },
{ name: '李四', score: 80 },
{ name: '王五', score: 99 },
{ name: '有名', score: 92 },
{ name: '无名', score: 60 },
]
return {
columns4,
dataSource4,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
设置列属性 sort: true
, 开启排序。
开启子表 #
姓名 | 成绩 |
---|
张三 | 100 | ||||||||||||
| |||||||||||||
李四 | 80 | ||||||||||||
王五 | 99 | ||||||||||||
有名 | 92 | ||||||||||||
无名 | 60 |
开启子表
<template>
<wv-table
:columns="columns6"
:data-source="dataSource6"
:default-expand-all="defaultExpandAll6"
v-model:expandKeys="expandKeys6"
>
<template #expand="{ data }">
<wv-table :columns="columns6" :data-source="dataSource6"></wv-table>
</template>
</wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns6 = [
{
title: '姓名',
width: '200px',
key: 'name',
},
{
title: '成绩',
width: '180px',
key: 'score',
},
]
const dataSource6 = [
{ id: '1', name: '张三', score: 100 },
{ id: '2', name: '李四', score: 80 },
{ id: '3', name: '王五', score: 99 },
{ id: '4', name: '有名', score: 92 },
{ id: '5', name: '无名', score: 60 },
]
const expandKeys6 = ref(['1'])
const defaultExpandAll6 = ref(false)
return {
columns6,
dataSource6,
expandKeys6,
defaultExpandAll6,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
当表格内容较多不能一次性完全展示时, 可以将多余内容展示到 expand
插槽。
树形表格 #
姓名 | 成绩 |
---|
系统管理 | 100 |
用户管理 | 99 |
角色管理 | 96 |
电商管理 | 100 |
树形表格
<template>
<wv-table
:columns="columns7"
:data-source="dataSource7"
:default-expand-all="defaultExpandAll7"
v-model:expandKeys="expandKeys7"
>
<template #score="{ data }">{{ data }}</template>
</wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns7 = [
{
title: '姓名',
width: '200px',
key: 'name',
ellipsisTooltip: true,
},
{
title: '成绩',
width: '180px',
key: 'score',
},
]
const dataSource7 = [
{
id: '1',
name: '系统管理',
score: 100,
children: [
{ id: '3', name: '用户管理', score: 99 },
{
id: '5',
name: '角色管理',
score: 96,
children: [
{ id: '7', name: '用户管理', score: 99 },
{ id: '8', name: '角色管理', score: 96 },
],
},
],
},
{
id: '2',
name: '电商管理',
score: 100,
children: [
{ id: '4', name: '商品管理', score: 11 },
{ id: '6', name: '分类管理', score: 22 },
],
},
]
const expandKeys7 = ref(['1'])
const defaultExpandAll7 = ref(false)
return {
columns7,
dataSource7,
expandKeys7,
defaultExpandAll7,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
树形数据的展示,当数据中有 children
字段时会自动展示为树形表格, 通过设置 indentSize
以控制每一层的缩进宽度, 使用 childrenColumnName
替换默认字段。
固定表头 #
账户 | 密码 | 年龄 | 操作 |
---|
1 | root | 18 | |
2 | root | 18 | |
3 | root | 18 | |
4 | root | 18 | |
5 | root | 18 | |
6 | root | 18 | |
7 | root | 18 | |
8 | woow | 20 | |
9 | woow | 20 | |
10 | woow | 20 | |
11 | woow | 20 |
固定表头
<template>
<wv-table
:columns="columns8"
:data-source="dataSource8"
:max-height="maxHeight"
>
<template #operator="{ data }">
<button class="btn2" @click="deleteColumn(data)">删除</button>
</template>
</wv-table>
</template>
<script lang="ts">
import { ref } from 'vue'
export default {
setup() {
const maxHeight = ref('300px')
const deleteColumn = ({ username }) => {
const findIndex = dataSource8.value.findIndex(
(item) => item.username === username
)
dataSource8.value.splice(findIndex, 1)
}
const columns8 = [
{
title: '账户',
minWidth: '200px',
key: 'username',
},
{
title: '密码',
minWidth: '180px',
key: 'password',
},
{
title: '年龄',
minWidth: '180px',
key: 'age',
},
{
title: '操作',
width: '200px',
customSlot: 'operator',
key: 'operator',
align: 'center',
},
]
const dataSource8 = ref([
{
username: '1',
password: 'root',
age: '18',
remark: 'weView',
},
{
username: '2',
password: 'root',
age: '18',
remark: 'weView',
},
{
username: '3',
password: 'root',
age: '18',
remark: 'weView',
},
{
username: '4',
password: 'root',
age: '18',
remark: 'weView',
},
{
username: '5',
password: 'root',
age: '18',
remark: 'weView',
},
{
username: '6',
password: 'root',
age: '18',
remark: 'weView',
},
{
username: '7',
password: 'root',
age: '18',
remark: 'weView',
},
{
username: '8',
password: 'woow',
age: '20',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
{
username: '9',
password: 'woow',
age: '20',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
{
username: '10',
password: 'woow',
age: '20',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
{
username: '11',
password: 'woow',
age: '20',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
])
return {
maxHeight,
deleteColumn,
columns8,
dataSource8,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
.btn2 {
border: 0;
border-radius: 0.2em;
background: orangered;
color: white;
cursor: pointer;
}
</style>
显示代码
复制代码片段
TIP
设置 height
或者 max-height
即可实现固定表头。
斑马条纹 #
账户 | 密码 | 年龄 | 备注 |
---|
root | root | 18 | weView |
root | root | 18 | weView |
woow | woow | 20 | weView |
woow | woow | 20 | weView |
woow | woow | 20 | weView |
斑马条纹
<template>
<wv-table :columns="columns1" :data-source="dataSource1" even></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns1 = [
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '180px',
key: 'password',
},
{
title: '年龄',
width: '180px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource1 = [
{ username: 'root', password: 'root', age: '18', remark: 'weView' },
{ username: 'root', password: 'root', age: '18', remark: 'weView' },
{ username: 'woow', password: 'woow', age: '20', remark: 'weView' },
{ username: 'woow', password: 'woow', age: '20', remark: 'weView' },
{ username: 'woow', password: 'woow', age: '20', remark: 'weView' },
]
return {
columns1,
dataSource1,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
通过 even
属性, 开启斑马条纹, 默认为 false
。
定义样式 #
账户 | 密码 | 年龄 | 备注 |
---|
root | root | 18 | weView |
root | root | 18 | weView |
woow | woow | 20 | weView |
woow | woow | 20 | weView |
woow | woow | 20 | weView |
定义样式
<template>
<wv-table
:columns="columns1"
:data-source="dataSource1"
:cell-style="cellStyle"
:row-style="rowStyle"
></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns1 = [
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '180px',
key: 'password',
},
{
title: '年龄',
width: '180px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource1 = [
{ username: 'root', password: 'root', age: '18', remark: 'weView' },
{ username: 'root', password: 'root', age: '18', remark: 'weView' },
{ username: 'woow', password: 'woow', age: '20', remark: 'weView' },
{ username: 'woow', password: 'woow', age: '20', remark: 'weView' },
{ username: 'woow', password: 'woow', age: '20', remark: 'weView' },
]
const cellStyle = function (row, column, rowIndex, columnIndex) {
if (columnIndex % 2 == 0) {
return 'color:red'
}
}
const rowStyle = function (row, rowIndex) {
if (rowIndex % 2 == 0) {
return 'color:blue'
}
}
return {
columns1,
dataSource1,
cellStyle,
rowStyle,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
通过 cellStyle
rowStyle
cellClassName
rowClassName
属性, 自定义单元格样式。
不同风格 #
账户 | 密码 | 年龄 | 备注 |
---|
root | root | 18 | weView |
root | root | 18 | weView |
woow | woow | 20 | weView |
woow | woow | 20 | weView |
woow | woow | 20 | weView |
不同风格
<template>
<form>
<wv-radio v-model="skin1" name="action" value="line">line</wv-radio>
<wv-radio v-model="skin1" name="action" value="nob">nob</wv-radio>
<wv-radio v-model="skin1" name="action" value="row">row</wv-radio>
</form>
<wv-table
:columns="columns1"
:data-source="dataSource1"
:skin="skin1"
></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const skin1 = ref('line')
const columns1 = [
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '180px',
key: 'password',
},
{
title: '年龄',
width: '180px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource1 = [
{ username: 'root', password: 'root', age: '18', remark: 'weView' },
{ username: 'root', password: 'root', age: '18', remark: 'weView' },
{ username: 'woow', password: 'woow', age: '20', remark: 'weView' },
{ username: 'woow', password: 'woow', age: '20', remark: 'weView' },
{ username: 'woow', password: 'woow', age: '20', remark: 'weView' },
]
return {
skin1,
columns1,
dataSource1,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
通过 skin
属性, 切换 table 单元格边框样式。
固定行列 #
账户 | 密码 | 性别 | 年龄 | 备注 |
---|
root | root | 男 | 18 | weView |
root | root | 男 | 18 | weView |
woow | woow | 男 | 20 | weView |
woow | woow | 男 | 20 | weView |
woow | woow | 男 | 20 | weView |
固定行列
<template>
<wv-table :columns="columns20" :data-source="dataSource20"></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns20 = [
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '300px',
key: 'password',
},
{
fixed: 'right',
title: '性别',
width: '180px',
key: 'sex',
},
{
fixed: 'right',
title: '年龄',
width: '180px',
key: 'age',
},
{
fixed: 'right',
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource20 = [
{
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
]
return {
columns20,
dataSource20,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
通过 fixed
属性实现列固定, 可选值为 left
与 right
。
开启序号 #
账户 | 密码 | 性别 | 年龄 | 备注 |
---|
1 | root | root | 男 | 18 | weView |
2 | root | root | 男 | 18 | weView |
3 | woow | woow | 男 | 20 | weView |
4 | woow | woow | 男 | 20 | weView |
5 | woow | woow | 男 | 20 | weView |
开启序号
<template>
<wv-table :columns="columns21" :data-source="dataSource21"></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns21 = [
{
type: 'number',
},
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '300px',
key: 'password',
},
{
title: '性别',
key: 'sex',
},
{
title: '年龄',
width: '300px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource21 = [
{
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
]
return {
columns21,
dataSource21,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
通过 columns
添加列 type:'number'
开启序号列。
开启多选 #
账户 | 密码 | 性别 | 年龄 | 备注 |
---|
root | root | 男 | 18 | weView | |
root | root | 男 | 18 | weView | |
woow | woow | 男 | 20 | weView | |
woow | woow | 男 | 20 | weView | |
woow | woow | 男 | 20 | weView |
开启多选
<template>
<button class="update-btn" @click="changeSelectedKeys">修改选中</button>
<button class="update-btn" @click="changeDataSource23">修改数据</button>
<wv-table
:columns="columns23"
:data-source="dataSource23"
v-model:selectedKeys="selectedKeys5"
></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const selectedKeys5 = ref(['1'])
const getCheckboxProps = (data, index) => {
if (index == 2) {
return { disabled: true }
}
return {}
}
const changeSelectedKeys = () => {
selectedKeys5.value = ['2']
}
const changeDataSource23 = () => {
dataSource23.value = [
{
id: '1',
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '2',
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
]
}
const columns23 = [
{
fixed: 'left',
type: 'checkbox',
},
{
title: '账户',
width: '200px',
key: 'username',
fixed: 'left',
},
{
title: '密码',
width: '300px',
key: 'password',
},
{
title: '性别',
key: 'sex',
},
{
title: '年龄',
width: '300px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource23 = ref([
{
id: '1',
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '2',
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '3',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
id: '4',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
id: '5',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
])
return {
columns23,
dataSource23,
selectedKeys5,
changeSelectedKeys,
getCheckboxProps,
changeDataSource23,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
.update-btn {
margin: 0 1em 1em 0;
padding: 0.5em 1em;
border: 0;
border-radius: 0.2em;
background: #1e9fff;
color: white;
cursor: pointer;
}
</style>
显示代码
复制代码片段
TIP
通过 columns
配置 type:'checkbox'
开启多选列。
开启单选 #
账户 | 密码 | 性别 | 年龄 | 备注 |
---|
| root | root | 男 | 18 | weView |
| root | root | 男 | 18 | weView |
| woow | woow | 男 | 20 | weView |
| woow | woow | 男 | 20 | weView |
| woow | woow | 男 | 20 | weView |
开启单选
<template>
<wv-table
:columns="columns24"
:data-source="dataSource24"
v-model:selected-key="selectedKey24"
></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns24 = [
{
type: 'radio',
},
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '300px',
key: 'password',
},
{
title: '性别',
key: 'sex',
},
{
title: '年龄',
width: '300px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const selectedKey24 = ref('2')
const dataSource24 = [
{
id: '1',
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '2',
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '3',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
id: '4',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
id: '5',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
]
return {
columns24,
dataSource24,
selectedKey24,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
通过 columns
配置 type:'radio'
开启单选列。
无数据 #
账户 | 密码 | 性别 | 年龄 | 备注 |
---|
无数据
无数据
<template>
<wv-table :columns="columns25" :data-source="dataSource25"></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns25 = [
{
title: '账户',
width: '500px',
key: 'username',
},
{
title: '密码',
width: '500px',
key: 'password',
},
{
title: '性别',
key: 'sex',
},
{
title: '年龄',
width: '600px',
key: 'age',
},
{
title: '备注',
width: '380px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource25 = []
return {
columns25,
dataSource25,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
表格无数据时显示为一个空的 LOGO。
刷新数据 #
账户 | 密码 | 性别 | 年龄 | 备注 |
---|
root | root | 男 | 18 | weView |
root | root | 男 | 18 | weView |
woow | woow | 男 | 20 | weView |
woow | woow | 男 | 20 | weView |
woow | woow | 男 | 20 | weView |
刷新数据
<template>
<button class="update-btn" @click="changeDataSource22">更新数据</button>
<wv-table :columns="columns22" :data-source="dataSource22"></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns22 = [
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '300px',
key: 'password',
},
{
title: '性别',
width: '300px',
key: 'sex',
},
{
title: '年龄',
width: '300px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource22 = ref([
{
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
])
const changeDataSource22 = () => {
dataSource22.value = [
{
username: 'update',
password: 'update',
sex: 'boy',
age: '18',
remark: '更新数据 ',
},
]
}
return {
columns22,
dataSource22,
changeDataSource22,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
.update-btn {
margin: 0 1em 1em 0;
padding: 0.5em 1em;
border: 0;
border-radius: 0.2em;
background: #1e9fff;
color: white;
cursor: pointer;
}
</style>
显示代码
复制代码片段
TIP
通过 data-source
的赋值,实现数据的更新。
开启统计 #
账户 | 密码 | 性别 | 年龄 | 备注 |
---|
root | root | 男 | 18 | weView |
root | root | 男 | 18 | weView |
woow | woow | 男 | 20 | weView |
woow | woow | 男 | 20 | weView |
woow | woow | 男 | 20 | weView |
undefined | undefined | 合并: | undefined | undefined |
开启统计
<template>
<wv-table :columns="columns26" :data-source="dataSource26"></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns26 = [
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '300px',
key: 'password',
},
{
title: '性别',
key: 'sex',
totalRow: '合并:',
},
{
title: '年龄',
width: '300px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource26 = [
{
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
]
return {
columns26,
dataSource26,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
通过 columns
配置 totalRow
开启行统计。
合并行列 #
账户 | 密码 | 性别 | 年龄 | 备注 |
---|
root | 男 | 18 | weView | |
root | root | 男 | 18 | weView |
woow | 男 | 20 | weView | |
woow | woow | 男 | 20 | weView |
woow | 男 | 20 | weView |
合并行列
<template>
<wv-table
:columns="columns27"
:data-source="dataSource27"
:span-method="spanMethod27"
:default-toolbar="true"
></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns27 = [
{
title: '账户',
width: '200px',
key: 'username',
},
{
title: '密码',
width: '300px',
key: 'password',
},
{
title: '性别',
key: 'sex',
},
{
title: '年龄',
width: '300px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource27 = [
{
id: '1',
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '2',
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '3',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
id: '4',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
id: '5',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
]
const spanMethod27 = (row, column, rowIndex, columnIndex) => {
if (rowIndex % 2 === 0) {
if (columnIndex === 0) {
return [1, 2]
} else if (columnIndex === 1) {
return [0, 0]
}
}
}
return {
columns27,
dataSource27,
spanMethod27,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
通过 span-method
属性, 自定义行列合并的逻辑。
行内编辑 #
账户 | 密码 | 性别 | 年龄 | 备注 |
---|
root | root | 男 | 18 | weView |
root | root | 男 | 18 | weView |
woow | woow | 男 | 20 | weView |
woow | woow | 男 | 20 | weView |
woow | woow | 男 | 20 | weView |
行内编辑
<template>
<wv-table :columns="columns28" :data-source="dataSource28">
<template #username="{ data }">
<input
v-if="edingKeys.includes(data)"
:value="data.username"
@input="changeUsername($event, data)"
/>
<i
class="wv-icon wv-icon-close"
style="position: absolute;right: 10px;cursor: pointer;"
v-if="edingKeys.includes(data)"
@click="deleteEdit(data)"
></i>
<span v-else>
{{ data.username }}
<i
class="wv-icon wv-icon-edit"
style="position: absolute;right: 10px;cursor: pointer;"
v-if="!edingKeys.includes(data)"
@click="editHandle(data)"
></i>
</span>
</template>
</wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const edingKeys = ref([])
const columns28 = [
{
title: '账户',
width: '200px',
key: 'username',
customSlot: 'username',
},
{
title: '密码',
width: '300px',
key: 'password',
},
{
title: '性别',
key: 'sex',
},
{
title: '年龄',
width: '300px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource28 = ref([
{
id: '1',
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '2',
username: 'root',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '3',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
id: '4',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
id: '5',
username: 'woow',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
])
const editHandle = (data) => {
edingKeys.value.push(data)
}
const deleteEdit = (data) => {
edingKeys.value.splice(edingKeys.value.indexOf(data), 1)
}
const changeUsername = (val, data) => {
dataSource28.value.forEach((element) => {
if (element.id == data.id) {
element.username = val.target.value
}
})
}
return {
edingKeys,
deleteEdit,
columns28,
editHandle,
dataSource28,
changeUsername,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
input {
display: inline-block;
height: 2em;
padding-left: 10px;
background-color: transparent;
border: 1px solid #eeeeee;
}
.wv-icon-close:before {
vertical-align: sub;
}
</style>
显示代码
复制代码片段
TIP
通过列属性 customSlot
, 自定义列插槽。
复杂表头 #
名称 | 地址 | 备注 | |||
---|---|---|---|---|---|
省 | 市 | 区 | 性别 | 年龄 |
就眠儀式 | 山东 | 济南 | 高新区 | 男 | 18 |
就眠儀式 | 山东 | 济南 | 高新区 | 男 | 18 |
就眠儀式 | 山东 | 济南 | 高新区 | 男 | 20 |
就眠儀式 | 山东 | 济南 | 高新区 | 男 | 20 |
就眠儀式 | 山东 | 济南 | 高新区 | 男 | 20 |
复杂表头
<template>
<wv-table
:columns="columns29"
:data-source="dataSource29"
:default-toolbar="true"
></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const columns29 = [
{
title: '名称',
width: '200px',
key: 'username',
},
{
title: '地址',
key: 'address',
children: [
{ title: '省', key: 'province', width: '300px' },
{ title: '市', key: 'city', width: '300px' },
{ title: '区', key: 'area', width: '300px' },
],
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
children: [
{
title: '性别',
key: 'sex',
},
{
title: '年龄',
width: '300px',
totalRow: '统计',
key: 'age',
},
],
},
]
const dataSource29 = [
{
id: '1',
username: '就眠儀式',
province: '山东',
city: '济南',
area: '高新区',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '2',
username: '就眠儀式',
province: '山东',
city: '济南',
area: '高新区',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
},
{
id: '3',
username: '就眠儀式',
province: '山东',
city: '济南',
area: '高新区',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
id: '4',
username: '就眠儀式',
province: '山东',
city: '济南',
area: '高新区',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
{
id: '5',
username: '就眠儀式',
province: '山东',
city: '济南',
area: '高新区',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
},
]
return {
columns29,
dataSource29,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
</style>
显示代码
复制代码片段
TIP
通过列属性 children
, 添加次级表头。
加载过渡 #
名称 | 地址 | 性别 | 年龄 | 备注 | |||
---|---|---|---|---|---|---|---|
省 | 市 | 区 | |||||
县 | 村 |
无数据
加载过渡
<template>
<button class="load-btn" @click="loadData">加载数据</button>
<wv-table
:columns="columns30"
:data-source="dataSource30"
:loading="loading"
></wv-table>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const loading = ref(false)
const columns30 = [
{
title: '名称',
width: '200px',
key: 'username',
},
{
title: '地址',
key: 'address',
children: [
{ title: '省', key: 'province', width: '300px' },
{ title: '市', key: 'city', width: '300px' },
{
title: '区',
children: [
{ title: '县', key: 'xian', width: '100px' },
{ title: '村', key: 'cun', width: '100px' },
],
},
],
},
{
title: '性别',
key: 'sex',
},
{
title: '年龄',
width: '300px',
key: 'age',
},
{
title: '备注',
width: '180px',
key: 'remark',
ellipsisTooltip: true,
},
]
const dataSource30 = ref([])
const loadData = () => {
loading.value = true
setTimeout(() => {
dataSource30.value = [
{
id: '1',
username: '就眠儀式',
province: '山东',
city: '济南',
area: '高新区',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
xian: '1',
cun: '2',
},
{
id: '2',
username: '就眠儀式',
province: '山东',
city: '济南',
area: '高新区',
password: 'root',
sex: '男',
age: '18',
remark: 'weView',
xian: '1',
cun: '2',
},
{
id: '3',
username: '就眠儀式',
province: '山东',
city: '济南',
area: '高新区',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
xian: '1',
cun: '2',
},
{
id: '4',
username: '就眠儀式',
province: '山东',
city: '济南',
area: '高新区',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
xian: '1',
cun: '2',
},
{
id: '5',
username: '就眠儀式',
province: '山东',
city: '济南',
area: '高新区',
password: 'woow',
sex: '男',
age: '20',
remark: 'weView',
xian: '1',
cun: '2',
},
]
loading.value = false
}, 2000)
}
return {
loading,
loadData,
columns30,
dataSource30,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
.load-btn {
margin: 0 1em 1em 0;
padding: 0.5em 1em;
border: 0;
border-radius: 0.2em;
background: #1e9fff;
color: white;
cursor: pointer;
}
</style>
显示代码
复制代码片段
TIP
通过 loading
属性, 切换表格加载动画。
完整表格 #
完整表格
<template>
<wv-table
id="id"
:max-height="maxHeight5"
:columns="columns5"
:expand-index="1"
:data-source="dataSource5"
:checkbox="checkbox5"
:page="page5"
:default-toolbar="defaultToolbar5"
v-model:selected-keys="selectedKeys5"
@row="rowClick5"
@change="change555"
>
<template #toolbar>
<button class="btn" style="background: #1AAD19">新增</button>
<button class="btn">删除</button>
</template>
<template #name="{ row, column, rowIndex, columnIndex }">
{{ row.name }}
</template>
<template #name-title>😊</template>
<template #operator="{ row }">
<button class="btn2" style="background: #1e9fff">修改</button>
<button class="btn2">删除</button>
</template>
</wv-table>
</template>
<script>
import { ref, watch } from 'vue'
export default {
setup() {
const selectedKeys5 = ref(['1'])
const checkbox5 = ref(true)
const defaultToolbar5 = ref(['export', 'print', 'filter'])
const maxHeight5 = ref('600px')
const page5 = {
total: 100,
limit: 10,
current: 1,
}
const columns5 = ref([])
const change555 = function (page) {
console.log(JSON.stringify(page))
}
setTimeout(() => {
columns5.value = [
{
title: '序号',
key: 'index',
fixed: 'left',
type: 'checkbox',
width: '50px',
},
{
title: '姓名',
fixed: 'left',
width: '200px',
titleSlot: 'name-title',
customSlot: 'name',
key: 'name',
align: 'left',
},
{
title: '年龄',
width: '300px',
key: 'age',
ellipsisTooltip: true,
},
{
title: '备注',
width: '300px',
key: 'remark',
ellipsisTooltip: true,
},
{
title: '操作',
width: '150px',
fixed: 'right',
customSlot: 'operator',
key: 'operator',
},
]
}, 2000)
const dataSource5 = [
{
id: '1',
name: '小明',
age: '18',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
{
id: '2',
name: '小红',
age: '20',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
{
id: '3',
name: '小刚',
age: '20',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
{
id: '4',
name: '小李',
age: '20',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
{
id: '5',
name: '小柏',
age: '20',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
{
id: '6',
name: '小吉',
age: '20',
remark:
'weView - 是一个仿element-plus的组件库。weView - 是一个仿element-plus的组件库。',
},
]
const rowClick5 = function (data) {
console.log(JSON.stringify(data))
}
const rowDoubleClick5 = function (data) {
console.log(JSON.stringify(data))
}
watch(selectedKeys5, () => {
console.log('复选框监听:' + selectedKeys5.value)
})
return {
maxHeight5,
columns5,
dataSource5,
selectedKeys5,
checkbox5,
defaultToolbar5,
rowClick5,
rowDoubleClick5,
page5,
change555,
}
},
}
</script>
<style lang="scss" scoped>
.wv-table {
display: table;
}
.btn {
margin: 0 1em 1em 0;
padding: 0.5em 1em;
border: 0;
border-radius: 0.2em;
background: orangered;
color: white;
cursor: pointer;
}
.btn2 {
margin-right: 0.5em;
border: 0;
border-radius: 0.2em;
background: orangered;
color: white;
cursor: pointer;
}
.wv-table-view .wv-table-page {
box-sizing: content-box;
padding: 7px 0;
}
</style>
显示代码
复制代码片段