el-table表格 及其el-pagination分页 封装及其使用

news2024/9/22 13:37:23

1、首页在components文件夹中新建table文件夹

在这里插入图片描述

table文件夹下table.vue全部代码:

<template>
  <el-table
    :stripe="stripe"
    :row-key="handlerRowKey()"
    :tree-props="treeProps"
    :border="border"
    :show-summary="showSummary"
    :data="tableData"
    :lazy="lazy"
    :load="treeLoad"
    style="width: 100%"
    @cell-click="editCell"
    @row-click="rowClick"
    @row-dblclick="rowDblclick"
    :span-method="objectSpanMethod"
    :cell-style="cellStyle"
    :formatter="formatter"
    :height="height"
    @selection-change="selectionChange"
    :summary-method="summaryMethod"
    v-loading="loading"
    element-loading-text="数据加载中"
    element-loading-spinner="el-icon-loading"
    element-loading-background="rgba(7, 25, 39, 0.5)"
    ref="table"
  >
    <el-table-column
      v-if="selection"
      type="selection"
      width="55"
      align="center"
    />
    <el-table-column
      v-if="index"
      type="index"
      :index="indexMethod"
      label="序号"
      align="center"
      width="50"
    />

    <!-- 含有多级表头的表格,最多两级 -->
    <template v-if="moreLevel">
      <template v-for="(coumn, index) in columnOption" :key="index">
        <el-table-column
          v-if="coumn.slot"
          align="center"
          :prop="coumn.prop"
          :label="coumn.label || coumn.name"
          :width="coumn.width"
          :min-width="coumn.minWidth"
          :fixed="coumn.fixed"
          :formatter="coumn.formatter"
        >
          <template v-if="coumn.children">
            <el-table-column
              v-for="(itemChild, childIndex) in coumn.children"
              :key="childIndex"
              :prop="itemChild.prop"
              :label="itemChild.label || itemChild.name"
              :align="itemChild.align || 'center'"
              :width="itemChild.width"
              :min-width="itemChild.minWidth"
              :fixed="itemChild.fixed"
              :formatter="itemChild.formatter"
            >
              <template v-slot="{ row }">
                <slot :name="itemChild.slot" :row="row" />
              </template>
            </el-table-column>
          </template>
          <template v-if="!coumn.children" v-slot="{ row }">
            <slot :name="coumn.slot" :row="row" />
          </template>
        </el-table-column>
        <el-table-column
          v-else
          :prop="coumn.prop"
          :label="coumn.label"
          :align="coumn.align || 'center'"
          :width="coumn.width"
          :min-width="coumn.minWidth"
          :fixed="coumn.fixed"
        >
          <template v-if="coumn.children">
            <template
              v-for="(itemChild, childIndex) in coumn.children"
              :key="childIndex"
            >
              <el-table-column
                v-if="itemChild.slot"
                align="center"
                :prop="itemChild.prop"
                :label="itemChild.label || itemChild.name"
                :width="itemChild.width"
                :min-width="itemChild.minWidth"
                :fixed="itemChild.fixed"
                :formatter="itemChild.formatter"
              >
                <template v-slot="{ row }">
                  <slot :name="itemChild.slot" :row="row" />
                </template>
              </el-table-column>
              <el-table-column
                v-else
                :prop="itemChild.prop"
                :label="itemChild.label"
                :align="itemChild.align || 'center'"
                :width="itemChild.width"
                :min-width="itemChild.minWidth"
                :fixed="itemChild.fixed"
                :formatter="itemChild.formatter"
              >
                <template v-if="itemChild.children">
                  <el-table-column
                    v-for="(
                      itemChildChild, childChildIndex
                    ) in itemChild.children"
                    :key="childChildIndex"
                    :prop="itemChildChild.prop"
                    :label="itemChildChild.label"
                    :align="itemChildChild.align || 'center'"
                    :width="itemChildChild.width"
                    :min-width="itemChildChild.minWidth"
                    :fixed="itemChildChild.fixed"
                    :formatter="itemChildChild.formatter"
                  >
                  </el-table-column>
                </template>
                <template v-if="!itemChild.children" v-slot="{ row }">
                  {{ row[itemChild.prop] }}
                </template>
              </el-table-column>
            </template>
          </template>
          <template v-if="!coumn.children" v-slot="{ row }">
            {{ row[coumn.prop] }}
          </template>
        </el-table-column>
      </template>
    </template>
    <!-- 正常表格 -->
    <template v-else>
      <template v-for="(coumn, index) in columnOption" :key="index">
        <el-table-column
          v-if="coumn.slot"
          :show-overflow-tooltip="showTooltip"
          :align="coumn.align || 'center'"
          :key="coumn.label"
          :prop="coumn.prop"
          :label="coumn.label"
          :width="coumn.width"
          :min-width="coumn.minWidth"
          :fixed="coumn.fixed"
          :formatter="coumn.formatter"
        >
          <template v-slot="{ row }">
            <slot :name="coumn.slot" :row="row" />
          </template>
        </el-table-column>

        <el-table-column
          v-else
          :align="coumn.align || 'center'"
          :sortable="coumn.sortable"
          :show-overflow-tooltip="showTooltip"
          :prop="coumn.prop"
          :label="coumn.label"
          :width="coumn.width"
          :min-width="coumn.minWidth"
          :fixed="coumn.fixed"
          :formatter="coumn.formatter"
        >
        </el-table-column>
      </template>
    </template>
  </el-table>
  <el-pagination
    v-if="pageData && pageDataShow"
    background
    :page-size="pageData.pageSize"
    :total="pageData.total"
    :pager-count="pagerCount"
    :current-page.sync="pageData.pageNo || pageData.pageNum"
    class="pagination"
    :layout="layout"
    @current-change="currentChange"
    @size-change="sizeChange"
  />
