A-Table控件使用详解


一、功能介绍

当我们前端涉及到大量的结构化数据,如果有效且美观的展示变成了一大重点。

此时Table标签无所是最好的帮手,其自带分页展示功能,省去大量编码时间。

效果图

怎么样?是不是很清爽利落,而最为核心的一点,Table 已经内置封装了开发中常见业务需求,使用起来简直不要太方便,对于前端战五渣的我都能轻松上手。

二、页面展示

1. 依赖引入

这里用到的是 Ant Design,需要进行下载引用。

新建命令窗口运行如下命令,其中 –save 表示将依赖信息保存到项目的 package.json 文件中,如不需要去掉即可。

npm i --save ant-design-vue 

mian.js 中添加如下代码进行引用。

import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';
Vue.use(Antd);

2. 页面实现

组件 a-table 常用的标签的属性与其描述参考下表。

属性 描述
columns 用于设置表头。
data-source 用于设置表格内容。
pagination 用于设置分页参数。
bordered 控制是否显示单元格边框。

下面提供一个基本配置示例:

<template>
    <a-table
        :columns="columns"
        :data-source="data"
        :pagination="{ pageSize: 5 }"
        :bordered="false"
    />
</template>

<script>
import { columns, data } from "./const";
export default {
    data() {
        return {
            data,
            columns
        }
    }
}
</script>

三、表格内容

在上述的示例中我将 表头 样式属性单独存放在 js 文件中,并没有和官方文档一样直接放在 script 中,这样代码可读性更高。

下面就详细介绍一下如何使用。

1. 表头内容

注意 dataIndex 属性值要和 data 中的字段名一致才能自动识别,如果是从后端请求数据,则需要和返回的参数名一致。

export const columns = [
    {
        title: '用户名',
        ellipsis: true,
        dataIndex: 'userName'
    }, {
        title: '状态',
        dataIndex: 'status',
    }, {
        title: '操作',
        align: 'center',
        dataIndex: 'operation',
        scopedSlots: { 
            customRender: 'operation' 
        }
    }
]

2. 属性配置

同样表头数组元素的属性与其相应描述信息如下:

属性 描述
title 用于设置表头值。
width 用于设置表格所占的比例,所有列之和为 100% ,当设置为 0 时隐藏该列。
align 用于设置表头对其方式,取值范围:center、right、left 。
sorter 用于设置排序,设置为 true 表头会出现排序按钮。
ellipsis 控制内容过长时自动隐藏,设置为 true 时文本过长自动隐藏,鼠标悬浮时会自动显示。
dataIndex 用于设置字段值,自动读取 data 中同名属性字段值。
scopedSlots 配合插槽动态实现需求样式设计。

3. 事件绑定

上述中使用场景最多的配置即 scopedSlots,举个简单的例子,当后端提供的表格数据为状态码标识码,前台页面往往需要转化为再进行展示,而 scopedSlots 搭配插槽即可动态的需求样式设计。

具体实现如下,其中 slot-scopetext, record 为当前行的记录值,注意这里的 slot 必须和上面 customRender 中的值一致。

<template slot="operation" slot-scope="text, record, index">
    <a-button type="link" @click="ok()">新增</a-button>
</template>

在较新的 vue 版本中会显示 slotslot-scope 弃用,可替换为下述方式。

<template #operation="text, record, index">
    <a-button type="link" @click="ok()">新增</a-button>
</template>

4. 数据填充

在实际开发场景中业务数据肯定是来自后端,下面介绍如何显示接口数据。这里请求数据用的是 Axios ,后端接口采用的是 Spring Boot RESUful

表格中每条数据应单独设置唯一的 Key 值,可以使用 UUID() 函数生成。具体教程参考之间的文章:Axios二次封装Spring Boot接口开发

<script>
import { List } from '@/api/user.js';
import { columns } from "./const";

export default {
    data() {
        return {
        columns,
        data: [],
        }
    },
    created() {
        // 后端数据库
        List().then(res =>{
            this.data.push(res.data);
        })
    }
}
</script> 

四、进阶操作

1. 单元格事件

根据不同常见需要,我们可以给表格设置点击事件,如用户单击或双击表格某一条数据时可以做出对于响应。

具体实现也很简单,只需在 a-table 标签中添加 customRow 属性执行监控即可。

<a-table
  :customRow="customRow"
/>

在方法中设置监控双击。

methods: {
    customRow(record) {
        return {
            on:{
                click: (event) => {
                    console.log(record)
                    this.$message.success('你单击了记录')
                },
                dblclick: (event) => {
                    console.log(record)
                    this.$message.success('你双击了记录')
                }
            }
        }
    }
}

2. 自定义渲染

通过设置表头属性自定义渲染表格内容,如时间格式话、光标悬浮展示等等。

  • 表头属性

    import moment from 'moment'
    
    export const columns = cxt => {
        // eslint-disable-next-line no-unused-vars
        const h = cxt.$createElement
        return [
        {
            title: '编号',
            dataIndex: 'id',
            align: 'center',
        }, {
            title: '时间',
            align: 'center',
            ellipsis: true,
            dataIndex: 'time',
            customRender: (record) => {
                // 格式化时间
                const _time = record !== null ? moment(record).format('YYYY-MM-DD') : '无'
                return <span>{_time}</span>
            },
            customCell: (record) => {
                // 单元格鼠标悬浮预览
                return {
                    attrs: {
                        title: record.name
                    }
                }
            }
        }
        ]
    }
    
  • 页面代码

    <template>
        <a-table
            :columns="columns"
            :data-source="data"
        />
    </template>
    
    <script>
    import { columns } from "./const";
    
    export default {
        data() {
            return {
                data: []
            }
        },
        computed: {
            columns () {
                return columns(this)
            }
        }
    }
    </script>
    

五、自定义分页

默认的 a-table 无法动态定义表格每页展示数据,需要根据 pagination 进行手动配置,最终效果如下:

1. 页面内容

<template>
    <a-table
        :columns="columns"
        :data-source="data"
        :pagination="pagination"
    >
    </a-table>
</template>

2. 属性内容

<script>
import { columns } from './const'

export default {
    name: 'dataAccess', 
    data() {
        return {
            columns,
            data: [],
            pagination: {
                total: 0,
                defaultPageSize: 5,
                showSizeChanger: true,
                pageSizeOptions: ['5', '10', '20', '30'],
                showTotal: total => `共 ${total} 条数据`,
                onShowSizeChange: (current, pageSize) => this.pageSize = pageSize
            }
        }
    }
}
</script>

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录