vue3封装Element表格

news2024/11/25 0:50:23

请添加图片描述

  1. 配置表头
  2. 配置多选
  3. 配置序号
  4. 自定义操作列按钮

封装表格 Table.vue

<template>
  <el-table
    :data="tableData"
    width="100%"
    :maxHeight="maxHeight"
    v-bind="$attrs"
    @selection-change="handleSelectChange"
    @row-click="handleRowClick"
  >
    <!-- 是否需要多选列表的情况 -->
    <el-table-column
      v-if="haveCheckBox"
      align="center"
      type="selection"
      fixed="left"
      :reserveSelection="reserveSelection"
    />
    <!-- 是否需要展示序号 -->
    <el-table-column
      v-if="haveIndex"
      label="序号"
      align="center"
      type="index"
      width="60px"
    />
    <el-table-column
      v-for="(column, index) in columns"
      :key="index"
      :align="column.align || 'left'"
      v-bind="column"
      min-width="100px"
    >
      <template #default="scope">
        <template v-if="column.operate && column.operate.length">
          <el-button
            v-for="operate in column.operate"
            :key="index"
            :icon="operate.icon"
            @click.stop="operate.click(scope.row)"
            :type="operate.type"
            >{{ operate.label }}
          </el-button>
        </template>
        <slot v-else :name="column.slotName" :row="scope.row">
          {{ scope.row[column.prop] }}
        </slot>
      </template>
    </el-table-column>
    <slot />
  </el-table>
</template>

<script lang="ts" setup>
const props = defineProps({
  tableData: {
    type: Array,
    default() {
      return [];
    },
  },
  haveCheckBox: {
    type: Boolean,
    default: false,
  },
  haveIndex: {
    type: Boolean,
    default: false,
  },
  columns: {
    type: Array,
    default() {
      return [];
    },
    required: true,
  },
  maxHeight: {
    type: [Number, String],
    default: "50vh",
  },
  reserveSelection: {
    type: Boolean,
    default: false,
  },
});
const emit = defineEmits(["select-change", "row-click"]);
// 勾选表格数改变触发的函数
const handleSelectChange = (val) => {
  emit("select-change", val);
};
// 表格行内点击
const handleRowClick = (row, column, event) => {
  emit("row-click", row, column, event);
};
</script>

调用组件示例

<template>
  <Table
    :tableData="tableData"
    :haveCheckBox="true"
    :haveIndex="true"
    :columns="tableColumn"
    :stripe="true"
    :border="true"
    @select-change="handleSelectChange"
    @row-click="handleRowClick"
  />
</template>
<script setup lang="ts">
import { ref, reactive } from "vue";
import { ElMessage } from "element-plus";

const tableData = ref([
  {
    date: "2016-05-03",
    name: "Tom",
    address: "No. 189, Grove St, Los Angeles",
    userid: "123456789",
    username: "admin",
    password: "123456",
    role: "管理员",
    status: "正常",
    createTime: "2023-03-01 12:00:00",
    updateTime: "2023-03-01 12:00:00",
    remark: "备注",
  },
  {
    date: "2016-05-02",
    name: "Tom",
    address: "No. 189, Grove St, Los Angeles",
    userid: "123456789",
    username: "admin",
    password: "123456",
    role: "管理员",
    status: "正常",
    createTime: "2023-03-01 12:00:00",
    updateTime: "2023-03-01 12:00:00",
    remark: "备注",
  },
  {
    date: "2016-05-04",
    name: "Tom",
    address: "No. 189, Grove St, Los Angeles",
    userid: "123456789",
    username: "admin",
    password: "123456",
    role: "管理员",
    status: "正常",
    createTime: "2023-03-01 12:00:00",
    updateTime: "2023-03-01 12:00:00",
    remark: "备注",
  },
  {
    date: "2016-05-01",
    name: "Tom",
    address: "No. 189, Grove St, Los Angeles",
    userid: "123456789",
    username: "admin",
    password: "123456",
    role: "管理员",
    status: "正常",
    createTime: "2023-03-01 12:00:00",
    updateTime: "2023-03-01 12:00:00",
    remark: "备注",
  },
]);