</template>

<script>
export default {
  name: "ScadaTable",
  props: {
    stripe: { type: Boolean, default: true },
    columnOption: { type: Array, default: () => [] }, // 每一列数据
    tableData: { type: Array, default: () => [] }, // 表格数据
    border: { type: Boolean, default: false }, // 是否显示列边框
    index: { type: Boolean, default: false }, // 是否显示排序
    selection: { type: Boolean, default: false }, // 是否显示多选框
    pageData: { type: Object, default: () => {} }, // 分页相关数据,有则显示
    rowKey: { type: String, default: "id" }, // 树表格必须指定key
    treeProps: { type: Object, default: () => {} },
    tree: { type: Boolean, default: false }, // 是否是树表格
    objectSpanMethod: { type: Function, default: () => {} }, //合并行或列
    showSummary: { type: Boolean, default: false },
    summaryMethod: { type: Function, default: () => {} },
    cellStyle: { type: Function, default: () => {} },
    formatter: { type: Function, default: () => {} },
    loading: { type: Boolean, default: false },
    moreLevel: { type: Boolean, default: false },
    height: { type: String, default: "auto" },
    showTooltip: { type: Boolean, default: true },
    lazy: { type: Boolean, default: false },
    pageDataShow: { type: Boolean, default: true },
    layout: { type: String, default: "prev, pager, next, sizes,total" },
    pagerCount: {
      type: Number,
      default: 7,
    },
  },
  emits: [
    "editCell",
    "rowClick",
    "rowDblclick",
    "currentChange",
    "sizeChange",
    "treeLoad",
    "selectionChange",
  ],
  setup(props, context) {
    const indexMethod = (index) => {
      if (props.pageData) {
        return (
          index +
          1 +
          ((props.pageData.pageNo || props.pageData.pageNum) - 1) *
            props.pageData.pageSize
        );
      } else {
        return index + 1;
      }
    };
    const handlerRowKey = () => {
      return (props.tree && props.rowKey) || "";
    };
    //给合计的单元格加上文字提示

    //点击单元格的时候
    const editCell = (item, column, cell, event) => {
      context.emit("editCell", item, column, cell, event);
    };
    // 点击行的时候
    const rowClick = (row, column, event) => {
      context.emit("rowClick", row, column, event);
    };
    // 双击行的时候
    const rowDblclick = (row, column, event) => {
      context.emit("rowDblclick", row, column, event);
    };

    // 改变页数回调
    const currentChange = (event) => {
      context.emit("currentChange", event);
    };
    // 改变显示个数回调
    const sizeChange = (event) => {
      context.emit("sizeChange", event);
    };

    // 树加载
    const treeLoad = (tree, treeNode, resolve) => {
      context.emit("treeLoad", tree, treeNode, resolve);
    };

    // 选中框状态改变
    const selectionChange = (selection) => {
      context.emit("selectionChange", selection);
    };
    return {
      indexMethod,
      handlerRowKey,
      editCell,
      rowClick,
      rowDblclick,
      currentChange,
      sizeChange,
      treeLoad,
      selectionChange,
    };
  },
};
</script>

