Skip to content

QilinTable组件

QilinTable组件是一个基于element-plus的表格组件,封装了常用的功能,如分页、排序、筛选、多选、列隐藏、列固定、列合并、列分组、列排序。

基本使用

vue
<template>
    <QilinTable v-model:tableConfig="tableConfig" @changeCurrentPage="changeCurrentPage"
        @changeCurrentSize="changeCurrentSize" @sortChangeData="sortChange" ref="tableConfigRef"
        @selectionChangeData="selectionChangeData" @rowClickData="rowClickData"
        @rowDblClickData="rowDblClickData"
    >
        <template v-slot:project="slotData">
            <span>{{slotData.data.scope.row.project.join("、")}}</span>
        </template>
        <template v-slot:elTableColumn="slotData">
            <el-table-column :label="slotData.data.item.label" :prop="slotData.data.item.prop" 
                :align="slotData.data.item.align" :width="slotData.data.item.width">
                <span>EDGQilin</span>
            </el-table-column>
        </template>
        <template v-slot:elTableHeader="slotData">
            <div style="display:flex;align-items:center;">
                <el-tooltip effect="dark" placement="top" content="这是一个自定义表头">
                    <el-icon><QuestionFilled /></el-icon>
                </el-tooltip>
                <span style="display:inline-block;margin-left:3px;">{{slotData.data.item.label}}</span>
            </div>
        </template>
    </QilinTable>
</template>
<script setup>
import {reactive,ref} from "vue";
// 切换页码事件监听
const changeCurrentPage=(page)=>{
    console.log(page);
    tableConfig.paginationsObj.currentPage=page;
};
// 切换页码事件监听
const changeCurrentSize=(size)=>{
    console.log(size);
    tableConfig.paginationsObj.pageSize=size;
};
// 多选事件监听
const selectionChangeData=(selection)=>{
    console.log(selection);
};
// 排序事件监听
const sortChange=(data)=>{
    console.log(data);
};
// 行单击事件监听
const rowClickData = (row)=>{
    console.log(row);
};
// 行双击事件监听
const rowDblClickData = (row)=>{
    console.log(row);
};

const tableConfig=reactive({
    elTableConfig:{
        border:true,
        stripe:true,
        defaultExpandAll:true,
        rowKey:"salary",
        cellStyle:({row,column,rowIndex,columnIndex})=>{
            // console.log(row,column,rowIndex,columnIndex);
            if(rowIndex === 3 && columnIndex === 2){
                return {
                    "font-weight":"bolder"
                }
            }
        }
    },
    headerConfig:[
        {
            type:"checkbox",
            width:60
        },
        {
            label:"序号",
            type:"sortIndex",
            width:60
        },
        {
            label:"姓名",
            prop:"name",
            type:"text",
            headerSlot:true,
            ellipsis:true,
            width:80
        },
        {
            label:"头像",
            prop:"avatar",
            type:"image",
            width:100,
            imageConfig:{
                ip:"",
                isPreview:false
            }
        },
        {
            label:"出生日期",
            prop:"birthday",
            type:"date",
            format:"chinese",
            sortable:"custom",
            ellipsis:true,
            width:150
        },
        {
            label:"项目",
            prop:"project",
            type:"slot",
            slotName:"project",
            ellipsis:true,
            // tooltipOptions:{
            //     content:"这是我的项目",
            //     placement:"top"
            // },
            width:200
        },
        {
            label:"公司",
            type:"multiple",
            children:[
                {
                    label:"名称",
                    prop:"companyName",
                    type:"text",
                    ellipsis:true,
                    width:160
                },
                {
                    label:"年限",
                    prop:"time",
                    type:"text",
                    width:100
                },
                {
                    label:"职务",
                    prop:"position",
                    type:"text",
                    width:100
                },
                {
                    label:"薪资",
                    prop:"salary",
                    type:"text",
                    width:100
                }
            ]
        },
        {
            label:"昵称",
            prop:"nickName",
            type:"customOperate",
            align:"center",
            width:100
        },
        {
            label:"操作",
            type:"operate",
            fixed:"right",
            hideSeparate:true,
            width:280,
            operateOptions:[
                {
                    btnName:"抽屉",
                    btnType:"primary",
                    btnSize:"default",
                    text:true,
                    btnClick:(row,item,scope,optItem)=>{
                        console.log(row,item,scope,optItem);
                        drawerConfig.isShow=true;
                    }
                },
                {
                    btnName:"删除",
                    btnType:"primary",
                    btnSize:"default",
                    text:true,
                    btnClick:(row,item,scope,optItem)=>{
                        console.log(row,item,scope,optItem);
                    }
                }
            ],
            moreOperateOptions:[
                {
                    btnName:"编辑",
                    btnType:"primary",
                    btnSize:"default",
                    text:true,
                    btnClick:(row,item,scope,optItem)=>{
                        console.log(row,item,scope,optItem);
                    }
                },
                {
                    btnName:"删除",
                    btnType:"primary",
                    btnSize:"default",
                    text:true,
                    btnClick:(row,item,scope,optItem)=>{
                        console.log(row,item,scope,optItem);
                    }
                }
            ]
        }
    ],
    tableData:[
        {
            name:"Qilin",
            avatar:[
                {
                    fileName:"https://www.qilin-web.cn/qilin/uploads/image_20230918151155.jpeg"
                }
            ],
            birthday:"1996-05-12",
            project:["戒毒所","看守所","拘留所","安康医院"],
            companyName:"南京冠霆智能科技有限公司",
            time:"8个月",
            position:"前端开发",
            salary:7000
        },
        {
            name:"Qilin",
            avatar:[
                {
                    fileName:"https://www.qilin-web.cn/qilin/uploads/image_20230918151155.jpeg"
                }
            ],
            birthday:"1996-05-12",
            project:["SDP零信任项目","动态应用安全防护系统BSG"],
            companyName:"亚信智网有限公司",
            time:"13个月",
            position:"前端开发",
            salary:9500
        },
        {
            name:"Qilin",
            avatar:[
                {
                    fileName:"https://www.qilin-web.cn/qilin/uploads/image_20230918151155.jpeg"
                }
            ],
            birthday:"1996-05-12",
            project:["云上贵州项目","红花街道h5项目","温州市党政机关信息化项目"],
            companyName:"苏软科技(南京)有限公司",
            time:"11个月",
            position:"前端开发",
            salary:13000
        },
        {
            name:"Qilin",
            avatar:[
                {
                    fileName:"https://www.qilin-web.cn/qilin/uploads/image_20230918151155.jpeg"
                }
            ],
            birthday:"1996-05-12",
            project:["U创办公管理系统","U创小程序"],
            companyName:"南京联创智慧科技有限公司",
            time:"22个月",
            position:"前端开发",
            salary:15000,
            children:[
                {
                    name:"Qilin",
                    avatar:[
                        {
                            fileName:"https://www.qilin-web.cn/qilin/uploads/image_20230918151155.jpeg"
                        }
                    ],
                    birthday:"1996-05-12",
                    project:["U创办公管理系统","U创小程序"],
                    companyName:"南京联创智慧科技有限公司",
                    time:"22个月",
                    position:"前端开发",
                    salary:16000,
                }
            ]
        }
    ],
    paginationsObj:{
        currentPage:1, //当前页
        pageSize:10, //当前每页数量
        pageSizes:[10,20,30], //每页显示多少条选项集
        total:0, //表格总数量
        layout:"total,sizes,prev,pager,next,jumper"
    }
});
</script>

