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

关于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.mfbz.cn/a/191661.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下载网页内容成HTML文件

今天遇到了一个非常好用的、开源的网页下载插件: SingleFile&#xff0c;它可以将当前网页里的文字、图片、超链接等&#xff0c;合并成单一的.html文件&#xff0c;便于保存和浏览查看。下面介绍SingleFile的安装和使用。 1、下载SingleFile插件 SingleFile官网地址&#xff…

如何使用JMeter测试导入接口/导出接口

今天一上班&#xff0c;被开发问了一个问题&#xff1a;JMeter调试接口&#xff0c;文件导入接口怎么老是不通&#xff1f;还有导出文件接口&#xff0c;不知道文件导到哪里去了&#xff1f; 我一听&#xff0c;这不是JMeter做接口测试经常遇到的嘛&#xff0c;但是一时半会又…

STM32-SPI3控制MCP3201、MCP3202(Sigma-Delta-ADC芯片)

STM32-SPI3控制MCP3201、MCP3202&#xff08;Sigma-Delta-ADC芯片&#xff09; 原理图手册说明功能方框图引脚功能数字输出编码与实值的转换分辨率设置与LSB最小和最大输出代码&#xff08;注&#xff09; 正负符号寄存器位MSB数字输出编码数据转换的LSB值 将设备输出编码转换为…

Ps:使用钢笔工具绘制自由路径的技巧

只有熟练掌握使用钢笔工具绘制自由路径的技巧&#xff0c;才能快速完成复杂形状的创建以及精准抠图等工作。 钢笔工具是 Photoshop 中绘制路径的主要工具。无论是直线路径还是曲线路径&#xff0c;钢笔工具都能够提供高度的控制和精确度。 ◆ ◆ ◆ 绘制直线路径 绘制直线路径…

解决OSError: [Errno 28] No space left on device报错和搭建AIrtest无线配置手机集群

OSError: [Errno 28] No space left on device和搭建AIrtest无线配置手机集群 做手机无限集群控制时&#xff0c;常常遇到这种错误问题。表示您的设备上没有足够的可用磁盘空间来完成某个操作。我们遇到了还得重新开端口和输入ip&#xff0c;如果有几百台手机是不是中午就不吃…

我的创作纪念日-五周年

机缘 5年前&#xff0c;作为一名技术人员&#xff0c;平时利用CSDN作为学习平台工具&#xff0c;帮助解决工作中遇到的问题。随着30、35中年危机渐行渐近&#xff0c;回过头来发现平时虽然也有记录整理学习笔记的习惯&#xff0c;但还没有一个可以持续鞭笞自己和记录自己学习的…

网页设计作业-音乐网站首页

效果图 网盘链接 链接&#xff1a;https://pan.baidu.com/s/1CO4jAOY0zk1AWTx_pC3UmA?pwdfuck 提取码&#xff1a;fuck

原神「神铸赋形」活动祈愿现已开启

亲爱的旅行者&#xff0c;「神铸赋形」活动祈愿现已开启&#xff0c;「单手剑静水流涌之辉」「法器碧落之珑」概率UP&#xff01; 活动期间&#xff0c;旅行者可以在「神铸赋形」活动祈愿中获得更多武器与角色&#xff0c;提升队伍的战斗力&#xff01; 〓祈愿时间〓 4.2版本更…

C++通讯录管理系统

目录 系统需求 1、 创建项目 2、 菜单功能设计 3、 退出功能设计 4、 添加联系人功能设计 4.1 设计联系人结构体 4.2 设计通讯录结构体 4.3 在main函数中创建通讯录 4.4 封装添加联系人函数 4.5 添加联系人功能测试 5、 显示联系人功能设计 5.1 封装显示…

【开源】基于JAVA的高校学院网站

项目编号&#xff1a; S 020 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S020&#xff0c;文末获取源码。} 项目编号&#xff1a;S020&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学院院系模块2.2 竞赛报名模块2.3 教…

FilterChain攻击解析及利用

文章目录 BASE64解码和编码原理浅析EncodingDecoding Filterchain构造&#xff08;原理阐述&#xff09;回顾死亡代码特性一&#xff08;双重去杂&#xff09;特性二&#xff08;粘合性&#xff09; 任意字符构造工具一工具二 实战例题[NSSRound#7 Team]brokenFilterChain&…

jdk17安装全方位手把手安装教程 / 已有jdk8了,安装JDK17后如何配置环境变量 / 多个不同版本的JDK,如何配置环境变量?

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对博主首页也很感兴趣o (ˉ▽ˉ&#xff1b;) 学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程 目录 1、下载jdk17 2、安装jdk17 3、配置环境变量 -> 电脑无其他jdk 4、…

Elasticsearch集群部署,配置head监控插件

Elasticsearch是一个开源搜索引擎&#xff0c;基于Lucene搜索库构建&#xff0c;被广泛应用于全文搜索、地理位置搜索、日志处理、商业分析等领域。它采用分布式架构&#xff0c;可以处理大规模数据集和支持高并发访问。Elasticsearch提供了一个简单而强大的API&#xff0c;可以…

python基础练习题库实验4

文章目录 题目1代码实验结果 题目2代码实验结果 题目3代码实验结果 题目4代码实验结果 题目5代码实验结果 题目6代码实验结果 题目总结 题目1 编写一个程序&#xff0c;使用for循环语句和字符串格式显示以下精确输出。 例如&#xff1a; 代码 for i in range(1, 11):result…

基于xml配置的AOP

目录 xml方式AOP快速入门 xml方式AOP配置详解 xml方式AOP快速入门 xml方式配置AOP的步骤 导入AOP相关坐标 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.13</version></de…

代码随想录算法训练营 ---第四十五天

前言&#xff1a; 昨天的题做过之后&#xff0c;今天的题基本上都很简单&#xff0c;但是要注重一下细节。 第一题&#xff1a; 简介&#xff1a; 动态规划五部曲&#xff1a; 1.确定dp数组的含义 dp[i]&#xff1a;爬到有i个台阶的楼顶&#xff0c;有dp[i]种方法 2.确定dp…

王者荣耀java版

主要功能 键盘W,A,S,D键&#xff1a;控制玩家上下左右移动。按钮一&#xff1a;控制英雄发射一个矩形攻击红方小兵。按钮二&#xff1a;控制英雄发射魅惑技能&#xff0c;伤害小兵并让小兵停止移动。技能三&#xff1a;攻击多个敌人并让小兵停止移动。普攻&#xff1a;对小兵造…

模拟电子技术Ⅲ-场效应管的分析

场效应管的定义 场效应管是单极性管&#xff1a;参与导电的是多数载流子&#xff0c;要么是自由电子&#xff0c;要么是空穴&#xff0c; 场效应管有三个极&#xff1a;源极&#xff08;s&#xff09;、栅极&#xff08;g&#xff09;、漏极&#xff08;d&#xff09;&#xf…

【古诗生成AI实战】之二——项目架构设计

[1] 项目架构 在我们深入古诗生成AI项目的具体实践之前&#xff0c;让我们首先理解整个项目的架构。本项目的代码流程主要分为三个关键阶段&#xff1a; 1、数据处理阶段&#xff1b;   2、模型训练阶段&#xff1b;   3、文本生成阶段。 第一步&#xff1a;在数据处理阶段…

C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

分析&#xff1a; 在程序中&#xff0c;定义一个函数 fix&#xff0c;该函数使用指针变量来访问字符串中的每个字符&#xff0c;并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p&#xff0c;表示需要计算长度的字符串。 在主函数 main 中&#xff0c;定义一…
最新文章