封装el-table 基于element封装可配置JSON表格组件

news2024/11/17 21:41:56

基于element封装可配置JSON表格组件
话不多说直接贴代码,复制运行即可查看效果
在这里插入图片描述
子组件全部代码

<template>
  <div class="custom-table">
    <el-table
      :data="tableData"
      border
      style="width: 100%"
      size="mini"
      max-height="800"
      v-bind="$attrs"
      v-on="$listeners"
      highlight-current-row
    >
      <template v-for="item in config.column">
        <!-- 操作 -->
        <template v-if="item.type === 'handler'">
          <el-table-column
            :key="item.prop"
            v-bind="item"
            align="center"
            fixed="right"
          >
            <template slot-scope="{ row }">
              <el-button
                v-for="btn in item.btns"
                :key="btn.label"
                type="text"
                @click="handelClick($event, btn.click, row)"
                :icon="btn.icon"
              >
                <!-- {{ btn.label }} -->
              </el-button>
            </template>
          </el-table-column>
        </template>
        <!-- 自定义slot -->
        <template v-else-if="item.type === 'custom'">
          <el-table-column :key="item.prop" v-bind="item" align="center">
            <template slot-scope="scope">
              <slot :name="item.slotName" v-bind="scope" :prop="item.prop" />
            </template>
          </el-table-column>
        </template>
        <!-- 默认 -->
        <template v-else>
          <el-table-column
            :key="item.prop"
            v-bind="item"
            align="center"
            :show-overflow-tooltip="true"
          />
        </template>
      </template>
    </el-table>
    <!-- 分页 -->
    <el-pagination
      v-if="config.usePagination"
      background
      small
      layout="prev, pager, next"
      style="text-align: center; margin-top: 10px"
      :current-page="config.paginationData.currentPage"
      :page-size="config.paginationData.pageSize"
      :total="config.paginationData.total"
      @current-change="handleCurrentChange"
    >
    </el-pagination>
  </div>
</template>

<script>
export default {
  props: {
    config: {
      type: Object,
      default() {
        return {
          column: [],
          paginationData: {
            pageSize: 20,
            currentPage: 1,
            total: 0,
          },
        };
      },
      required: true,
    },
    tableData: {
      type: Array,
      default() {
        return [];
      },
    },
  },
  mounted() {
    console.log(this.config, "config");
  },
  methods: {
    handelClick(e, click, row) {
      e.stopPropagation();
      this.$emit(click, row);
    },
    handleCurrentChange(val) {
      this.$emit("currentChange", val);
    },
  },
};
</script>

<style lang="scss" scoped></style>

父组件使用

<template>
  <div>
    <el-button @click="getData">data</el-button>
    <CustomTable
      size="mini"
      v-loading="loading"
      :config="tableConfig"
      :table-data="tableData"
      @row-click="handleRowClick"
      @selection-change="selectionChange"
      @handelEditClick="handelEditClick"
      @handelTeamEditClick="handelTeamEditClick"
      @deleteItemClick="deleteItemClick"
      @currentChange="handleCurrentChange"
    >
      <template #inputEdit="{ row }">
        <el-input
          v-model="row.inputValue"
          placeholder="please input"
          size="small"
        ></el-input>
      </template>
      <template #artcleName="{ row }">
        <el-tag v-for="item in row.artcleName" :key="item.id" size="small">
          {{ item.name }}
        </el-tag>
      </template>
    </CustomTable>
  </div>
</template>

<script>
import tableConfig from "./config";
import CustomTable from "@/components/CustomTable/index.vue";

export default {
  components: {
    CustomTable,
  },
  data() {
    return {
      loading: false,
      tableConfig,
      tableData: [
        {
          id: 1,
          text: "test",
          title: "test",
          admin: "guanliyuan ",
          category: "小白",
          inputValue: "Context",
          artcleName: [
            { id: 1, name: "Context" },
            { id: 2, name: "标签" },
          ],
        },
      ],
    };
  },
  created() {
    this.tableData = this.generateRandomData(50);
    this.tableConfig.paginationData.total = this.tableData.length;
  },
  methods: {
    getData() {
      console.log(this.tableData, "表格数据");
    },
    generateRandomData(count) {
      const categories = ["小白", "中级", "高级", "专家", "初学者"];
      const admins = ["guanliyuan", "administrator", "admin", "user", "tester"];
      const texts = ["test", "example", "sample", "demo", "testcase"];
      const titles = [
        "Test Title",
        "Example Title",
        "Sample Title",
        "Demo Title",
        "Testcase Title",
      ];

      const randomElement = (arr) =>
        arr[Math.floor(Math.random() * arr.length)];
      const randomString = (length) =>
        Math.random()
          .toString(36)
          .substring(2, length + 2);

      return Array.from({ length: count }, (_, index) => ({
        id: index + 1,
        text: randomElement(texts),
        title: randomElement(titles),
        admin: randomElement(admins),
        category: randomElement(categories),
        inputValue: randomString(8),
        artcleName: Array.from({ length: 2 }, (_, nameIndex) => ({
          id: nameIndex + 1,
          name: randomString(5),
        })),
      }));
    },
    handleRowClick(val) {
      console.log(val, "点击行");
    },
    selectionChange(val) {
      console.log(val, "勾选");
    },
    handelEditClick(row) {
      console.log(row, "编辑");
    },
    handelTeamEditClick(row) {
      console.log(row, "团队编辑");
    },
    deleteItemClick(row) {
      console.log(row, "删除");
    },
    handleCurrentChange(val) {
      this.tableConfig.paginationData.currentPage = val;
      console.log(val, "当前页");
    },
  },
};
</script>