<style lang="scss">
.el-loading-spinner {
  i {
    color: #00ffff !important;
  }

  .el-loading-text {
    color: #00ffff !important;
  }
}
</style>

table文件夹下index.js 全部代码:

import Table from './table.vue'

export default Table

components文件夹下的index.js全部代码:

import Table from './table'
const components = [
    Table,
]

export default (Vue) => {
    components.forEach((ele) => Vue.component(ele.name, ele))
}

在main.js文件中代码(设置为组件):

import Components from "./components";

app.use(Components).use(router).use(store).mount("#app");

用法(结构):

<!--  表格 -->

    <scada-table
      selection 
      index
      stripe
      :showSummary="isShow"
      :loading="tableObj.loading"
      @selectionChange="tableObj.selectionChange"
      :summaryMethod="tableObj.summaryMethod"
      :moreLevel="true"
      :column-option="tableObj.columnOption"
      :table-data="tableObj.tableData" 
      :objectSpanMethod="tableObj.spanMethod"
      :cellStyle="tableObj.cellStyle"
      :pageData="tableObj .pageData"
      @currentChange="tableObj .currentChange"
      @sizeChange="tableObj .sizeChange">
    >
       <template v-slot:caozuo="{ row }">
        <el-button type="text" @click="tableObj.deleteData(row)">删除</el-button>
      </template>
    </scada-table>

用法(js):

// 表格
const tableObj = reactive({
  loading:false,
  columnOption:[],//表头
  tableData:[],//表格数据
  delList:[],//批量删除id
  mergeObj:{},// 合并行的下标
  mergeArr:[],// 表格中的列名
  // 分页
  pageData: {
    // 表格分页所需数据
    pageSize: 10,
    total: 10,
    pageNum: 1,
    usePageHelper: true,
  },
  currentChange: (event) => {
    // 分页页数变化
    resObj.pageData.pageNum = event;
    resObj.getData();
  },
  sizeChange: (event) => {
    // 分页大小变化
    resObj.pageData.pageSize = event;
    resObj.getData();
  },
  // 表格合并方法
  spanMethod:({ row, column, rowIndex, columnIndex })=>{},
  // 合计方法
  summaryMethod:(param)=>{
    // param列数组;data数据
    const { columns, data } = param
  },
  getData:()=>{
    // 获取表头数据 
  },
  // 多选框选中数组
  selectionChange:(val)=>{
    tableObj.delList = val.map(item=>{
      return item.id
    })
  },
  // 判断多选数组是否为空
  reduceBtn:()=>{
    if(tableObj.delList.length === 0){
      return ElMessage.warning({
        message:"请选择删除的数据",
        type:"warning"
      })
    }
    tableObj.deleteData()
  },
  // 批量单个删除
  deleteData:(row) => {
    ElMessageBox.confirm("此操作将删除阅读资料,是否继续?", "提示", {
      confirmButtonText: "确定",
      cancelButtonText: "取消",
      type: "warning",
    }).then(() => {
      // 执行删除接口
    });
  },
  // 筛选查询
  submit:()=>{
    if(dateRange.value.length > 0){
      form.beginDate = dateRange.value[0]
      form.endDate = dateRange.value[1]
    }else{
      form.beginDate = ""
      form.endDate =""
    }
    resObj.getData()
  },
  // 重置
  reset:()=>{
    filterForm.value.resetFields();
    dateRange.value = []
    form.plateNumber = "";
    form.beginDate = "";
    form.endDate = "" ;
    resObj.getData()
  },
})

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

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

