vue3 基于elementui el-table封装 hooks (未使用ts版本)

news2024/11/16 8:49:01

 elementui-table封装 hooks

js-hooks

import { ref, reactive, onMounted } from 'vue'
import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'
/**
 * @FileDescription: el-table 函数式组件hooks--实现一个表格的数据加载、分页、搜索、删除和导出等操作,
 * @function:useTable(config)
 * @param {object} config useTable(配置项)
 * @param {function} config.loadDataFunc 分页列表接口函数
 * @param {object} config.queryForm 表单配置
 * @param {function} config.deleteDataFunc 删除接口函数
 * @param {object} config.options 内部函数配置项(分页 | 接口配置)
 * @param {boolean} config.options.immediate 是否默认执行
 * @param {object} config.options.pageSizeConfig 分页字段配置
 * @param {string} config.options.pageSizeConfig.table_page 页数
 * @param {string} config.options.pageSizeConfig.table_size 页码
 * @param {string} config.options.pageSizeConfig.table_pageNum 默认页数
 * @param {string} config.options.pageSizeConfig.table_sizeNum 默认页码
 * @param {object} config.options.apiConfig 列表接口返回值配置
 * @param {string} config.options.apiConfig.dataProp 返回值字段名
 * @param {string} config.options.apiConfig.total 返回值总数字段名
 * @returns {array} 【tableData-- 表格值】;
 * @returns {array} 【multipleSelection -- 表格多选数组】;
 * @returns {boolean} 【lodding -- 列表接口加载状态】;
 * @returns {object} 【pagination -- 分页数据】;
 * @returns {number} 【total -- 分页总数】;
 * @returns {function} 【getData -- 分页接口调用函数】;
 * @returns {function} 【handleSearch -- 搜索函数】;
 * @returns {function} 【handleExport -- 导出-暂未测试】;
 * @returns {function} 【handleSelectionChange -- 多选触发函数】;
 * @returns {function} 【handleDelete -- 删除函数】;
 * @example
 const {
  tableData,
  loading,
  pagination,
  total,
  getData,
  handleSearch,
  handleExport,
  handleDelete,
  handleSelectionChange,
  multipleSelection
} = useTable({loadDataFunc:pageList, queryForm:queryParams, deleteDataFunc:{},options:{apiConfig:{
  dataProp:'rows',totalProp:'total'
},pageSizeConfig:{
 table_page:'page',
 table_sizeNum:20
}}})
 * @Date:2024:07:04 18:16:00
 * @LastEditTime:2024:07:08 23:47:00
 * @Author: Lanky
 * */
