从零开始Vue3+Element Plus后台管理系统(16)——组合式函数hook二次封装el-table

news2025/1/20 2:01:58

终于写到组合式函数了,它类似vue2的mixin,但优于mixin,用好了可以事半功倍。

在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。

官方文档:https://cn.vuejs.org/guide/reusability/composables.html

是时候写一个自己的组合式函数Demo了,决定从table下手 👋

table是后台管理系统最常用的组件,而且基本功能差不多,复用程度高,所以使用hook二次封装table是个相当实用的想法。

image.png

组合式函数抽取还是很容易的,一会功夫就搞了不少常用操作,包括:获取列表数据,搜索,分页,导出,删除,全选…,功能抽离之后,列表页的代码显得特别清爽。

<script setup lang="ts">
import { ref, reactive } from 'vue'
import { Search } from '@element-plus/icons-vue'
import { useTable } from '../table'

import clientApi from '~/api/client'

let moreVisible = ref(false)

const queryForm = reactive({
  address: '',
  name: '',
  keyword: '',
  province: '',
  status: '',
  mobile: ''
})

const {
  tableData,
  loading,
  pagination,
  total,
  getData,
  handleSearch,
  handleExport,
  handleDelete,
  handleSelectionChange
} = useTable(clientApi.getClientList, queryForm, clientApi.deleteClient)
</script>

table.ts

import { ref, reactive, onMounted, onUnmounted } from 'vue'
import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'

export function useTable(loadDataFunc: Function, queryForm: {}, deleteDataFunc: Function) {
  let loading = ref(true)
  let tableData = ref()
  let total = ref(0)

  const pagination = reactive({
    page: 1,
    pageSize: 20
  })

  const getData = async () => {
    loading.value = true
    const res = await loadDataFunc({ ...queryForm, ...pagination })
    tableData.value = res.list
    total.value = res.total
    loading.value = false
  }

  onMounted(() => {
    getData()
  })

  // 搜索
  const handleSearch = () => {
    pagination.page = 1
    getData()
  }

  // 切换页码
  const handlePageChange = (val: number) => {
    pagination.page = val
    getData()
  }

  let multipleSelection = ref([])
  const handleSelectionChange = (val: []) => {
    multipleSelection.value = val
    console.log(multipleSelection.value)
  }

  // 单个删除、批量删除
  const handleDelete = (id?: string) => {
    let ids: string[] | null = null
    if (id !== undefined) {
      ids = [id]
    } else {
      ids = multipleSelection.value
    }
    if (!ids || ids.length === 0) {
      ElMessage.warning('请选择需要删除的数据!')
      return
    }
    ElMessageBox.confirm('确定删除?此操作不可恢复。', '提示', {
      type: 'warning'
    })
      .then(async () => {
        await deleteDataFunc({ ids })

        ElMessage.success('删除成功')
        getData()
      })
      .catch(() => {})
  }

  // 导出表格数据
  const handleExport = () => {
    console.log('export')
    ElMessageBox.confirm('确定导出所选数据?', '提示')
      .then(() => {
        ElNotification({
          title: '数据导出',
          message: '正在为您导出数据,请稍后',
          position: 'bottom-right'
        })
      })
      .catch(() => {})
  }

  return {
    loading,
    tableData,
    total,
    pagination,
    getData,
    handleSearch,
    handleExport,
    handleSelectionChange,
    handlePageChange,
    handleDelete
  }
}

在列表页面中可以根据实际需要,取出useTable中所需要的数据和方法,我们只需要关注el-table本身的数据显示。当我们有大量列表页面时,它可以帮助我们摆脱很多重复劳动,提升效率,维护起来也很方便 👍

vueuse

https://vueuse.org/

既然提到组合式函数,建议进一步了解vueuse,不仅可以学习源码,还可以获得大量的工具方法,开发更轻松~

其实在之前的文章中,本项目已经两次用到了 VueUse(一个日益增长的 Vue 组合式函数集合),分别是:暗黑模式开关、使用快捷键组合,拿来主义确实好用。

项目地址

