如何在uniapp中实现一个表格组件?

news/2025/1/18 8:12:31/

 

功能介绍:

1 表格头自定义列。

2 表格头支持勾选功能,并且支持配置。通过配置显示或隐藏该功能

3 支持自定义样式和自定义操作。比如修改列数据内容样式,上图中年龄做了自定义的处理,点击某列内容可以自定义操作。

-------------------table 的核心代码-------------------------------<template><view class="table-container"><!-- 表格 --><view class="table"><!-- 表头 --><view class="table-header"><view v-if="canCheck" class="header-cell checkbox-cell"><checkbox-group @change="handleSelectAll"><checkbox :checked="isAllSelected" /></checkbox-group></view><viewv-for="(column, index) in columns":key="index"class="header-cell":style="{ width: column.width || 'auto' }">{{ column.title }}</view><view v-if="hasActions" class="header-cell actions-cell">操作</view></view><!-- 表格行 --><view class="table-body"><viewv-for="(row, rowIndex) in data":key="rowIndex"class="table-row":class="{ selected: selectedRows.includes(row) }"><!-- 复选框 --><view v-if="canCheck" class="body-cell checkbox-cell"><checkbox-group @change="(e) => handleSelectRow(row, e)"><checkbox :checked="selectedRows.includes(row)" /></checkbox-group></view><!-- 数据列 --><viewv-for="(column, colIndex) in columns":key="colIndex"class="body-cell":style="{ width: column.width || 'auto' }"><slot name="cell" :row="row" :column="column" :index="rowIndex"><!-- 默认渲染 -->{{ row[column.key] }}</slot></view><!-- 操作列 --><view v-if="hasActions" class="body-cell actions-cell"><slot name="actions" :row="row" :index="rowIndex"></slot></view></view></view></view><!-- 加载更多 --><view v-if="hasMore" class="load-more" @click="loadMore"><text>点击加载更多</text></view></view>
</template><script setup lang="ts">
import { ref, computed, useSlots } from 'vue'// 定义表格列接口
interface TableColumn {title: string // 列标题key: string // 列数据字段width?: string // 列宽度slot?: string
}// 定义表格数据接口
interface TableRow {[key: string]: any // 动态字段
}// 定义 props
const props = defineProps<{columns: TableColumn[] // 表格列配置data: TableRow[] // 表格数据canCheck?: boolean // 是否显示复选框hasMore?: boolean // 是否还有更多数据
}>()// 定义事件
const emit = defineEmits(['select-all', 'select-row', 'load-more'])// 获取插槽
const slots = useSlots()// 选中的行
const selectedRows = ref<TableRow[]>([])// 是否全选
const isAllSelected = computed(() => {return selectedRows.value.length === props.data.length
})// 是否有操作列
const hasActions = computed(() => {return !!slots.actions // 检查是否有 actions 插槽
})// 处理全选
const handleSelectAll = (e: any) => {if (e.detail.value.length > 0) {selectedRows.value = [...props.data]} else {selectedRows.value = []}emit('select-all', selectedRows.value)
}// 处理选择行
const handleSelectRow = (row: TableRow, e: any) => {if (e.detail.value.length > 0) {selectedRows.value.push(row)} else {selectedRows.value = selectedRows.value.filter((r) => r !== row)}emit('select-row', selectedRows.value)
}// 加载更多
const loadMore = () => {emit('load-more')
}
</script><style scoped>
.table-container {width: 100%;
}.table {width: 100%;border-collapse: collapse;
}.table-header,
.table-row {display: flex;align-items: center;border-bottom: 1px solid #eee;
}.header-cell,
.body-cell {padding: 10px;text-align: left;
}.checkbox-cell {width: 50px;text-align: center;
}.actions-cell {display: flex;justify-content: flex-end;
}.selected {background-color: #f0f0f0;
}.load-more {text-align: center;padding: 10px;color: #007aff;cursor: pointer;
}
</style>-------------------父组件中使用-------------------------------<Table:columns="columns":data="tableData":canCheck="true":hasMore="hasMore"@select-all="handleSelectAll"@select-row="handleSelectRow"@load-more="handleLoadMore"><template #cell="{ row, column }"><!-- 自定义 age 列 --><template v-if="column.key === 'age'"><view @click="test" :style="{ color: '#f00' }">{{ row.age }}</view></template><!-- 默认渲染 --><template v-else>{{ row[column.key] }}</template></template><!-- 操作列插槽 --><template #actions="{ row, index }"><button type="primary" size="mini" @click="handleDelete(row, index)">删除</button></template></Table><script setup>// 表格列配置
const columns = ref([{ title: '姓名', key: 'name', width: '40px' },{title: '年龄',key: 'age',width: '40px',slot: 'age'},{ title: '地址', key: 'address' }
])// 表格数据
const tableData = ref([{ name: '张三', age: 25, address: '北京市' },{ name: '李四', age: 30, address: '上海市' },{ name: '王五', age: 28, address: '广州市' }
])</script>