相关文章

Vue3相比于Vue2进行了哪些更新

1、响应式原理 vue2 vue2中采用 defineProperty 来劫持整个对象&#xff0c;然后进行深度遍历所有属性&#xff0c;给每个属性添加getter和setter&#xff0c;结合发布订阅模式实现响应式。 存在的问题&#xff1a; 检测不到对象属性的添加和删除数组API方法无法监听到需要对…

蓝桥杯单片机学习总结(Day15 超声波测距)

开启超声波模块测距方法&#xff1a; X20106A是一款红外线检波接收的专用芯片&#xff0c;常用于电视机红外遥控接收器。当CX20106A接收到40KHz的信号时&#xff08;第五脚200K的电阻决定了其频率为40KHz&#xff09;&#xff0c;会在OUT脚输出一个低电平下降脉冲。这个信号甚至…

IDEA打开终端报错Cannot open Local Terminal命令行功能

idea项目中不能打开命令行功能 IDEA打开终端报错Cannot open Local Terminal 意思是打开命令行发生错误 idea上配置shell终端&#xff0c;命令行页面 打开右上角 File–> setting–> Tools–> 终端 找到Shell 路径 文本框中原本是是powershell.exe&#xff0c;现在…

Java | Leetcode Java题解之第278题第一个错误的版本

题目&#xff1a; 题解&#xff1a; public class Solution extends VersionControl {public int firstBadVersion(int n) {int left 1, right n;while (left < right) { // 循环直至区间左右端点相同int mid left (right - left) / 2; // 防止计算时溢出if (isBadVers…

企业专线和家庭宽带的区别

企业专线&#xff08;也称为商业互联网服务&#xff09;与家庭宽带在多个方面存在区别&#xff0c;这些差异主要体现在网络性能、服务质量、价格、合同条款以及支持服务上。以下是两者的主要区别&#xff1a; 1、网络质量和速度&#xff1a; 企业专线通常提供更稳定、更快的网络…

虚拟机Ubuntu20.04 利用串口调试机械臂

虚拟机Ubuntu20.04 利用串口调试机械臂 串口库问题 由于机械臂使用的是串口进行驱动控制&#xff0c;在python中相关的串口库为serial和pyserial两个&#xff0c;这里我曾踩过雷同时安装了serial与pyserial两个库&#xff0c;导致报错如下所示&#xff1a; AttributeError: m…

Apache Tomcat文件包含漏洞复现(详细教程)

1.漏洞原理 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;其安装后会默认开启ajp连接器&#xff0c;方便与其他web服务器通过ajp协议进行交互。属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和…

责任链模式的应用与解析

目录 责任链模式责任链模式结构责任链模式适用场景责任链模式优缺点练手题目题目描述输入描述输出描述题解 责任链模式 责任链模式&#xff0c;亦称职责链模式、命令链&#xff0c;是一种行为设计模式&#xff0c;允许你将请求沿着处理者链进行发送。收到请求后&#xff0c;每…

韩顺平0基础学java——第36天

p715-735 反射调用速度慢 反射调用优化-关闭访问检查 1. Method和Field、Constructor对象都有setAccessible() 方法2. setAccessible作用是启动和禁用访问安全检查的开关 3&#xff0e;参数值为true表示反射的对象在使用时取消访问检查&#xff0c;提高反射的效率。参数值 为…

Redis核心技术与实战学习笔记