本项目GIT地址:github.com/lucidity99/…

如果有帮助,给个star ✨ 点个赞👍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-python_chan

Python的Channel模块&#xff1a;优化你的并发控制 Python是一门优秀的编程语言&#xff0c;在众多优秀的模块中&#xff0c;Channel模块是一个备受喜爱的模块。它是Python并发控制的建议之一&#xff0c;可以被用来在多个协程之间传递和传输消息。这个模块不仅仅是Python 3.5…

chatgpt赋能Python-python_cal

Python编程的神器——Cal 随着人工智能、机器学习等技术的发展&#xff0c;Python语言成为了最热门的编程语言之一。Python可以帮助程序员快速实现自己的想法&#xff0c;让程序的编写变得更加简单和容易。在Python中&#xff0c;有许多高效好用的工具和库&#xff0c;而其中最…

chatgpt赋能Python-python_chi2

Python中的Chi-Squared测试&#xff1a;一种用于统计分析的重要方法 数据分析是当今商业和科学中最重要的工具之一&#xff0c;它可以帮助人们了解他们的业务和科学领域。其中数据分析的技术以Python为代表的编程语言越来越受到欢迎&#xff0c;这些方法可以用于分类、回归、聚…

《数据可视化》课程期末项目_地理交通数据可视化

2022年上海疫情爆发期间交通数据可视化分析 《数据可视化》课程期末项目报告-选题&#xff1a;地理数据可视化 GitHub源码地址(如果有用点个 star 吧~谢谢&#xff01;) 文章目录 1.0 项目简介2.0 数据简介2.1 航线数据2.2 公交路线数据2.1 项目流程 3.0 数据处理3.1 航线数据…

【面试题】如何实现vue虚拟列表,纵享丝滑

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 最近在工作中遇到了一个列表的需求&#xff0c;因为做的是C端&#xff0c;所以对性能…

什么是接口测试?接口测试流程有哪些?我来告诉你

目录 首先&#xff0c;什么是接口呢&#xff1f; 一、常见接口&#xff1a; 二、前端和后端&#xff1a; 三、什么是接口测试&#xff1a; 四、接口组成 五、为什么要做接口测试&#xff1a; 六、接口测试怎么测&#xff1a; 七、用什么工具测 八. 接口测试持续集成 九…

chatgpt赋能Python-python_canbus

Python Canbus&#xff1a;如何使用Python编程语言控制Canbus&#xff1f; 介绍 Canbus被广泛地应用于现代汽车中&#xff0c;是一个用于通讯的协议&#xff0c;允许汽车的各个部分进行通信。为了控制Canbus&#xff0c;很多工程师都使用Python编程语言&#xff0c;因为它简单…

爬虫练习-12306自动购票升级版

文章目录 前言代码更新 前言 hello兄弟们&#xff0c;偷懒归来了。别问为啥这么久没更&#xff0c;问就是失踪了 最近一直在学习Django以及爬虫进阶之类的知识&#xff0c;加上快期末了&#xff0c;一直没有想起来自己还有一个账号没有更新&#xff0c;sorry啦 言归正传&…

SpringBoot - Jackson详解

写在前面 JSON 是目前主流的前后端数据传输方式。在 Spring Boot 项目中&#xff0c;只要添加了 WEB依赖&#xff08;spring-boot-starter-web&#xff09;&#xff0c;就可以很方便地实现 JSON 转换。WEB 依赖默认加入了 jackson-databind 作为 JSON 处理器&#xff0c;我们不…

算法小试炼(差不多相当于重新过一遍ACWING,为了夏令营做点准备)

1.最长不重复子串 这个题目的具体意思就不用我说了&#xff0c;我这里给出两种算法 1&#xff09;暴力搜索 只要机器够快&#xff0c;没有什么是暴搜解决不了的^ ^&#xff08;开玩笑 很简单&#xff0c;我们只需要遍历长度&#xff0c;跟左边界就好了&#xff0c;这个应该没…

测试必知必会的Mock数据方法

