如何二次封装Element-Plus table组件

2023-11-11

最近做了一个后台的项目,需要用到大量的表格组件,我就试着把它给封装了一下,记录一下,那么现在开始了。
父页面代码:

<!-- 这里可以使用插槽 -->
<tableData ref="refTable" :config="table_config">
    <template #buts>
        <el-button type="primary" @click="addCost">添加车辆</el-button>
    </template>
    <template #operate="{ row }">
        <el-button link type="primary" size="small" @click="hDetail(row)">查看</el-button>
        <el-button link type="primary" size="small" @click="hDel(row.id)">删除</el-button>
    </template>
</tableData>
             
const table_config = ref({
  thead: [
    {
      label: '车牌号码', prop: "carNumber"
    },
    {
      label: '收费类型', prop: "chargeType",type: 'payment',
      callback: (row, prop) => {
        return charge_type[row[prop]]
      }
    },
    {
      label: '停车总时长', prop: "parkingTime"
    },
    {
      label: '缴纳费用(元)', prop: "actualCharge"
    },
    {
      label: '缴纳状态', prop: "paymentStatus", type: 'payment',
      callback: (row, prop) => {
        return payment_status[row[prop]]
      }
    },
    {
      label: '缴纳方式', prop: "paymentMethod", type: 'payment',
      callback: (row, prop) => {
        return payment_method[row[prop]]||'--'
      }
    },
    {
      label: '缴纳时间', prop: "paymentTime"
    },
  ],
  // 是否显示二级table
  dropDown: false,

  // 是否显示序号
  // num:false,

  // 多选
  select: false,
  url: '/parking/payment/list',
  params: {

  }
})

组件代码:

<template>
    <div class="editEnterprise">
        <!-- 添加或删除 -->
        <slot name="buts" :row="ids"></slot>
        <el-table :row-key="row => row.id" @selection-change="handleSelectionChange" :data="table_data" :border="false"
            style="width: 100%">
            <!-- 是否显示二级table -->
            <slot v-if="table_config.dropDown" name="expand" :row="{ row }">
                <!-- 插槽 -->
            </slot>
            <!-- 是否显示多选 -->
            <el-table-column reserve-selection v-if="table_config.select" type="selection" width="55" />
            <!-- 是否显示序号 -->
            <el-table-column v-if="true" label="序号" :index="1" type="index" width="70"></el-table-column>
            <!-- 状态项 -->
            <template v-for="item in table_config.thead" :key="item.prop">
                <el-table-column v-if="type.includes(item.type)" :label="item.label" :prop="item.prop">
                    <template #default="{ row }"><span>{{ item.callback && item.callback(row, item.prop)
                    }}</span></template>
                </el-table-column>
                <!-- 正常显示 -->
                <el-table-column v-else :label="item.label" :prop="item.prop" />
            </template>
            <!-- 操作列 -->
            <el-table-column v-if="table_config.isoperate" fixed="right" label="操作">
                <template v-slot="{ row }">
                    <slot name="operate" :row="row" />
                </template>
            </el-table-column>
        </el-table>
        <!-- 分页 -->
        <el-col :offset="14">
            <el-pagination v-model:current-page="table_config.page" v-model:page-size="table_config.pageSize"
                :page-sizes="[1, 2, 10, 20, 50, 100]" :small="small" :disabled="disabled" :background="background"
                layout="total,  prev, pager, next, sizes, jumper" :total="table_config.total"
                @size-change="handleSizeChange" @current-change="handleCurrentChange" /></el-col>
    </div>
</template>
<script setup>
name: 'tableData'
import { watch, ref, onMounted } from 'vue'
import { getTableData } from '@/api/common'
const type = ['card', 'building', 'payment', 'charging', 'duration', 'pole', 'working', 'handle', 'staff']
// 数据-------------------------------------------
const table_data = ref([])
const table_config = ref({
    thead: [],
    dropDown: true,
    num: true,
    select: true,
    isoperate: true,
    url: '',
    total: 0,
    page: 1,
    pageSize: 10,
    params: {}
})
const ids = ref([]);
// 传入配置
const props = defineProps({
    config: {
        type: Object,
        default: () => { }
    },
})
// 方法--------------------------------------------