Redis核心技术与实战学习笔记 最近想沉下心来看下redis&#xff0c;买了蒋德钧老师的《Redis 核心技术与实战》,这里记录一些学习笔记 希望能够坚持下去有想一起学习的童鞋&#xff0c;可以点击跳转到文章尾部获取学习资源,仅供学习不要用于任何商业用途!!! redis知识全景图 …

2024-07-22 Unity AI行为树1 —— 框架介绍

文章目录 1 行为树2 行为树驱动方式3 行为树结点分类3.1 控制节点3.2 执行节点 4 行为树与状态机比较 本文章参考 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 行为树 ​ 行为树&#xff08;Behavior Tree&#xff0c;BT&#xff09;在游戏 AI 中是一种用于控制…

精益管理意识与企业战略规划的匹配度如何评估?

众所周知&#xff0c;精益管理不仅要求企业在生产运营过程中实现资源的最大化利用&#xff0c;同时也强调企业战略规划的精准性和前瞻性。因此&#xff0c;评估精益管理意识与企业战略规划的匹配度&#xff0c;对于企业的长期发展至关重要。具体方法如深圳天行健企业管理咨询公…

springboot 项目整合 AI (文心一言)

百度智能云网址&#xff1a;https://cloud.baidu.com/?fromconsole 注册——个人认证——登录成功 第一步&#xff1a;点击千帆大模型平台 ​ 第二步&#xff1a;点击应用接入——创建应用 ​ 第三步&#xff1a;点击接口文档——API列表——可以点击指定模型进行查看调…

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.4数据架构

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

hamcrest 断言框架使用示例和优势分析

引言 在软件测试领域&#xff0c;断言是验证代码行为是否符合预期的关键环节。Hamcrest 断言框架&#xff0c;以其独特的匹配器&#xff08;Matcher&#xff09;概念和清晰的失败信息&#xff0c;赢得了广泛的赞誉。尽管 Python 标准库中没有内置的 Hamcrest 库&#xff0c;但…

【前端新手小白】学习Javascript的【开源好项目】推荐

目录 前言 1 项目介绍 1.1 时间日期类 1.2 网页store类 1.3 事件类 1.4 Number类 1.5 String类 1.6 正则验证类 1.7 ajax类 1.8 data数据类 1.9 browser浏览器类 2 学习js-tool-big-box开源项目时有哪些收获 2.1 你可以这样做 2.2 如果你需要使用本项目 2.3 你…

开局一个启动器:从零开始入坑ComfyUI

前几天刷某乎的时候看到了一位大佬写的好文&#xff0c;可图 IP-Adapter 模型已开源&#xff0c;更多玩法&#xff0c;更强生态&#xff01; - 知乎 (zhihu.com) 久闻ComfyUI大名&#xff0c;决定试一下。这次打算不走寻常路&#xff0c;不下载现成的一键包了&#xff0c;而是…

矩估计与最大似然估计的通俗理解

点估计与区间估计 矩估计与最大似然估计都属于点估计&#xff0c;也就是估计出来的结果是一个具体的值。对比区间估计&#xff0c;通过样本得出的估计值是一个范围区间。例如估计一个人的年龄&#xff0c;点估计就是最终直接估计年龄为50岁&#xff0c;而区间估计是最终估计的…

Qt源码交叉编译带openssl的Qt版本

一.背景 近期项目由于对接的后台服务是https的&#xff0c;之前交叉编译的Qt是不带openssl的&#xff0c;为了能支持https&#xff0c;必须要重新编译Qt。 二.环境 环境准备&#xff1a; Ubuntu版本 &#xff1a;18.04&#xff1b; openssl 版本&#xff1a;1.1.1.g&#xff1b…

go-kratos 学习笔记(5) 删除hellword从新生成服务

go-kratos 删除hellword模版里的服务&#xff0c;从新生成服务users 直接删除api/helloword 目录&#xff0c;在api目录下新建 users目录&#xff1b;使用命令生成新的proto #项目根目录执行 kratos proto add api/users/user.protobuf generate生成的user.proto需要根据自己…