关于el-table的二次封装及使用,支持自定义列内容

news2024/11/27 22:22:43

关于el-table的二次封装及使用

table组件

<template>
  <el-table ref="tableComRef" :data="tableData" border style="width: 100%">
    <el-table-column v-if="tableHeaderList[0]?.type === 'selection'" type="selection"></el-table-column>
    <el-table-column label="序号" width="80" type="index" :index="indexMethod"></el-table-column>
    <el-table-column
      v-for="(item, index) in (tableHeaderList[0]?.type === 'selection' ? tableHeaderList.slice(1) : tableHeaderList)"
      :key="index"
      :index="indexMethod"
      :width="item.width"
      align="center"
      :prop="item.prop"
      :property="item.property"
      :type="item.type"
      :label="item.label"
      :show-overflow-tooltip="true"
    >
      <template #default="scope">
	      //  展示内容判断自定义渲染
        <div v-if="item.render" class="center" v-html="item.render(scope.row)"></div>
        //	默认渲染
        <div v-else class="center" v-html="scope.row[item.property]"></div>
      </template>

      <template v-if="item.custom" #default="scope">
	      // 使用自定义列
        <div v-if="item.isSlot">
          <slot name="mySlot" :data="scope.row"></slot>
        </div>
        
        //	每一行数据操作列内容都相同时使用下方代码
        <div v-else>
          <div class="operationAll center cursor-pointer">
            <div class="center flex-1 cursor-pointer">
              <div
                v-for="(customData, index) in item.customList1"
                :key="index"
                :class="customData.class"
                :title="customData.name"
                class="operation center flex-1"
                @click="clickHandle(customData.event, scope.row, scope.$index)"
              >
                <p :style="{ width: customData.width, height: customData.height }">
                  <img :src="customData.imgUrl" alt="" />
                </p>
                <p :style="{ color: customData.color }">
                  {{ customData.name }}
                </p>
              </div>
            </div>
          </div>
        </div>
      </template>
    </el-table-column>
  </el-table>
</template>

<script setup>
import { ref, getCurrentInstance, onMounted, nextTick, computed } from 'vue';
const ins = getCurrentInstance();
const bus = ins.appContext.config.globalProperties.$bus;
const props = defineProps({
  tableHeaderList: {
    type: Array,
    default: [],
  },
  tableData: {
    type: Array,
    default: [],
  },
  showTooltip: {
    type: Boolean,
    default: false,
  },
  pages: {
    type: Object,
    default: {
      pageSize: 10,
      currentPage: 1,
    },
  },
});

const page = computed(() => props.pages);


// 初始化tableindex
const indexMethod = (index) => {
  return page.value.pageSize * (page.value.currentPage - 1) + (index + 1);
};

父组件

<table-list
            :table-header-list="tableHeader"
            :data="softManageTableData"
            :show-tooltip="true"
            :pages="softManagePage"
            @selection-change="softManageSelect"
          >
            <template v-slot:mySlot="{ data }">
              <div class="end flex-1 cursor-pointer">
                <div
                  v-for="(item, index) in operationBtns"
                  :key="index"
                  :class="item.class"
                  :title="item.name"
                  class="operation center"
                  @click.stop="emitClick(item,data)"
                >
                //	公共项
                  <div v-if="item.isCommon" class="center mr-[10px]">
                    <p :style="{ color: item.color }">
                      {{ item.name }}
                    </p>
                  </div>
                  <div v-else>
	                  //	独有项
                    <div v-if="data.relSource === item.isLocalUnit" class="center">
                      <p :style="{ width: item.width, height: item.height }">
                        <img :src="item.imgUrl" alt="" />
                      </p>
                      <p :style="{ color: item.color }">
                        {{ item.name }}
                      </p>
                    </div>
                  </div>
                </div>
              </div>
            </template>
          </table-list>

script部分展示