export function useTable(config) {
    const {loadDataFunc,queryForm,deleteDataFunc,options = {
        immediate:true
    }} = config
    const {
        pageSizeConfig={},
        apiConfig = {}
    } = options
    let {table_page = 'pageNum',table_pageNum = 1,table_size = 'pageSize',table_sizeNum=10} = pageSizeConfig
    let {dataProp='list',totalProp = 'total'} = apiConfig
    let loading = ref(true)
    let tableData = ref()
    let total = ref(0)
    const pagination = reactive({
        [table_page]: table_pageNum,
        [table_size]: table_sizeNum
    })
    /**
     * @deprecated: 列表接口函数
     * @function: getData()
     * */
    const getData = async () => {
        loading.value = true
        const res = await loadDataFunc({ ...queryForm, ...pagination })
        tableData.value = res.list || res[dataProp] || res.data && res.data[dataProp] || res.rows && res.rows[dataProp] || []
        total.value = res.total || res[totalProp] || 0
        loading.value = false
    }

    onMounted(() => {
        if (options?.immediate === undefined || options?.immediate === true) getData()
    })

    /**
     * @deprecated: 搜索函数
     * @function: handleSearch(val)
     * */
    const handleSearch = () => {
        table_page = 1
        getData()
    }

    /**
     * @deprecated: 分页函数
     * @function: handlePageChange(val)
     * @param {object} val 页码对象
     * @param {number} val.page 页数
     * @param {number} val.size 页码
     * */
    const handlePageChange = (val) => {
        const {page,size} = val
        table_page = page
        table_size = size
        getData()
    }

    let multipleSelection = ref([])
    /**
     * @deprecated: 表格多选框
     * @function: handleSelectionChange(val)
     * @param {object} val 复选框选中的值
     * */
    const handleSelectionChange = (val) => {
        multipleSelection.value = val
    }

    /**
     * @deprecated: 单个删除 | 批量删除
     * @function: handleDelete(config)
     * @param {object} config 配置对象
     * @param {string | array} config.id 删除的id 不传时默认为表格复选框批量删除
     * @param {string} config.y_delece_type 接口接收的参数类型为 'string' | 'array'
     * @example
     * handleDelete({y_delece_type: 'string'}) || handleDelete({id:row.id,y_delece_type:'string'})
     * */
    const handleDelete = ({id,y_delece_type = 'string',prop='id'}) => {
        let ids = [] || null
        let arr = multipleSelection.value.map(i => i[prop])
        console.log(id,'id')
        if (id !== undefined) {
            y_delece_type === 'string' ? ids = id : ids = [id]
        } else {
            y_delece_type === 'string' ? ids = arr.join(',') : ids = arr
        }
        if (!ids || ids.length === 0) {
            ElMessage.warning('请选择需要删除的数据!')
            return
        }
        ElMessageBox.confirm('确定删除?此操作不可恢复。', '提示', {
            type: 'warning'
        })
            .then(async () => {
                await deleteDataFunc(ids)

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

    /**
     * @deprecated: 导出函数 - 暂未测试或未实现先放着
     * @function: handleExport()
     * */
    const handleExport = () => {
        ElMessageBox.confirm('确定导出所选数据?', '提示')
            .then(() => {
                ElNotification({
                    title: '数据导出',
                    message: '正在为您导出数据,请稍后',
                    position: 'bottom-right'
                })
            })
            .catch((err) => { return err })
    }

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

 使用示例

script

template

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

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

相关文章

tesseract 图片识别引擎

什么是tesseract Tesseract是一款开源的光学字符识别(OCR)引擎,用于从图像中提取文本。它由Ray Smith在惠普实验室于1985年至1995年开发,并在2005年由惠普将其作为开源软件发布。之后,Tesseract的开发由Google主导&am…

如何理解低代码?怎么用好低代码

怎样理解低代码 理解一个概念最好的办法就是找相关概念进行类比,那么想要单独理解低代码这个概念是不太行的。我们还需要了解“零代码”以及“纯代码”开发的概念。那么什么是低代码?其与“零代码”和“纯代码”的关系又是如何? 零代码 也许…

IDEA资源文件中文乱码问题解决方法

目录 一、问题描述二、解决方法 一、问题描述 IDEA中打开资源文件出现乱码。 二、解决方法 进入“Settings” -> “Editor” -> “File Encodings”,按下图修改箭头所指的三个地方:

java类加载和双亲委派及加载恶意类代码应用

前面的CC1和CC6,都是在Runtime.exec执行命令。如果WAF过滤了Runtime就寄,而且用命令的方式写入shell进行下一步利用,在流量中一个数据包就能把你的行为全部看完,很容易被分析出来。 如果用恶意字节码加载的方式,我们的…

轮询系统的具体原理是什么

一般市面上的轮询系统,看似高深莫测,但都是大差不差的,没有太多的技术含量,都是通过你的订单情况,在数据库中找出一个可以收这个订单的支付方式,然后经过b站来实现与支付通道商交互。 这个过程看似复杂&am…

IP-GUARD文档云备份服务器迁移数据操作说明

一、功能简介 使用文档云备份过程可能出现需要迁移旧数据到新目录的情况(如一开始存储目录设置 不合理,之后变更存储目录),下面介绍迁移备份数据到新目录的方法,迁移后可正常查看、 下载、删除原备份文件。 二、同一计算机上迁移存储目录 当仅需要将存储目录迁移到同一计…

随机森林的可解释性分析(含python代码)

随机森林的可解释性分析 1.引言可解释性的重要性 2.随机森林的原理2.1 基本原理:2.2 随机森林的实现 3.随机森林的可解释性分析3.1 特征重要性3.2 特征重要性3.3 SHAP值3.4 部分依赖图(PDP)3.5 交互特征效应3.6 变量依赖图 4.结论5.参考文献 …

Android和iOS 测试五个最好的开源自动化工具

本文主要介绍Android和iOS 五个最好的开源自动化工具,这里整理了相关资料,希望能帮助测试软件的朋友,有需要的看下 自动化测试在产品测试上有着非常重要的作用。实现测试自动化有多种积极的方式,包括最大限度地减少测试执行时间&…

昇思25天学习打卡营第26天|munger85

ShuffleNet图像分类 和mobilenet一样,也是在资源有限的设备上进行神经网络来做ai图像分类的小模型,在保持精度的同时大大降低了模型的计算量。 是基本块 就是真正的网络,如果模型size是2,就是输出的时候多一些,精细一…

公司监控员工电脑都能监控到什么?公司电脑可以监控到哪些内容?

很多人反馈,公司监控电脑: 那到底为什么安装监控? 公司监控员工电脑又都能监控到什么? 下面小编跟你细细道来~ 第一部分:架空员工电脑监控的目的 在现代企业管理中,电脑监控已成为一种常见的做法。 企…

【LLM大模型】落地RAG系列:RAG入门及RAG面临的挑战和解决方案!!

2023 年以来,RAG 已成为基于大模型的人工智能系统中应用最为广泛的架构之一。因此对 RAG 应用的性能、检索效率、准确性的研究成为核心问题。 本文首先介绍什么是 RAG、为什需要 RAG、介绍 Naive RAG 工作流程及Naive RAG 存在的问题和挑战! 为什么需要 …

10:WiFi模块服务器模式

WiFi模块服务器模式 1、单片机通过WiFi模块向移动设备进行通信 我们通过AT指令ATCWMODE x,可以配置WiFi模块的工作模式。   ATCWMODE1为移动设备模式,这时WiFi模块可以连接其他路由器WiFi,然后可以给连接这个WiFi的其他移动设备发送数据&a…

JAVA静态代理和动态代理

前言: 静态代理: 静态代理是在编译时就已经确定了代理类的具体实现。代理类需要实现与目标类相同的接口,并且持有目标对象的引用。在代理类中实现对目标方法的增强或修改。静态代理的优点是实现简单,可以很好地控制目标对象的行为。缺点是每个目标对象都需要创建一…

从光速常数的可变性看宇宙大爆炸的本质

基于先前关于光速本质的讨论,让我们从函数图像看看宇宙大爆炸到底是什么。 先前已经讨论过,在量子尺度上,长度的实际对应物是频率的差异,因为只有频率差异才能在这个尺度上区分相邻时空的两点,而两点之间“差异的大小”…

再不怕数据丢失了!全量增量的迁移工具发布!

随着用户量的增加,我们收到了各种各样的需求反馈。 为了更好地拓展Chat2DB Pro 产品, 我们很高兴地宣布推出了插件市场功能, 同时重磅推出数据迁移工具DBMotion插件。 🚀 关于 DBMotion 插件 DBMotion插件,是一款基于沃趣科技的 DBMotion 数据迁移工具…

软件兼容性测试内容和步骤简析,湖南软件测评公司分享

软件兼容性测试是确保软件产品在不同的硬件环境、操作系统、浏览器和设备上正常运行的重要环节。随着科技的迅猛发展,各类软件应用层出不穷,用户对软件的多样性需求日益增加,软件的兼容性显得尤为重要。 软件兼容性测试内容包含多个方面&…

RocketMQ中的参数约束和建议

消息发送重试次数: 默认值:3次。(取值范围:无限制) 消息发送重试和流控机制 | RocketMQ 消息消费重试次数: 默认值:16次。

便携式挂椅美国认证标准ASTM F1235测试,CPC认证

亚马逊作为一家致力于保障消费者权益的电商平台,亚马逊对便携式挂椅这一儿童用品的安全性有着严格的要求。为了确保儿童在使用过程中的安全,要求所有便携式挂椅必须经过特定法规或标准的检测,并符合相应的要求。 便携式挂椅是一种无腿座椅&am…

Linux 安装 MySQL

Linux 安装 MySQL 1. 下载 官网:https://downloads.mysql.com/archives/community/ 选择自己对应版本下载即可 百度网盘下载: 链接:https://pan.baidu.com/s/1LDGptcllwO4n5yeln4rgPA?pwdszi9 提取码:szi9 上面截图是8.4.0…

Python爬虫知识体系-----Selenium

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新:https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、安装和基本使用二、元素定位三、访问元素信息四、自动化交互五、PhantomJS六、Chrome headless 一、安装和基本使用…