// 当前页数改变
const handleCurrentChange = (val) => {
    table_config.value.page = val
    loadData()
    // console.log(val);
}
// 每页显示个数改变
const handleSizeChange = (pageSizes) => {
    table_config.value.pageSize = pageSizes
    table_config.value.page = 1
    loadData()
    // console.log(pageSizes);
}
// 表格多选获取选中的数据
const handleSelectionChange = (selection) => {
    ids.value = selection.map(row => row.id).join(',');
    console.log(ids.value);
};
// 初始化数据
const initConfig = () => {
    for (let key in props.config) {
        if (Object.keys(table_config.value).includes(key)) {
            table_config.value[key] = props.config[key]
        }
    }
    console.log('有数据了', table_config.value.params);
    // 配置项配置完成后读取数据
    loadData()
}
const loadData = () => {
    let requestData = {
        url: table_config.value.url,
        data: {
            page: table_config.value.page,
            pageSize: table_config.value.pageSize,
            total: table_config.value.total,
            ...table_config.value.params
        }
    }
    getTableData(requestData).then(({ data }) => {
        console.log(data)
        if (data) { table_data.value = data.rows, table_config.value.total = data.total }
    })
}

defineExpose({ initConfig })
// onMounted(() => { })
// 监听器
watch(props.config, () => {
    initConfig()
}, { immediate: true, deep: true })

</script>

<style lang="scss" scoped>
.editEnterprise {
    margin: 15px 0px;
}

// button样式
.editEnterprise {
    margin: 15px 0;
}

// 分页样式穿透
:deep(.el-pagination) {
    padding: 10px 0;
}
</style>