// table header文字数据
const tableHeader = ref([
  {
    type: 'selection',
  },
  {
    type: '',
    width: '',
    property: 'name',
    label: '名称',
    hasIcon: true,
    //	自定义渲染
    render: (val) => {
      return `<div class="startX">
          <img src="${val.iconUrl}" alt="" class="w-[32px] h-[32px] softIcon">
          <p class="ml-[12px]">${ val.name }</p>
        </div>`
    }
  },
  {
    type: '',
    width: '100',
    property: 'type',
    label: '类型',
    isSoftType: true,
    render: (val) => {
      return val.type === 'B' ? 'B' : 'C';
    }
  },
  {
    type: '',
    width: '',
    property: 'clasName',
    label: '分类',
  },
  {
    type: '',
    width: '100',
    property: 'source',
    label: '来源',
    render: (val) => {
      return val.relSource === '1' ? '外部' : '自有';
    }
  },
  {
    type: '',
    width: '100',
    property: 'version',
    label: '版本',
  },
  {
    type: '',
    width: '',
    property: 'releaseTime',
    label: '发布时间',
  },
  {
    type: '',
    width: '100',
    property: 'person',
    label: '联系人',
  },
  {
    type: '',
    width: '',
    property: 'contact',
    label: '联系方式',
  },
  {
    type: '',
    width: '',
    property: 'status',
    label: '状态',
    render: (val) => {
      let status = '';
      switch (val.status) {
        case 'wait':
          status = '<div class="waitUp center logs"><p></p>1</div>'
          break;
      case 'enable':
          status = '<div class="enableUp center logs"><p></p>启用</div>'
          break;
      case 'disable':
          status = '<div class="disableUp center logs"><p></p>禁用</div>'
          break;
      
        default:
          break;
      }
      return status;
    }
  },
  {
    type: '',
    width: '350',
    property: '',
    label: '操作',
    custom: true,
    
    //		操作栏需要根据当前数据自定义展示
    isSlot: true,
		
		//	操作栏每一项都一致时可用这个
		customList1: [
      {
        name: '移除',
        type: 'primary',
        event: 'removeItem',
        class: 'removeItem',
        isShowName: false,
        width: '23px',
        height: '24px',
        imgUrl: new URL('/src/assets/removeIcon.png', import.meta.url).href,
      },
      {
        name: '编辑',
        type: 'primary',
        event: 'editItem',
        class: 'editItem',
        isShowName: false,
        width: '23px',
        height: '24px',
        imgUrl: new URL('/src/assets/softDetailEditIcon.png', import.meta.url).href,
      },
      {
        name: '详情',
        type: 'danger',
        event: 'detailItem',
        class: 'detailItem',
        isShowName: false,
        width: '23px',
        height: '26px',
        imgUrl: new URL('/src/assets/detailIcon.png', import.meta.url).href,
      },
    ],
  },
]);

// 操作栏自定义事件
const emitClick = (item,data) => {
  if(item.event && typeof item.event === 'function') {
	  // 这里将事件转发了一下,没有直接调用,直接调用会抛出无限递归的错误
    item.event(data,item);
  } else {
    ElMessage.error('点击事件定义有误');
  }
}

//	自定义操作栏
// 本单位操作按钮相关 显示为true 隐藏为false
const operationBtns = ref([
  {
    name: '启用',
    type: 'primary',
    event: openShareItem,
    class: 'openShareItem',
    isCommon: true,
    width: '23px',
    height: '24px',
    imgUrl: new URL('/src/assets/softDetailEditIcon.png', import.meta.url).href,
  },
  {
    name: '禁用',
    type: 'primary',
    event: openShareItem,
    class: 'closeShareItem',
    isCommon: true,
    width: '23px',
    height: '24px',
    imgUrl: new URL('/src/assets/softDetailEditIcon.png', import.meta.url).href,
  },
  {
    name: '编辑',
    type: 'primary',
    event: editItem,
    class: 'editItem',
    isLocalUnit: '2',
    isCommon: false,
    width: '23px',
    height: '24px',
    imgUrl: new URL('/src/assets/softDetailEditIcon.png', import.meta.url).href,
  },
  {
    name: '删除',
    type: 'primary',
    event: removeItem,
    class: 'removeItem',
    isLocalUnit: '2',
    isCommon: false,
    width: '23px',
    height: '24px',
    imgUrl: new URL('/src/assets/removeIcon.png', import.meta.url).href,
  },
  {
    name: '移除',
    type: 'danger',
    event: moveClearItem,
    class: 'moveClearItem',
    isLocalUnit: '1',
    isCommon: false,
    width: '23px',
    height: '26px',
    imgUrl: new URL('/src/assets/detailIcon.png', import.meta.url).href,
  },
  {
    name: '详情',
    type: 'danger',
    event: detailItem,
    class: 'detailItem',
    isLocalUnit: '2',
    isCommon: true,
    width: '23px',
    height: '26px',
    imgUrl: new URL('/src/assets/detailIcon.png', import.meta.url).href,
  },
])