http://www.ppmy.cn/news/1564103.html

相关文章

某国际大型超市电商销售数据分析和可视化

完整源码项目包获取→点击文章末尾名片&#xff01; 本作品将从人、货、场三个维度&#xff0c;即客户维度、产品维度、区域维度&#xff08;补充时间维度与其他维度&#xff09;对某国际大型超市的销售情况进行数据分析和可视化报告展示&#xff0c;从而为该超市在弄清用户消费…

SQL函数和约束

函数 字符串函数 函数功能CONCAT(S1, S2, …, Sn)字符串拼接&#xff0c;将 S1, S2, … Sn 拼接成一个字符串LOWER(str)将字符串 str 全部转换为小写UPPER(str)将字符串 str 全部转换为大写LPAD(str, n, pad)左填充&#xff0c;用字符串 pad 填充 str 的左边直到指定长度RPAD…

DNS介绍(2):DNS协议

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议是互联网的一项核心服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便地访问互联网。以下是对DNS协议的详细分析&#xff1a; 一、DNS协议的基本概念 DNS协…

Linux 历史指令快捷查询与指令

相比方向键上下翻找&#xff0c;history 命令可以显示之前执行过的命令列表&#xff0c;并且可以通过序号选择并重新执行某条命令。以下是具体的使用方法&#xff1a; 1. 查看历史命令 使用 history 命令查看之前执行过的命令列表&#xff1a; history示例输出&#xff1a; 1…

JTAG调试器的使用方法

概述: JTAG(联合测试行动组)是基于IEEE 1149.1标准的专用硬件接口。该接口旨在将复杂的芯片和设备连接到标准测试和调试硬件。目前JTAG主要用于: Output control of microcircuits; Testing of printed circuit boards; Flashing of microchips with memory; Chip softwa…

远程桌面使用是TCP还是UDP?

什么是TCP和UDP&#xff1f; “远程桌面是使用TCP还是UDP协议&#xff1f;我通常在Windows Server 2012 R2服务器上使用远程桌面协议&#xff08;RDP&#xff09;进行连接&#xff0c;最近有些好奇&#xff0c;RDP到底是通过UDP 3389端口还是TCP 3389端口来建立远程会话的&…

「实战应用」如何为DHTMLX JavaScript 甘特图添加进度线

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的所有需求&#xff0c;是最完善的甘特图图表库。 今天&#xff0c;您将学习如何使用进度线补充JavaScript 甘特图&#xff0c;以便于监控项目进度。 DHTMLX Gantt 最新试用版下载 …

基于springboot+vue+微信小程序的宠物领养系统

基于springbootvue微信小程序的宠物领养系统 一、介绍 本项目利用SpringBoot、Vue和微信小程序技术&#xff0c;构建了一个宠物领养系统。 本系统的设计分为两个层面&#xff0c;分别为管理层面与用户层面&#xff0c;也就是管理者与用户&#xff0c;管理权限与用户权限是不…