可配置文件 js
放置同级位置
在这里插入图片描述

const tableConfig = {
  //type 区分操作类型  normal:普通  handler:操作  custom:自定义插槽
  column: [
    { type: "selection", width: 60, align: "center" },
    {
      type: "normal",
      prop: "text",
      label: "KeyWords",
      width: 200,
    },
    { type: "normal", prop: "title", label: "Title" },
    {
      type: "normal",
      prop: "category",
      label: "Category",
      width: 150,
    },
    {
      type: "normal",
      prop: "admin",
      label: "Admin",
      width: 200,
    },
    {
      type: "handler",
      label: "Controls",
      width: 150,
      btns: [
        {
          label: "Edit",
          click: "handelEditClick",
          icon: "el-icon-edit",
        },
        {
          label: "TeamEdit",
          click: "handelTeamEditClick",
          icon: "el-icon-s-open",
        },
        {
          label: "Delete",
          click: "deleteItemClick",
          icon: "el-icon-delete",
        },
      ],
    },
    {
      type: "custom",
      label: "Input",
      prop: "inputValue",
      slotName: "inputEdit",
    },
    {
      type: "custom",
      label: "artcleName",
      prop: "artcleName",
      slotName: "artcleName",
    },
  ],
  usePagination: true,
  paginationData: {
    pageSize: 20,
    currentPage: 1,
    total: 0,
  },
};

export default tableConfig;

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

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

相关文章

[AI绘画] 简明原生 ComfyUI 三重超细节放大教程(附工作流)

本教程将从0构建 ComfyUI 三重细节填充放大工作流&#xff0c;人有多大胆&#xff0c;图有多大产 **&#xff08;建议横屏&#xff09;**鬼灭之刃 堕姬 & 甘露寺蜜璃 三重细节填充放大 16K(154888832) 「四种放大」 ”潜空间“和”像素空间”&#xff0c;图像放大可…

精通C++ STL(三):vector的介绍及使用

目录 vector的介绍 vector的使用 vector的定义方式 vector的空间增长问题 size和capacity reserve和resize empty vector的迭代器使用 begin和end rbegin和rend vector的增删查改 push_back和pop_back insert和erase swap 元素访问 vector迭代器失效问题 迭代器失效问题举例 …

vue3+Vite实现滑动拼图验证

参考文档&#xff1a;https://github.com/javaLuo/vue-puzzle-vcode/blob/master/README3.md 最近想学习一下这个前端滑动拼图的实现&#xff0c;就找了一个第三方库&#xff0c;该库支持vue2和vue3两个版本&#xff0c;直接看文档就能上手&#xff0c;我自己跑了一边倒&#…

武汉流星汇聚:青少年为何钟情亚马逊?一站式购物与信任铸就魅力

在当今这个数字化时代&#xff0c;青少年的消费习惯正以前所未有的速度演变&#xff0c;他们不仅是未来的消费主力军&#xff0c;更是推动市场变革的重要力量。令人瞩目的是&#xff0c;Piper Sandler最新发布的青少年消费研究报告揭示了一个引人注目的现象&#xff1a;超过半数…

快速下载大模型的方法

现在&#xff0c;每天都有各种大模型不断涌现&#xff0c;这些模型文件通常都很大。如何快速又靠谱地下载这些开源大模型&#xff0c;放到我们的环境中&#xff0c;进行后续的微调、量化和部署工作呢&#xff1f;以下是我的一些经验分享。 准备 Docker 基础环境 首先&#xf…

个人知识库与RAG的技术

构建个人知识库时&#xff0c;采用RAG结合LangChain的方法极为有效。RAG&#xff0c;即检索增强生成技术&#xff0c;是一种前沿的自然语言处理手段&#xff0c;它融合了信息检索的精确匹配与语言模型的高效文本生成&#xff0c;为处理自然语言相关任务提供了一种既灵活又准确的…

java~泛型

目录 泛型 泛型的声明 泛型的实例化 泛型的使用细节 自定义泛型类 自定义泛型接口 自定义泛型方法 泛型的继承和通配符 Junit 单元测试类 泛型 检查添加元素的类型 减少了类型转换的次数&#xff0c;直接对这个类型进行遍历&#xff0c;例如arraylist<>() publ…

Python酷库之旅-第三方库Pandas(072)

目录 一、用法精讲 291、pandas.Series.dt.round函数 291-1、语法 291-2、参数 291-3、功能 291-4、返回值 291-5、说明 291-6、用法 291-6-1、数据准备 291-6-2、代码示例 291-6-3、结果输出 292、pandas.Series.dt.floor函数 292-1、语法 292-2、参数 292-3、…