效果图

在这里插入图片描述

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

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

相关文章

ubuntu20.04安装tensorRT流程梳理

目标&#xff1a;先跑demo&#xff0c;再学习源码 step1, 提前准备好CUDA环境 安装CUDA&#xff0c;cuDNN 注意&#xff0c;CUDA&#xff0c;cuDNN需要去官网下载.run和tar文件安装&#xff0c;否则在下面step4 make命令会报找不到cuda等的错误&#xff0c;具体安装教程网上…

jQuery_09 事件的绑定与使用(on)

jQuery使用on绑定事件 jQuery可以给dom对象添加事件 在程序执行期间动态的处理事件 1. $("选择器").事件名称(事件处理函数) $("选择器") &#xff1a; 选择0或者多个dom对象 给他们添加事件 事件名称&#xff1a;就是js中事件名称去掉on的部分 比如单击…

从0开始学习JavaScript--构建强大的JavaScript图片库

在现代Web开发中&#xff0c;图像是不可或缺的一部分&#xff0c;而构建一个强大的JavaScript图片库能够有效地管理、展示和操作图像&#xff0c;为用户提供更丰富的视觉体验。本文将深入探讨构建JavaScript图片库的实用技巧&#xff0c;并通过丰富的示例代码演示如何实现各种功…

100天精通Python(可视化篇)——第109天:Pyecharts绘制各种常用地图(参数说明+代码实战)

文章目录 专栏导读一、地图应用场景二、参数说明1. 导包2. add函数 三、地图绘制实战1. 省市地图2. 中国地图3. 中国地图&#xff08;带城市&#xff09;4. 中国地图&#xff08;分段型&#xff09;5. 中国地图&#xff08;连续型&#xff09;6. 世界地图7. 行程轨迹地图8. 人口…

PCIE链路训练-状态机描述3

Configuration.Idle 1.当使用8b/10b编码时&#xff0c;non-flit模式下&#xff0c;在所用配置的lane上发送s Idle data Symbols&#xff0c;在flit mode下发送IDLE flit。 2.linkup 0 link两端的component均支持64.0GT/s的速率&#xff0c;根据进入此状态之前发送的8个TS2或…

一文带你了解机器翻译的前世今生

引言 我们都知道谷歌翻译&#xff0c;这个网站可以像变魔术一样在100 种不同的人类语言之间进行翻译。它甚至可以在我们的手机和智能手表上使用&#xff1a; 谷歌翻译背后的技术被称为机器翻译。它的出现改变了世界交流方式。 事实证明&#xff0c;在过去几年中&#xff0c;深…

Linux socket编程(6):IO复用之select原理及例子

文章目录 1 五种I/O模型1.1 阻塞I/O模型1.2 非阻塞I/O模型1.3 I/O复用模型1.4 信号驱动I/O模型1.5 异步I/O模型 2 select函数3 select实战&#xff1a;实现多个套接字监听3.1 客户端3.2 服务端3.3 实验结果3.4 完整代码 在之前的网络编程中&#xff0c;我们遇到了一个问题&…

【nowcoder】BM3 链表中的节点每k个一组翻转

题目&#xff1a; 题目分析&#xff1a; 题目解析转载&#xff1a; 代码实现&#xff1a; package BMP3;import java.util.List;class ListNode {int val;ListNode next null;public ListNode(int val) {this.val val;} } public class BM3 {/*** 代码中的类名、方法名、参…

LINUX入门篇【9】----进程篇【1】----进程的初步认识和理解---进程的标识符以及对应的系统调用函数