const tableColumn = reactive([
  {
    prop: "date",
    label: "日期",
    width: "180",
    align: "center",
  },
  {
    prop: "name",
    label: "姓名",
    width: "180",
    align: "center",
  },
  {
    prop: "address",
    label: "地址",
    width: "280",
    align: "left",
  },
  {
    prop: "userid",
    label: "用户ID",
    width: "180",
    align: "center",
  },
  {
    prop: "username",
    label: "用户名",
    width: "180",
    align: "center",
  },
  {
    prop: "password",
    label: "密码",
    width: "180",
    align: "center",
  },
  {
    prop: "role",
    label: "角色",
    width: "180",
    align: "center",
  },
  {
    prop: "status",
    label: "状态",
    width: "180",
    align: "center",
  },
  {
    prop: "createTime",
    label: "创建时间",
    width: "180",
    align: "center",
  },
  {
    prop: "updateTime",
    label: "更新时间",
    width: "180",
    align: "center",
  },
  {
    prop: "remark",
    label: "备注",
    width: "180",
    align: "center",
  },
  {
    prop: "operation",
    label: "操作",
    width: "280",
    align: "center",
    fixed: "right",
    operate: [
      {
        label: "编辑",
        icon: 'Edit',
        type: "primary",
        click: (row: any) => {
          ElMessage.success("点击了编辑" + row.name);
        }
      },
      {
        label: "删除",
        icon: 'Delete',
        type: "danger",
        click: (row: any) => {
          ElMessage.error("点击了删除" + row.name);
        }
      }
    ]
  },
]);

const handleSelectChange = (selection: any) => {
  ElMessage.success("选择了" + selection[0].name);
  console.log(selection);
};
const handleRowClick = (row, column, event) => {
  ElMessage.success("点击了" + row.name);
  console.log(row);
  console.log(column);
  console.log(event);
};
</script>
<style lang="scss" scoped></style>

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

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

相关文章

考研数学|听完一遍汤家凤基础,1800都没思路,怎么办?

看了我这篇回答&#xff0c;保证你可以顺利的做1800题&#xff01; 如果你听了汤家凤老师的课&#xff0c;但是做题没思路&#xff0c;请不要担心&#xff0c;也不要急着换老师&#xff0c;你很有可能是方法错了。 请你反思一下&#xff1a; 1、你是不是听完课立刻就去做题。…

linux系统基础命令

1、Linux中文件的权限包括哪些&#xff1f;某个文件的权限列为644代表该文件属主、属组和其它用户分别有什么权限&#xff1f; 1&#xff09;Linux中文件的权限包括哪些&#xff1f; 在Linux系统中&#xff0c;文件的权限包括读取&#xff08;r&#xff09;、写入&#xff08;w…

ARP类型

地址解析协议ARP即可实现将IP地址解析为MAC地址 动态ARP 动态ARP表项由ARP协议通过ARP报文自动生成和维护&#xff0c;可以被老化&#xff0c;可以被新的ARP报文更新&#xff0c;也可以被静态ARP表项覆盖。 动态ARP适用于拓扑结构复杂、通信实时性要求高的网络。 静态ARP …

C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测

C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测 目录 C刊级 | Matlab实现DBO-BiTCN-BiGRU-Attention蜣螂算法优化双向时间卷积双向门控循环单元融合注意力机制多变量回归预测效果一览基本介绍模型描述程序…

(React组件基础)前端八股文Day6

一 类组件与函数组件有什么异同 在React中&#xff0c;类组件和函数组件是创建组件的两种主要方式。随着React的发展&#xff0c;尤其是自Hooks在React 16.8中引入以来&#xff0c;函数组件的功能变得更加强大&#xff0c;使得它们能够更加方便地与类组件相竞争。下面是类组件…

雷卯有1.8V的ESD供您选择

一&#xff0e;雷卯有1.8V的ESD供您选择&#xff0c;如下是型号&#xff0c;体积小。 二. 为什么要用低压1.8V 做静电保护呢 省电&#xff0c;省电&#xff01; 1.8V的电压&#xff0c;内阻也小的话&#xff0c;那就是非常省电的电路。现在很多产品号称10年不用换电池。电池技…

基于Springboot旅游网站管理系统设计和实现

基于Springboot旅游网站管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…

内网渗透-(黄金票据和白银票据)详解(一)

目录 一、Kerberos协议 二、下面我们来具体分析Kerberos认证流程的每个步骤&#xff1a; 1、KRB_AS-REQ请求包分析 PA-ENC-TIMESTAMP PA_PAC_REQUEST 2、 KRB_AS_REP回复包分析&#xff1a; TGT认购权证 Logon Session Key ticket 3、然后继续来讲相关的TGS的认证过程…