Mock数据的含义 那么Mock数据是什么意思呢 首先Mock这个英文单词有模拟的意思&#xff0c;模拟数据通俗的理解就是构造假数据&#xff0c;即Mock数据就是通过构造假数据来达到测试的目的&#xff0c;它广泛运用于功能测试、接口测试、单元测试 在功能测试中&#xff0c;可以…

离散数学 | 图论 | 欧拉图 | 哈密顿图 | 割点 | 桥(欧拉图和哈密顿图有没有割点和桥?)

本文主要解决以下几个问题&#xff1a; 1.欧拉图能不能有割点&#xff0c;能不能有桥&#xff1f; 2.哈密顿图能不能有割点&#xff0c;能不能有桥&#xff1f; 首先我们要明白几个定义 割点的定义就是在一个图G中&#xff0c;它本来是连通的&#xff0c;去掉一个点v以后这个…

【firewalld防火墙】

目录 一、firewalld概述二、firewalld 与 iptables 的区别1、firewalld 区域的概念 三、firewalld防火墙默认的9个区域四、Firewalld 网络区域1、区域介绍2、firewalld数据处理流程 五、firewalld防火墙的配置方法1、使用firewall-cmd 命令行工具。2、使用firewall-config 图形…

【计算机网络基础】章节测试4 网络层

R1与R2是一个自治系统中采用RIP路由协议的两个相邻路由器,R1的路由表如图(a)所示。如果R1收到R2发送的如图(b)所示的(V,D)报文,更新之后的R1的4个路由表项的距离从上到下依次为0、4、4、2,那么图 (b)中a、b、c、d 可能的数据一个是( C )。 A. 1、2、2、1 B. 2、2、3、1…

Java 核心技术 卷I 第2章 Java程序设计环境

第2章 Java程序设计环境 2.1 安装Java开发工具包 2.1.1 下载JDK www.oracle.com/technetwork/java/javase/downloads Java术语 2.1.2 设置JDK 下载JDK之后&#xff0c;需要安装这个开发包并明确要在哪里安装&#xff0c;后面还会需要这个信息. 指/opt/jdk1.8.0_31/bin或c…

从零开始Vue3+Element Plus后台管理系统(十四)——PDF预览和打印

其实我常常会纠结今天要写什么内容。 因为希望能够保持每日更新&#xff0c;所以要写的内容不能太难——最好是半天可以搞出demo并且输出文章&#xff0c;所以很多东西浅尝辄止&#xff0c;并没有深入研究&#xff0c;还写出了一些bug &#x1f41b; 今天又浅浅的研究了下在V…

这还只是阿里20K+测试岗面试题,看的我冷汗直流.....

朋友入职已经两周了&#xff0c;整体工作环境还是非常满意的&#xff01;所以这次特意抽空给我写出了这份面试题&#xff0c;而我把它分享给伙伴们&#xff0c;面试&入职的经验&#xff01; 大概是在3月中的时候他告诉我投递了阿里巴巴并且简历已通过&#xff0c;3月23经过…

python类型注释

目录 为什么需要类型注解 什么是类型注解 联合注解 使用注解时的注意点 为什么需要类型注解 看下图&#xff0c;很精炼&#xff1b; 什么是类型注解 Python类型注释是指在变量、函数参数、返回值等位置添加类型信息的一种语法&#xff0c;其目的是提高代码的可读性和可维护…

monkey测试方法及命令

1、查询测试包信息 # 查看已连接设备 adb devices # 带uuid查询包含test的第三方apk包 adb -s W21112003057 shell pm list package -3 | grep test # 清空logcat adb -s W21112003057 logcat -c # 启动app&#xff0c;通过日志查看安装包信息 adb -s W21112003057 logcat…

史上最全!全领域网络安全拓扑图(118页)

大家好&#xff0c;我是老杨。 前几天发了一篇OSPF的文章&#xff0c;助理发到群里和大家讨论。 好几个小友表示&#xff0c;绘制拓扑的才是最高境界&#xff0c;并且想看些拓扑图案例。 其实拓扑图案例老杨也分享过不少了。 可以看看这些往期文章&#xff0c;《超干货&…