效果:这里分页也在组件处理了,所以也无需自己在弄分页了
image.png
这里取了个巧,因为后台接口要传的必传参几乎一样而且都是GET请求,我就把请求也直接页封装在组件里了,只需要传一个请求地址就可以正常渲染,项目的批量删除也在组件内部处理了,且表单数据也可以直接传入到组件的params属性,这样查询时也可以动态更新数据,封装的不是那么的全面,欢迎各位路过的大佬们给出指点和建议,互相学习进步!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何二次封装Element-Plus table组件 的相关文章

  • 关闭选项卡时要求确认[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我在某些浏览器上关闭页面时 我希望出现一个消息框 并询问我是否真的要关闭页面 有两个按钮 如果我单击No那么这个标签就不会被关闭 我怎样
  • React js Stripe 结账不起作用

    我正在尝试在 React js 应用程序中呈现条带结账默认表单
  • 使用 useReducers 调度函数发送多个操作?

    使用时是否可以通过调度函数发送多个动作useReducer挂钩反应 我尝试向它传递一组操作 但这会引发未处理的运行时异常 明确地说 通常会有一个初始状态对象和一个减速器 如下所示 const initialState message1 nu
  • 使用模数按字母顺序对列表进行排序

    我在获取元素列表并按字母顺序对它们进行排序方面没有任何问题 但我很难理解如何使用模数来做到这一点 更新 这是按我的方式工作的代码 但是 我更喜欢下面提供的答案的可重用性 因此接受了该答案
  • 使用 JavaScript 使链接保持活动状态并在单击时显示悬停效果

    I am struggling to make this work I d like to make it where if O F is clicked the hover state stays active if another li
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • 如何将 Google Charts 与 Vue.js 库一起使用?

    我正在尝试使用 Vue js 库使用 Google Charts 制作图表 但我不知道如何添加到 div 这是我尝试做的 这是如何使用普通 javascript 添加图表 这是文档的代码示例 https developers google
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • Angular 2+ 安全性;保护服务器上的延迟加载模块

    我有一个 Angular 2 应用程序 用户可以在其中输入个人数据 该数据在应用程序的另一部分进行分析 该部分仅适用于具有特定权限的人员 问题是我们不想让未经授权的人知道how我们正在分析这些数据 因此 如果他们能够在应用程序中查看模板 那
  • 有没有办法阻止 prettier / prettier-now 将函数参数分解为新行

    当使用 prettier prettier now 在保存时进行格式化时 当一个函数包装另一个函数时 它会中断到一个新行 我想知道是否有办法阻止这种行为 例如 期望的输出 app get campgrounds id catchAsync
  • Javascript 纪元时间(以天为单位)

    我需要以天为单位的纪元时间 迄今为止 我已经看到过有关如何翻译它的帖子 但几天后就没有了 我对纪元时间很不好 我怎么能得到这个 我需要以天为单位的纪元时间 我将解释为您想要自纪元以来的天数 纪元本身是第 0 天 或第 1 天的开始 无论您如
  • 如何更改此 jquery 插件的时区/时间戳?

    我正在使用这个名为 timeago 的插件 在这里找到 timeago yarp com 它工作得很好 只是它在似乎不同的时区运行 我住在美国东部 费城时区 当我将准确的 EST 时间放入 timeago 插件时 比如 2011 05 28
  • 简单的 Vue.js 计算属性说明

    我对 Vue js 并不陌生 但我会再次浏览文档 试图找出我第一次错过的任何内容 我在以下地方看到了这个声明使用计算属性的基本示例部分 https v2 vuejs org v2 guide computed html Basic Exam
  • 导致回发到与弹出窗口不同的页面

    我有一个主页和一个详细信息页面 详细信息页面是从主页调用的 JavaScript 弹出窗口 当单击详细信息页面上的 保存 按钮时 我希望主页 刷新 是否有一种方法可以调用主页的回发 同时还可以从详细信息页面维护保存回发 Edit 使用win
  • 如何从图像输入中获取 xy 坐标?

    我有一个输入设置为图像类型

随机推荐

  • [语义分割]基于VGG网络搭建FCN-8s并在VOC2012数据集上训练

    文章目录 1 数据集选取 1 1数据集简介 1 2 数据预处理 1 2 1踩坑记录1 1 2 2 读取图片路径 1 2 3 自定义图像增强与预处理模块 1 3自定义数据集类 1 3 1数据标签可视化 2 搭建FCN 8s网络 2 1基础FC
  • uni-app组件传值

    目录 一 父组件给子组件传值 父组件 elementFather vue 子组件 element vue 效果图 二 子组件给父组件传值 子组件 element vue 父组件 elementFather vue 效果图 三 兄弟组件之间传
  • 用jupyter读取mysql中的数据的两种方式

    不管是采用哪种方式都应该先保证创建了目标数据库 即在mysql data文件夹下有以目标数据库名称命名的子文件夹 且子表应该为以下格式 而不是 sql 未执行命令 文件 首选方法二 因为仅SQLAlchemy可连接支持read sql ta
  • img src 使用base64格式 上传、根据文件名显示所有图片 java代码

    最近在做ca签名 key验证通过后传图片为base64格式图片 保存至自己服务器 大概操作 首先获取的src data image png base64 sealBase64 获取到的参数 function qr var base64 im
  • 配置uni-app的开发环境

    点击下载安装Hbuilderx 点击下载微信开发者工具 安装完成后下载导入一些插件依赖 这里用scss举例 https ext dcloud net cn plugin name compile node sass 新建项目 目录结构如下
  • C++ OSD水印叠加

    视频相关领域 监控 LED大屏 很多场合可能会涉及到在一幅画面上进行文字或时间的叠加 常规做法都是在后端实现 即先渲染图像 然后叠加OSD文字信息 这种方法简单且高效 但是有些场合必须要求在前端进行叠加 比如监控领域中视频名称信息 时间信息
  • WMware创建linux虚拟机并配置网络及防火墙

    1 打开VMware并创建虚拟机 基本一直下一步就行了 这里不多做说明了 名称随便取 最好就是master 位置放在自己预定的地方 这些配置参数随便设 差不多就行 创建到此为止 接下来安装linux系统 上下键选择 回车键确定 为了表现专业
  • ERP服务器端安装及配置

    概述 在配置ERP端是 普实系统集成工具同MES端配置时使用的程序类似 不硬性规定在哪台服务器上安装 只要能够连上ERP服务器即可 安装过程类似于系统集成工具 安装完成后 在开始中的菜单文件夹为Pushsoft Intergration 操
  • 锤子剪刀布游戏

    问题描述 大家应该都会玩 锤子剪刀布 的游戏 两人同时给出手势 胜负规则如图所示 现给出两人的交锋记录 请统计双方的胜 平 负次数 并且给出双方分别出什么手势的胜算最大 输入 输入第1行给出正整数N lt 105 即双方交锋的次数 随后N行
  • RC4文件加密的Python实现方法

    RC4 Rivest Cipher 4 是一种流密码 stream cipher 算法 广泛应用于网络通信和数据加密中 本文将介绍如何使用Python实现RC4文件加密算法 RC4算法的核心是使用一个伪随机数生成器 PRNG 生成密钥流 然
  • 端口显示被占用,如何关闭端口

    用管理员权限打开命令提示符 如果要关闭3306端口 首先要查询此端口号对应的PID 则输入以下命令 1 输入 netstat ano findstr 3306 然后借助命令终止PID对应的进程 输入以下命令 2 输入 taskkill PI
  • 【C++简明教程】Python和C++指定元素排序比较

    Python 中的排序 在 Python 中 常用的排序就是 sorted 对于列表这种数据结构来说 还有 sort 方法 列表的排序 使用 sort 方法进行排序 以第二个值进行升序排序 列表的 sort 方法是原地排序 另外一种排序方法
  • CMake的使用--以ORCA避碰C++库为例

    1 安装cmake 链接 Download CMake 版本需下载Binary distributions这个模块下的 Windows x64 Installer cmake 3 27 1 windows x86 64 msi 注意事项 1
  • CentOS6.5 安装 抓包工具tcpdump

    1 裸机没装GCC 离线安装 首先到http vault centos org 6 5 os x86 64 Packages 下载用到的rpm包 包括 ppl 0 10 2 11 el6 x86 64 rpm cloog ppl 0 15
  • LabVIEW自带函数Database Toolkit实现SQL Server操作(上)

    目录 一 函数位置 二 函数一览 三 主要介绍 1 DB Tool Open Connection vi 2 DBTool Close Connection vi 3 Database Variant To Data vi 4 DBTool
  • 浅析Redux 的 store enhancer

    相信大家都知道Redux的middleware 中间件 的概念 Redux通过middleware可以完成发送异步action 网络请求 打印action的日志等功能 相对而言 Redux的store enhancer的概念 很多人并不是很
  • 【MLOps】第 5 章 : 生产准备

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 副本与ISR设计--Kafka从入门到精通(十四)

    上篇文章说了 broker的消息设计 采用紧凑的byteBuffer 存储设计主要包含attribute后三个表示压缩类型 还有crc效验 以及key和value 后面新增了时间戳 Broker消息设计 Kafka从入门到精通 十三 htt
  • js实现数学的排列组合

    js实现数学的排列组合 实现 组合 param arr 待选数组 param size 从数组里面要抽几个元素进行组合 function combination arr size 1 45 3 9 4 14 1 const r param
  • 如何二次封装Element-Plus table组件

    最近做了一个后台的项目 需要用到大量的表格组件 我就试着把它给封装了一下 记录一下 那么现在开始了 父页面代码