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

devtools/2025/1/18 1:38:42/

 

功能介绍:

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/devtools/151423.html

相关文章

vue2配置跨域后请求的是本机

这个我来说明一下&#xff0c;因为我们公司的后端设置解决了跨域问题&#xff0c;所以我有很久没有看相关的内容了&#xff0c;然后昨天请求了需要跨域的接口&#xff0c;请求半天一直不对&#xff0c;浏览器显示的是本机地址&#xff0c;我以为是自己配置错了&#xff0c;后面…

HTTP 安全:HTTPS 原理与配置

一、引言 在当今数字化时代&#xff0c;网络安全至关重要。我们日常上网离不开 HTTP 协议&#xff0c;但它存在安全隐患。HTTP 以明文传输数据&#xff0c;信息易被窃取、篡改&#xff0c;身份也难以验证&#xff0c;像账号密码、交易信息等敏感内容在传输时毫无保障。 为解决…

Rust:指针 `*T` 和引用 `T`的区别

在 Rust 编程语言中&#xff0c;*T 和 &T 是两种不同类型的指针&#xff0c;它们各自代表了不同的内存访问方式和所有权模型。 *T&#xff08;原始指针或裸指针&#xff09;&#xff1a; *T 是一个原始指针&#xff08;也称为裸指针或裸引用&#xff09;&#xff0c;它可以…

从 Web3 到元宇宙:探索数字身份的奇幻演变

在数字时代的浪潮中&#xff0c;我们已经从传统的互联网走向了更为复杂和创新的Web3时代。随着技术的不断发展&#xff0c;数字身份作为这一变革的重要组成部分&#xff0c;正在经历一场前所未有的演变。这场变革不仅仅是技术的进步&#xff0c;更是对个人在虚拟世界中存在方式…

软件测试 —— Selenium(窗口)

软件测试 —— Selenium&#xff08;窗口&#xff09; 多个窗口打开情况current_window_handle、window_handles和switch_to.window示例代码注意事项 窗口大小的设置窗口最大化 maximize_window()窗口最小化 minimize_window()指定窗口全屏 fullscreen_window()手动设置窗口大小…

【Web系列三十】MYSQL库表比对升级

写在前面 随着软件的迭代开发&#xff0c;数据库表有变动是常有的事&#xff0c;如果没有在开发时记录变更情况的话。对于线上生产环境下的MYSQL库表升级就会比较麻烦。 因此本文主要提供了一个脚本&#xff0c;方便比对新旧数据库的sql文件&#xff0c;从而自动生成用户升级的…

计算机组成原理--笔记一

目录 一.计算机硬件的基本组成 1.早期冯诺依曼机的结构 2.现代计算机的结构 二.各个硬件的工作原理 1.主存储器 i. 读取数据 ii. 写入数据 1.1 基本组成 2.运算器 3.控制器 一.计算机硬件的基本组成 1.早期冯诺依曼机的结构 “存储程序”&#xff0c;将指令以二进制的形式输入…

【Matlab 六自由度机器人】机械臂轨迹规划方法总结

机械臂轨迹规划主要方法 前言1. 多项式插值类方法1.1 三次多项式插值数学表达式边界条件求解过程 1.2 五次多项式插值数学表达式边界条件求解过程 2. 基于速度轮廓的方法2.1 梯形速度规划梯形速度规划数学表达式加速段 t ∈ [ 0 , t 1 ] t \in [0,t_1] t∈[0,t1​]&#xff1a…