示例:

Props参数

tableConfig object

核心配置项,支持以下参数。

属性名类型
说明
可选值默认值
elTableConfigobjectel-table标签上的配置项,详见elTableConfig--
headerConfigarray表头配置项,详见headerConfig--
tableDataarray真实数据,详见tableData--
paginationObjobject分页配置项,详见paginationObj--

elFormConfig object

el-table标签上的配置项

属性名类型
说明
可选值默认值
borderboolean是否带边框true/falsefalse
stripeboolean是否带斑马纹true/falsefalse
sizestring表格尺寸small/medium/largemedium
rowKeystring/function行数据的 Key,用来优化 Table 的渲染;在使用reserve-selection功能与显示树形数据时,该属性是必填的--
highlightCurrentRowboolean是否要高亮当前行true/falsefalse
defaultExpandAllboolean是否默认展开所有行,当 Table 包含展开行存在或者为树形表格时有效true/falsefalse
spanMethodfunction合并行或列的计算方法({row,column,rowIndex,columnIndex})=>{return number[]或{rowspan:number,colspan:number}}-
cellStyleobject单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有单元格设置一样的 Style({row,column,rowIndex,columnIndex})=>{return CSSProperties} 或 CSSProperties-
heightstring/numbertable的高度,默认100%;如果 height 为 number 类型,单位 px;如果 height 为 string 类型,则这个高度会设置为 Table 的 style.height 的值,Table 的高度会受控于外部样式。--

headerConfig array

表头相关配置项

