一、创建通用型表格的需求

实现一个通用型表格组件,具备以下功能:

  1. 动态列配置。
  2. 分页功能。
  3. 排序功能。
  4. 可扩展的行操作功能。

二、设计通用型表格组件

首先,需要设计一个基础的表格组件,它接受列配置、数据和分页信息等参数。

1. 创建 useTable Hook

src/hooks 目录下创建 useTable.js 文件:

import { ref, reactive, onMounted, toRefs } from 'vue';

export function useTable(fetchData) {
const state = reactive({
loading: false,
data: [],
pagination: {
currentPage: 1,
pageSize: 10,
total: 0,
},
sort: {
field: '',
order: '',
},
}); const loadData = async () => {
state.loading = true;
const { currentPage, pageSize } = state.pagination;
const { field, order } = state.sort;
const result = await fetchData(currentPage, pageSize, field, order);
state.data = result.data;
state.pagination.total = result.total;
state.loading = false;
}; const changePage = (page) => {
state.pagination.currentPage = page;
loadData();
}; const changePageSize = (size) => {
state.pagination.pageSize = size;
loadData();
}; const changeSort = (field, order) => {
state.sort.field = field;
state.sort.order = order;
loadData();
}; onMounted(() => {
loadData();
}); return {
...toRefs(state),
loadData,
changePage,
changePageSize,
changeSort,
};
}

2. 创建 TableComponent.vue

src/components 目录下创建 TableComponent.vue 文件:

<template>
<div>
<table>
<thead>
<tr>
<th v-for="col in columns" :key="col.key" @click="changeSort(col.key)">
{{ col.title }}
<span v-if="sort.field === col.key">{{ sort.order === 'asc' ? '↑' : '↓' }}</span>
</th>
</tr>
</thead>
<tbody>
<tr v-for="row in data" :key="row.id">
<td v-for="col in columns" :key="col.key">{{ row[col.key] }}</td>
</tr>
</tbody>
</table>
<div class="pagination">
<button @click="changePage(pagination.currentPage - 1)" :disabled="pagination.currentPage === 1">Previous</button>
<span>{{ pagination.currentPage }} / {{ Math.ceil(pagination.total / pagination.pageSize) }}</span>
<button @click="changePage(pagination.currentPage + 1)" :disabled="pagination.currentPage === Math.ceil(pagination.total / pagination.pageSize)">Next</button>
</div>
</div>
</template> <script>
import { ref, onMounted } from 'vue';
import { useTable } from '@/hooks/useTable'; export default {
props: {
fetchData: {
type: Function,
required: true,
},
columns: {
type: Array,
required: true,
},
},
setup(props) {
const { data, loading, pagination, sort, loadData, changePage, changePageSize, changeSort } = useTable(props.fetchData); return {
data,
loading,
pagination,
sort,
loadData,
changePage,
changePageSize,
changeSort,
};
},
};
</script> <style scoped>
.pagination {
display: flex;
justify-content: center;
margin-top: 10px;
}
</style>

三、使用通用型表格组件

在实际项目中,可以这样使用这个通用型表格组件:

1. 创建 ExampleTable.vue 组件

src/views 目录下创建 ExampleTable.vue 文件:

<template>
<div>
<TableComponent :fetchData="fetchData" :columns="columns" />
</div>
</template> <script>
import TableComponent from '@/components/TableComponent.vue'; export default {
components: {
TableComponent,
},
setup() {
const columns = [
{ key: 'name', title: 'Name' },
{ key: 'age', title: 'Age' },
{ key: 'email', title: 'Email' },
]; const fetchData = async (page, pageSize, sortField, sortOrder) => {
// 模拟数据获取
const total = 100;
const data = Array.from({ length: pageSize }, (v, i) => ({
id: (page - 1) * pageSize + i + 1,
name: `Name ${(page - 1) * pageSize + i + 1}`,
age: 20 + ((page - 1) * pageSize + i + 1) % 30,
email: `user${(page - 1) * pageSize + i + 1}@example.com`,
}));
return { data, total };
}; return {
columns,
fetchData,
};
},
};
</script>

四、解释代码

  1. 定义 useTable Hook

    • 使用 Vue 的 refreactive 定义表格状态。
    • 定义 loadDatachangePagechangePageSizechangeSort 函数来处理数据加载和分页、排序变化。
    • 使用 onMounted 生命周期钩子在组件挂载时加载数据。
  2. 定义 TableComponent 组件

    • 接受 fetchDatacolumns 作为组件属性。
    • 使用 useTable Hook 获取表格数据和操作函数。
    • 渲染表格头部、主体和分页组件,并绑定相关事件。
  3. 使用通用型表格组件

    • ExampleTable.vue 中定义列配置和数据获取函数。
    • 使用 TableComponent 并传递 fetchDatacolumns 属性。