在react项目用echarts绘制中国地图

文章目录 一、引入echarts二、下载地图json数据三、编写react组件四、组件使用 一、引入echarts 安装&#xff1a;npm i echarts --save 二、下载地图json数据 由于echarts内部不再支持地图数据&#xff0c;所以要绘制地图需要自己去下载数据。建议使用阿里云的。 地址&…

mysql 用户管理-权限管理

学习了用户管理&#xff0c;再学习下权限管理。 3&#xff0c;权限管理 权限管理主要是对登录到MySQL的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中&#xff0c;不合理的权限规划会给MySQL服务器带来安全隐患。数据库管理员要对所有用户的权限进行合理规…

14 - grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)

@[TOC](grace数据处理 - 泄露误差改正 - 空域滤波法(Mascon法)) 空域法的基本思想是假设地面某区域的质量变化是由一系列位置已知、质量未知的质量块(小范围区域)引起的,那么将GRACE反演的结果归算到n个质量块上的过程就是泄露信号恢复的过程。个人理解是这样的:假定已知研…

EfficientNetV2:谷歌又来了,最小的模型,最高的准确率,最快的训练速度 | ICML 2021

论文基于training-aware NAS和模型缩放得到EfficientNetV2系列&#xff0c;性能远优于目前的模型。另外&#xff0c;为了进一步提升训练速度&#xff0c;论文提出progressive learning训练方法&#xff0c;在训练过程中同时增加输入图片尺寸和正则化强度。从实验结果来看&#…

西南交大swjtu算法实验3.3|穷举法

1.实验目的 通过具体例子学习排列这种典型的穷举算法的求解过程以及程序框架&#xff0c;分析其算法的求解过程&#xff0c;以及如何设计穷举法解决实际问题。通过本实验&#xff0c;理解穷举法的特点以及实际应用中的局限性。 2.实验任务 有n (n>1&#xff09;个任务需要…

Java- maven下载jar包,提示找不到,Could not find artifact

1、执行下面命令行 mvn install:install-file -Dfile/home/quangang/桌面/isv-sdk-2.0.jar -DgroupIdcom.jd -DartifactIdisv-sdk -Dversion2.0 -Dpackangjar 2、然后这里要加上jar包

初识C++ · 入门(2)

目录 1 引用 1.1引用的概念 1.2 引用的特性 2 传值&#xff0c;传引用的效率 3 引用和指针的区别 4 内联函数 4.1 内联函数的定义 4. 2 内联函数的特性 5 关键字auto 5.1关于命名的思考 5.2 关于auto的发展 5.3 auto使用规则 6 范围for的使用 7 空指针 1 引用 …

leetcode刷题---链表

目录 1.删除链表的倒数第N个节点两两交换链表中的节点反转链表2 1.删除链表的倒数第N个节点 根据题目描述&#xff0c;第一个思路是存到数组中对数组进行操作&#xff0c;想到数组我们就可以想到下标和倒数第N个的关系&#xff0c;所以我们可以不额外开空间&#xff0c;可以直接…

阿里云2核4G5M云服务器ECS u1实例性能测评

阿里云服务器ECS u1实例&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘优惠价格199元一年&#xff0c;性能很不错&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;购买限制条件为企业客户专享&#xff0c;实名认证信息是企业用户即可&a…

Python问题列表

文章目录 1、使用pip安装的模块都存放到哪里了&#xff1f;2、安装fitz包报错&#xff0c;如何解决&#xff1f;3、python代码运行时&#xff0c;控制台输出乱码如何解决。4、vscode中第三方库不自动补齐 1、使用pip安装的模块都存放到哪里了&#xff1f; 答&#xff1a; pip是…

数据库安全(redis、couchdb、h2database)CVE复现

redis服务默认端口&#xff1a;6379&#xff1b;我们可以通过端口扫描来判断是否存在该服务。 Redis 是一套开源的使用ANSI C 编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库&#xff0c;并提供多种语言的API。 Redis 如果在没有开启认证的情况下&#xff0c;…

基于STM32的武警哨位联动报警系统设计,支持以太网和WIFI通信

1.功能 本文提出的武警报警信息系统终端&#xff0c;可实现报警和联动响应&#xff0c;支持以太网和WIFI两种通信模式&#xff0c;可实现移动哨位报警和固定哨位报警&#xff0c;语音和显示报警信息用户可自行定制。 本终端主要由STM32F103处理器模块和C8051F340处理器模块构…