贪吃蛇游戏的实现:C++ 控制台版

功能概述 控制蛇的移动&#xff1a;使用WASD键控制蛇的移动方向。随机生成食物&#xff1a;蛇吃到食物后&#xff0c;食物会在游戏区域内随机生成。显示分数&#xff1a;游戏中会显示当前分数。游戏结束条件&#xff1a;当蛇碰到自己或走出边界时&#xff0c;游戏结束并显示“…

从巴黎到乐清,奥运精神引领全民健身新风尚!

16位火炬手接力&#xff0c;乐清点燃全民健身新篇章&#xff01; 作者&#xff1a;华夏之音总监&#xff0f;李望 在巴黎奥运会如火如荼进行的第11天&#xff0c;中国体育代表团以22枚金牌的骄人战绩领跑金牌榜&#xff0c;每一枚金牌都闪耀着中华体育精神的璀璨光芒&#xff…

c++ 连接mysql

其实就是MYsql c语言的API #define _CRT_SECURE_NO_WARNINGS 1 #define HOST "192.168.226.1" #define USER "root" #define PASSWORD "123456" #define PORT 3066#include <iostream> #include <stdlib.h> #include <mysql.…

【北斗授时服务】NTP网络时间服务器 安徽京准智造

【北斗授时服务】NTP网络时间服务器 安徽京准智造 【北斗授时服务】NTP网络时间服务器 安徽京准智造 一、NTP网络时间服务器产品介绍&#xff1a; NTP网络时间服务器是针对计算机、自动化装置等进行校时而研发的高科技设备&#xff0c;该产品可从GPS卫星&#xff08;北斗卫星、…

数据采集工具之Canal

本文主要介绍canal采集mysql数据的tcp、datahub(kafka)模式如何实现 1、下载canal https://aliyun-datahub.oss-cn-hangzhou.aliyuncs.com/tools/canal.deployer-1.1.5-SNAPSHOT.tar.gz 2、TCP模式的实现 a、canal.properties 打开看看即可&#xff0c;不需要调整 ######…

蚁群求解旅行商问题(TSP)的MATLAB例程

程序概况 输入需要经过的节点坐标&#xff1a; 运行程序后&#xff0c;即可得到&#xff1a; 运行结果 左图为遍历各点的运动轨迹&#xff0c;最终会回到起点右图为平均距离&#xff08;红线&#xff09;和最短距离在迭代时的变化情况 源代码 代码下载链接如下&#xff1a…

【工具类】JAVA (Android Studio )+ JS 加密解密 AES + Base 64

JAVA &#xff08;Android Studio &#xff09; JS 加密解密 AES Base 64 前言JAVA 代码&#xff08;解密&#xff09;JS代码&#xff08;加密&#xff09; 前言 整个过程&#xff1a; JS 接口先用AES加密&#xff0c;然后加密内容转Base64 编码&#xff1b;JAVA进行Base64解…

虹科干货 | 如何确保干冰运输的安全和稳定?

在上篇文章中&#xff0c;我们介绍了液氮罐运输和存储温度监测解决方案&#xff0c;本文我们将会了解医药供应链中干冰运输和温度监测的关键要点。 干冰在医药行业的应用 干冰是固体二氧化碳&#xff0c;当表面温度为 -78.5℃时&#xff0c;一块冷冻的干冰会直接转变为气体&am…

Ubuntu-18.04.1安装JetBrains PyCharm 2018.1.6 专业版(永久破解方法)

软件安装包下载地址&#xff1a;Other Versions - PyCharm 将安装包放置Ubuntu系统中解压&#xff0c;到bin目录下找到pycharm.sh即可打开。 补丁破解方式&#xff08;需关闭软件pycharm&#xff0c;否则会打不开pycharm&#xff01;&#xff01;&#xff01;&#xff09;&am…

昂科烧录器支持MindMotion灵动微电子的32位微控制器MM32F5287L9P

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中MindMotion灵动微电子的32位微控制器MM32F5287L9P已经被昂科的通用烧录平台AP8000所支持。 MM32F5287L9P搭载Armv8-M 架构“星辰”STAR-MC1处理器&#xff0c;最高工作频率可达…

CSS技巧专栏:一日一例 20-纯CSS实现点击会凹陷的按钮

本例图片 案例分析 其实这个按钮非常的简单啊&#xff0c;主要就是利用了box-shadow的inset。 布局代码 <button class"base">凹下的按钮</button> 基础样式 :root{--main-bg-color: #dcdcdc; /* 将页面背景色调整为浅灰色 */--color:#000;--hover-…

Cesium手动建模模型用Cesiumlab转3D Tiles模型位置不对,调整模型位置至指定经纬度

Cesium加载3Dtiles模型的平移和旋转_3dtiles先旋转再平移示例-CSDN博客 Cesium 平移cesiumlab生产的3Dtiles切片模型到目标经纬度-CSDN博客 【ArcGISCityEngine】自行制作Lod1城市大尺度白膜数据_cityengine 生成指定坐标集指定区域的白模-CSDN博客 以上次ArcGISCityEngine制…