Vue Hook 封装通用型表格的更多相关文章

  1. element el-table表格的vue组件二次封装(附表格高度自适应)

    基于vue的el-table表格二次封装组件方法 前言 在公司实习使用vue+element-ui框架进行前端开发,使用表格el-table较为多,有些业务逻辑比较相似,有些地方使用的重复性高,如果多 ...

  2. 城市经纬度 json 理解SignalR Main(string[] args)之args传递的几种方式 串口编程之端口 多线程详细介绍 递归一个List<T>,可自己根据需要改造为通用型。 Sql 优化解决方案

    城市经纬度 json https://www.cnblogs.com/innershare/p/10723968.html 理解SignalR ASP .NET SignalR 是一个ASP .NET ...

  3. vuejs学习--递归组件(树型表格分享)

    前言 学习vue有一段时间了,最近使用vue做了一套后台管理系统,其中使用最多就是递归组件,也因为自己对官方文档的不熟悉使得自己踩了不少坑,今天写出来和大家一起分享. 递归组件 组件在它的模板内可以递 ...

  4. Android应用安全之Android APP通用型拒绝服务漏洞

    0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞.该通用型本地拒绝服务可以造成大面积的app拒绝服务. 针对序列化对象而出现的拒绝服务主要是由于应 ...

  5. 从AlphaGo谈通用型人工智能设计

    最近赢了人机大战的AlphaGo火了,火得一塌糊涂,圈里圈外,是人都在谈AlphaGo.但是AlphaGo毕竟是为特定场景特定应用设计的特定型人工智能,和通用型人工智能还是有很大差别,离人工智能普及更 ...

  6. Amazon RDS的通用型存储(SSD)

    在今年的6月份,我们曾介绍过为Amazon EC2实例提供的基于SSD的弹性块级存储. 在公布几个月过后,这样的被称为通用型存储(SSD)的新型选择方式在创建新的EBS卷中已经占到了90%,我们从客户 ...

  7. 通用型CRM还是行业型CRM?-定制为王

    大数据时代,怎样利用工具摆脱繁杂的数据管理之苦,洞察有价值的销售信息,是每一个管理者的迫切须要.Zoho  CRM问世10年来,见证了一个个行业客户怎样在CRM帮助下实现了效率和业绩提升.相同,广泛的 ...

  8. 泛型理解及应用(二):使用泛型编写通用型Dao层

    相信目前所有的IT公司网站在设计WEB项目的时候都含有持久层,同样地使用过Hibernate的程序员都应该看过或者了解过Hibernate根据数据库反向生成持久层代码的模板.对于Hibernate生成 ...

  9. Android APP通用型拒绝服务、漏洞分析报告

    点评:记得曾经有段时间很多SRC平台被刷了大量APP本地拒绝服务漏洞(目前腾讯金刚审计系统已经可检测此类漏洞),移动安全团队发现了一个安卓客户端的通用型拒绝服务漏洞,来看看他们的详细分析吧. 0xr0 ...

  10. C++内存管理变革(6):通用型垃圾回收器 - ScopeAlloc

    本文已经迁移到:http://cpp.winxgui.com/cn:a-general-gc-allocator-scopealloc C++内存管理变革(6):通用型垃圾回收器 - ScopeAll ...

随机推荐

  1. MySQL学习笔记-多表查询(上)

    多表查询(上) 一. 多表关系 在实际应用中,根据需求,设计的表结构之间存在联系,联系一般分为以下三种 一对多(多对一) 多对多 一对一 1. 一对多(多对一) 案例:部门与员工的关系,一个部门对应多 ...

  2. redux中集成immutable.js

    安装redux-immutable redux中利用combineReducers来合并reducer并初始化state,redux自带的combineReducers只支持state是原生js形式的 ...

  3. CF1815

    CF1815 Div. 1 确实难,Virtual Contest 上只完成了两道题,想出来了三道题. A. Ian and Array Sorting 秒切题--考虑将前 \(n - 1\) 个数变 ...

  4. 剑指Offer-52.正则表达式匹配(C++/Java)

    题目: 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  5. C#.NET CORE .NET8连接SQL SERVER 2008 R2 报:证书链是由不受信任的颁发机构颁发的

    一.C#.NET CORE .NET8连接SQL SERVER 2008 R2  报:证书链是由不受信任的颁发机构颁发的 报错内容: A connection was successfully est ...

  6. word文档生成视频,自动配音、背景音乐、自动字幕,另类创作工具

    简介 不同于别的视频创作工具,这个工具创作视频只需要在word文档中打字,插入图片即可.完事后就能获得一个带有配音.字幕.背景音乐.视频特效滤镜的优美作品. 这种不要门槛,没有技术难度的视频创作工具, ...

  7. unity持久化数据之XML和Excel

    unity持久化数据之XML public class XMLDataMananger: Singleton<XMLDataMananger> { protected XMLDataMan ...

  8. java datetime数据类型去掉时分秒

    在Java中,如果我们想要表示一个日期而不包括时间(时分秒),我们通常会使用java.time包中的LocalDate类.LocalDate是一个不可变的日期对象,它只包含年.月.日三个字段. 1. ...

  9. 详解Web应用安全系列(1)注入漏洞之SQL注入

    注入漏洞通常是指在可输入参数的地方,通过构造恶意代码,进而威胁应用安全和数据库安全.常见的注入漏洞包括:SQL注入和XSS跨站脚本攻击. 这篇文章我们主要讲SQL注入,SQL注入即是指web应用程序对 ...

  10. WPF/C#:数据绑定到方法

    在WPF Samples中有一个关于数据绑定到方法的Demo,该Demo结构如下: 运行效果如下所示: 来看看是如何实现的. 先来看下MainWindow.xaml中的内容: <Window.R ...