属性名类型
说明
可选值默认值
labelstring表头名称--
propstring对应后台数据的字段名--
typestring表头字段的类型;slot和customOperate类型只能用在表格的第一层,多级表头下使用不生效checkbox / sortIndex / text / date / slot / operate / customOperate / multipletext
isHideboolean是否隐藏某个表头true/falsefalse
isHideFnfunction是否隐藏某个表头,返回false则隐藏(item)=>{return true/false}-
replaceValuestring值为空的替代符,当后台数据值为nullundefined时生效--
headerSlotboolean是否自定义表头插槽,当且仅当type为text时生效true/falsefalse
slotNamestringslot插槽元素的name,当且仅当type为slot时生效--
fixedstring/boolean列是否固定在左侧或者右侧。 true 表示固定在左侧left/right/true/falsefalse
formatstring日期时间格式化设置,具体配置项请参考QilinUtils工具库中Date方法中的formatDate()方法-yyyy-MM-dd hh:mm:ss
alignstring对齐方式left/center/rightcenter
widthstring/number列的宽度--
minWidthstring/number对应列的最小宽度,与 width 的区别是 width 是固定的,min-width 会把剩余宽度按比例分配给设置了 min-width 的列--
ellipsisboolean当内容过长被隐藏时显示 tooltiptrue/falsefalse
tooltipOptionsobject超出悬浮展示的配置项,优先级高于ellipsis{content:string,placement:string}-
isShowExpandTooltipboolean是否开启展开行功能true/falsefalse
expandTooltipFnfunction展开行内容方法,内容有方法返回,须配合isShowExpandTooltip一起使用(row,item)=>{}-
hideSeparaterboolean是否隐藏操作按钮之间的分隔符true/falsefalse
operateOptionsarray操作栏按钮配置项,当且仅当type为operate时生效;支持el-button的其余属性,可直接添加,详见operateOptions--
moreOperateOptionsarray操作栏按钮更多配置项,当且仅当type为operate时生效;支持el-button的其余属性,可直接添加;其下配置同operateOptions一致--
operateOptions object

操作栏按钮配置项。

配置项类型
说明
可选值默认值
btnNamestring按钮名称-按钮
btnTypestring按钮类型primary/success/warning/danger/info/textdefault
btnSizestring按钮尺寸small/default/largedefault
isHideboolean是否隐藏按钮true/falsefalse
isHideFnfunction是否隐藏改按钮的方法,优先级低于isHide(row,item,optItem)=>{return true/false}-
disabledboolean是否禁用按钮true/falsefalse
isDisabledfunction是否禁用按钮的方法(row,item)=>{return true/false}-
iconfontClassstring当使用自定义图标时的class类名,需自行引入相关的iconfont图标库--
btnClickfunction按钮点击事件(row,item,scope,optItem)=>{}-

tableData array

真实数据,格式为对象数组,将后台的数据赋值给该属性即可。

paginationObj object

表格分页配置项。

配置项类型
说明
可选值默认值
isHideboolean是否隐藏分页true/falsefalse
currentPagenumber当前页数-1
pageSizenumber每页显示多少条数据-10
pageSizesarray每页显示多少条数据可选项-[10,20,30]
totalnumber数据总量-0
layoutstring分页布局-total, sizes, prev, pager, next, jumper

Events

组件的暴露事件。

事件名类型参数
说明
changeCurrentPagefunctionpage当前页码切换时触发的事件
changeCurrentSizefunctionsize当前每页数量切换时触发的事件
selectRowDatafunctionselection,row当用户手动勾选数据行的 Checkbox 时触发的事件
selectAllRowDatafunctionselection当用户手动勾选全选 Checkbox 时触发的事件
selectionChangeDatafunctionnewSelection当选择项发生变化时会触发该事件
rowClickDatafunctionrow,column,event当某一行被点击时会触发该事件
rowDblClickDatafunctionrow,column,event当某行被双击时会触发该事件
expandChangeDatafunctionrow,expandedRows\expanded当用户对某一行展开或者关闭的时候会触发该事件(展开行时,回调的第二个参数为 expandedRows;树形表格时第二参数为 expanded)
currentChangeDatafunctioncurrentRow,oldCurrentRow当表格的当前行发生变化的时候会触发该事件,如果要高亮当前行,请打开highlightCurrentRow属性
sortChangeDatafunctiondata当表格的排序条件发生变化的时候会触发该事件

Exposes

组件的暴露方法。

方法名类型参数
说明
setCurrentRowfunctionrow用于单选表格,设定某一行为选中行, 如果调用时不加参数,则会取消目前高亮行的选中状态。
toggleRowSelectionfunctionrow,expanded:boolean用于可扩展的表格或树表格,如果某行被扩展,则切换。 使用第二个参数,您可以直接设置该行应该被扩展或折叠。
clearSelectionfunction用于多选表格,清空用户的选择
toggleRowSelectionfunctionrow,selected:boolean用于多选表格,切换某一行的选中状态, 如果使用了第二个参数,则可直接设置这一行选中与否
toggleAllSelectionfunction用于多选表格,切换全选和全不选
sortfunctionprop,order用于手动排序表格

Slots

组件的插槽。

插槽名数据值
说明
{item.slotName}data:{scope,item}设置headerConfig配置项中的type为slot即可使用,用于需要对表格某列数据进行特殊处理的需求,其中设置的slotName属性值就是该插槽名
elTableColumndata:{item}当需要自定义操作栏列时用该插槽代替
elTableHeaderdata:{item}当需要自定义表头时用该插槽代替,此时须配合headerSlot属性使用