前言&#xff1a; 从而本章开始&#xff0c;我们将进行进程的正式学习和讲解&#xff0c;进程是我们的程序驱动最重要的一环&#xff0c;可以说&#xff0c;进程几乎承载着一个程序在冯诺依曼体系和操作系统交互的全部&#xff0c;因此&#xff0c;学好进程是我们下一步系统化…

接口测试快速入门 以飞致云平台为例

飞致云电商API地址系统来自飞致云项目。接口API地址&#xff1a;https://gz.fit2cloud.com/swagger-ui.html 飞致云电商系统接口文档 V1.0&#xff1a;见 有道云笔记 该网站可以做接口测试练习。快速了解如何测试接口&#xff0c;如何做关联 系统基地址&#xff1a;https://g…

Flutter | 设置顶部状态栏的显示、隐藏、半透明灰色显示

【Flutter】设置顶部状态栏的显示、隐藏、半透明灰色显示 设置方法&#xff1a; // 这种模式不现实状态栏 SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); // 这种模式显示状态栏 SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge); // 修…

HarmonyOS开发者工具DevEco Studio-汉化

HarmonyOS DevEco Studio 简介 下载安装及汉化 打开开发者工具 安装语言包重启 然后设置页搜索“chinese”&#xff0c;选中中文语言包&#xff0c;点击后面的install&#xff1b; 或者 汉化按照IDEA的汉法风格&#xff0c;需要安装插件重启就可以汉化&#xff0c;步骤为&…

【JavaScript】alert的使用方法 | 超详细

alert作用效果 alert&#xff08;&#xff09;方法用于显示带有一条指定消息和一个确认的按钮的警告框。 alert使用方法 方法一&#xff1a;直接写在script标签内 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"&…

RT-DETR论文阅读笔记(包括YOLO版本训练和官方版本训练)

论文地址&#xff1a;RT-DETR论文地址 代码地址&#xff1a;RT-DETR官方下载地址 大家如果想看更详细训练、推理、部署、验证等教程可以看我的另一篇博客里面有更详细的介绍 内容回顾&#xff1a;详解RT-DETR网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署 目录 一…

2023/11/26总结

一些学习记录&#xff1a; 在对数据库进行一系列操作的时候&#xff0c;遇到一个问题&#xff0c;在插入数据的时候&#xff0c;我数据库对应的是自增id&#xff0c;但是插入后想获取到这个id去使用。我以为是不可以马上获取的&#xff0c;然后看到 项目进度 购物车&#xff…

【计算机网络笔记】多路访问控制(MAC)协议——轮转访问MAC协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

C++前缀和算法:统计美丽子字符串

题目 给你一个字符串 s 和一个正整数 k 。 用 vowels 和 consonants 分别表示字符串中元音字母和辅音字母的数量。 如果某个字符串满足以下条件&#xff0c;则称其为 美丽字符串 &#xff1a; vowels consonants&#xff0c;即元音字母和辅音字母的数量相等。 (vowels * cons…

光线追踪-Peter Shirley的RayTracingInOneWeekend系列教程(book1-book3)代码分章节整理

自己码完了一遍了&#xff0c;把代码分章节整理了一下&#xff0c;可以按章节独立编译&#xff0c;运行, 也可以直接下载编译好的release版本直接运行。 项目地址&#xff1a; Github: https://github.com/disini/RayTracingInOneWeekendChaptByChapt ​ ​ ​ ​

Rust语言入门教程(八) - 引用与借用

上一章的内容中我们讨论了Rust的所有权系统&#xff0c;当我们不想移动值的所有权时&#xff0c;我们可以使用引用和借用&#xff0c;而这正是本章想要讨论的问题。 引用&#xff08;References&#xff09; 引用允许你访问或修改数据而无需获取数据的所有权。在 Rust 中&…

Camtasia Studio2024专业的屏幕录制和视频剪辑软件

Camtasia2024专业的屏幕录制和视频剪辑软件3000多万专业人士在全球范围内使用Camtasia展示产品&#xff0c;教授课程&#xff0c;培训他人&#xff0c;以更快的速度和更吸引人的方式进行沟通和屏幕分享。使您在Windows和Mac上进行录屏和剪辑创作专业外观的视频变得更为简单。 …