基于ElementUI二次封装el-table与el-pagination分页组件[实际项目使用]

news2025/1/20 17:19:42

效果:

二次封装elementUI表格及其分页组件,并在项目中使用

二次封装el-table组件

<template>
  <div>
    <!-- 
      showHeader:是否显示头部
      size:表格的大小
      height:表格的高度
      isStripe:表格是否为斑马纹类型
      tableData:表格数据源
      isBorder:是否表格边框
      handleSelectionChange:行选中,多选内容发生变化回调函数
      fit:列的宽度是否自己撑开
      isRowBgc:如果需要设定行背景,需要指定rowClassName
      rowClassName:{
          bgc:"pink", //背景颜色
          attrName:"xs", //需要根据是否背景的属性
        },
      isMutiSelect:是否需要多选
      isRadio:是否单选
      isCondition:表头是否有赛选条件框
     -->
    <el-table
      :show-header="table.showHeader"
      :size="table.size"
      :height="table.height"
      :stripe="table.isStripe"
      :data="table.tableData"
      :border="table.isBorder"
      :row-key="getRowKeys"
      @sort-change="handleSort"
      @select="handleSelect"
      @select-all="handleSelectAll"
      @selection-change="handleSelectionChange"
      style="width: 100%"
      highlight-current-row
      :row-style="table.isRowBgc?tableRowClassName:{}"
    >
    <el-table-column v-if="table.isRadio" align="center" width="55" label="选择">
        <template slot-scope="scope">
          <!-- 可以手动的修改label的值,从而控制选择哪一项 -->
          <el-radio @input="singleElection(scope.row)" class="radio" v-model="templateSelection" :label="scope.row.id">&nbsp;</el-radio>
        </template>
      </el-table-column>
      <el-table-column
        v-if="table.isMutiSelect"
        type="selection"
        style="width: 60px"
      >
      </el-table-column>
      
      <template v-for="(col, key) in table.columns">
        <el-table-column
          v-if="col.type === 'slot'"
          :key="key"
          :prop="col.prop"
          :label="col.label"
          :width="col.width"
          :align="col.align"
          :header-align="col.headerAlign"
        >
          <template slot-scope="scope">
            <slot :name="col.slot_name" :row="scope.row"></slot>
          </template>
          <el-table-column :align="col.align" v-if="col.isCondition" :label="col.label" :prop="col.prop">
            <template
              slot="header"
              slot-scope="/* eslint-disable vue/no-unused-vars */ scope"
            >
            <slot :name="col.slot_siff_name"></slot>
            </template>
          </el-table-column>
        </el-table-column>
        <el-table-column
          v-else
          :key="key"
          :fixed="col.isFixed"
          v-show="col.hide"
          :prop="col.prop"
          :label="col.label"
          :width="col.width"
          :align="col.align"
          :header-align="col.headerAlign"
        >
          <el-table-column  v-if="col.isCondition" :align="col.align" :label="col.label" :prop="col.prop">
            <template
              slot="header"
              slot-scope="/* eslint-disable vue/no-unused-vars */ scope"
            >
            <slot :name="col.slot_siff_name"></slot>
            </template>
          </el-table-column>
        </el-table-column>
      </template>
    </el-table>
  </div>
</template>
<script>
export default {
  name: "hsk-table",
  props: {
    data: Object,
  },
  data() {
    return {
      templateSelection: "",  //当前选择行的id 
      checkList: [],//   当前选择的行的数据
      table: {
        showHeader:true, //是否显示表头
        fit:"true", //列的宽度是否自动撑开
        size:"small", //表格大小类型 medium / small / mini
        height:"500",  //高度
        isRowBgc:true,  //是否开启根据行某个属性更改背景
        rowClassName: null, //行背景及其根据哪一个属性进行判断是否背景
        columns: [], //列数据
        tableData: [], //表数据
        isMutiSelect: false, //是否行多选
        isRadio:false, //是否单选
        isBorder: true, //是否边框
        isStripe: false, //是否斑马纹
      },
    };
  },
  watch: {
    data: {
      handler(newVal) {
        this.init(newVal);
      },
      immediate: true,
      deep: true,
    },
  },
  methods: {
    tableRowClassName(e) {
      if(e.row[this.table.rowClassName.attrName]){
        return {
          background:this.table.rowClassName.bgc
        }
      }else{
        return {}
      }
    },
    async init(val) {
      for (let key in val) {
        if (Object.keys(this.table).includes(key)) {
          this.table[key] = val[key];
        }
      }
    },
    getRowKeys(row) {
      return row.id;
    },
    handleSort(column, prop, order) {
      this.$emit("tableSort", column, prop, order);
    },
    handleSelectionChange(val) {
      this.$emit("selectChange", val);
    },
    //多行选择
    handleSelectAll(val) {
      this.$emit("selectAll", val);
    },
    //多选
    handleSelect(val, row) {
      this.$emit("select", val, row);
    },
    //单选
    singleElection(row){
      this.$emit("radioSelectChange", row);
    }
  },
};
</script>

<style scoped>
.b {
  color: pink;
}
</style>

属性参数

属性说明
showHeader是否显示头部
height表格的高度
size表格大小
isStripe表格是否为斑马纹类型
tableData表格数据源
isBorder是否表格边框
handleSelectionChange行选中,多选内容发生变化回调函数
fit列的宽度是否自己撑开
isRowBgc如果需要设定行背景,需要指定rowClassName
rowClassName例子: { bgc:“pink”, //背景颜色 attrName:“xs”, //需要根据是否背景的属性 },
isMutiSelect是否需要多选
isRadio是否单选
isCondition表头是否有赛选条件框

父组件使用实例

<template>
  <div>
    <HskTable :data="table" @select="tableSlect" @selectChange="selectChange">
      <template v-slot:tag_slot="scope">
        <el-link type="primary">{{ scope.row.status }}</el-link>
      </template>
      <template v-slot:controls_slot="scope">
        <el-button type="text" @click="viewClick(scope.row)" size="small"
          >查看</el-button
        >
        <el-button type="text" size="small">编辑</el-button>
      </template>
      <template v-slot:data_siff_slot>
        <el-input
          v-model="table.roleName"
          size="mini"
          placeholder="请输入"
          clearable
          @clear="getList()"
          @keyup.enter.native="getList()"
        />
      </template>
      <template v-slot:age_siff_slot>
        <el-input
          v-model="table.roleName"
          size="mini"
          placeholder="请输入"
          clearable
          @clear="getList()"
          @keyup.enter.native="getList()"
        />
      </template>
    </HskTable>
    <br />
  </div>
</template>
<script>
import HskTable from "../package/hsk-table/index.vue";
export default {
  name: "hskTable",
  components: {
    HskTable,
  },
  data() {
    return {
      isHidden:false,
      table: {
        showHeader: true, //是否显示表头
        size: "small", //列表的型号
        fit: true, //列的宽度是否自己撑开
        height: "600", //表格高度
        isRowBgc: false, //如果需要设定行背景,需要指定rowClassName
        rowClassName: {
          bgc: "pink",
          attrName: "xs",
        },
        isStripe: false, // 是否边框
        isBorder: true,
        isMutiSelect: false, //是否需要多选
        isRadio: true, //是否单选
        // 列数据
        columns: [
          {
            type: "slot",
            label: "Tag",
            align: "center", //对其方式
            headerAlign: "center", //表头对其方式
            slot_name: "tag_slot",
            prop: "tag",
            width: "",
          },
          {
            label: "日期",
            prop: "date",
            isCondition: true,
            slot_siff_name: "data_siff_slot",
            width: "",
          },
          {
            label: "年龄",
            prop: "age",
            isCondition: true,
            slot_siff_name: "age_siff_slot",
            width: "",
          },
          {
            label: "姓名",
            prop: "name",
            width: "",
          },
          {
            label: "地址",
            prop: "address",
            width: "",
          },
          {
            type: "slot",
            label: "操作",
            slot_name: "controls_slot",
            width: "",
          },
        ],
        // 行数据
        tableData: [
          {
            id: "1",
            date: "2016-05-02",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1518 弄",
            status: true,
            age: 20,
            xs: true,
          },
          {
            id: "2",
            date: "2016-05-04",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1517 弄",
            status: true,
            age: 20,
            xs: false,
          },
          {
            id: "3",
            date: "2016-05-01",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1519 弄",
            status: true,
            age: 20,
            xs: true,
          },
          {
            id: "4",
            date: "2016-05-03",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1516 弄",
            status: true,
            age: 20,
            xs: false,
          },
          {
            id: "5",
            date: "2016-05-02",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1518 弄",
            status: true,
            age: 20,
            xs: true,
          },
          {
            id: "6",
            date: "2016-05-04",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1517 弄",
            status: true,
            age: 20,
            xs: false,
          },
          {
            id: "7",
            date: "2016-05-01",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1519 弄",
            status: true,
            age: 20,
            xs: true,
          },
          {
            id: "8",
            date: "2016-05-03",
            name: "王小虎",
            address: "上海市普陀区金沙江路 1516 弄",
            status: true,
            age: 20,
            xs: false,
          },
        ],
      },
    };
  },
  methods: {
    //展开隐藏
    showHidden(){
    this.isHidden = !this.isHidden
    },
    //行选中
    tableSlect(val, row) {
      console.log("val, row", val, row);
    },
    //选中改变
    selectChange(val) {
      console.log("val", val);
    },
  },
};
</script>

<style>
.code {
  line-height: 20px;
}
.rotate-180 {
  transform: rotate(180deg);
  transition: transform 0.5s;
}
.rotate-0 {
  transform: rotate(0deg);
  transition: transform 0.5s;
}
</style>

效果:

基于ElementUI二次封装el-table

二次封装el-pagination组件

<template>
  <!-- 分页组件 -->
  <!-- size-change(每页条数)    pageSize 改变时会触发 -->
  <!-- current-change(当前页)  currentPage 改变时会触发 -->
  <!-- page-size    每页显示条目个数,支持 .sync 修饰符 -->
  <!-- page-sizes   每页显示个数选择器的选项设置 -->
  <el-pagination
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
    :current-page="currentPage"
    :page-sizes="pageSizes"
    :page-size="pageSize"
    :layout="layout"
    :total="total"
  >
  </el-pagination>
</template>

<script>
export default {
  name:"hsk-pagination",
  props: {
    currentPage: {
      type: [String, Number],
      default: 1,
    },
    total: {
      type: [String, Number],
      default: 0,
    },
    pageSizes: {
      type: Array,
      default: () => [10, 15, 30, 50],
    },
    pageSize: {
      type: [String, Number],
      default: 10,
    },
    layout: {
      type: String,
      default: "total, sizes, prev, pager, next, jumper",
    },
  },
  data() {
    return {};
  },
  methods: {
    handleSizeChange(val) {
      this.$emit("sizeChange", val);
    },
    handleCurrentChange(val) {
      this.$emit("currentChange", val);
    },
  },
};
</script>
<style lang="less" scoped>
.page {
  text-align: center;
  color: #409eff;
}
</style>

属性参数

属性说明
size-change(每页条数)pageSize 改变时会触发
current-change(当前页)currentPage 改变时会触发
page-size每页显示条目个数,支持 .sync 修饰符
page-sizes每页显示个数选择器的选项设置

父组件使用实例

<template>
  <div class="tenant" style="margin: 15px">
    <el-row :gutter="24">
      <el-col :span="24" :xs="24">
        <hsk-pagination
            :total="queryParams.total"
            :currentPage.sync="queryParams.current"
            :pageSize="queryParams.pageSize"
            @sizeChange="sizeChange"
            @currentChange="currentChange"
          ></hsk-pagination>
      </el-col>
    </el-row>
  </div>
</template>
  <script>
import { getListAppByPage } from "@/api/application/application";
export default {
  data() {
    return {
      queryParams: {
        current: 1,
        pageSize: 10,
        total: 0,
      }
    }
  },
  created() {
    this.getList();
  },
  mounted(){
  },
  methods: {
    sizeChange(val) {
      this.queryParams.pageSize = val
      this.getList()
    },
    currentChange(val) {
      this.queryParams.current = val
      this.getList()
    },
    /** 新增租户按钮操作 */
    resetQuery() {
      this.$refs.add.add();
    },
    getList() {
    // 接口文档
      getListAppByPage(this.queryParams)
        .then((res) => {
          this.appList = res.data.data;
          this.table.tableData = res.data.data
          this.queryParams.total = parseInt(res.data.total);
        })
        .catch((err) => {
        });
    },
  },
};
</script>
<style lang="scss" scoped>
</style>

效果

基于ElementUI二次封装el-pagination分页组件

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

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

相关文章

基于虚拟机ubuntu的linux和shell脚本的学习,以及SSH远程登陆实战

简介 特点 是一款操作系统,跟windows,macos一样,有下面的特点 简单和高效,一切皆文件,所有配置都通过修改文件解决,不需要繁琐的权限和设置 权限高,把所有细节都交给用户,可完全自定义 安全,所有程序只有自己执行才会启动 分类 1、debian系主要有Debian&#xff0c;Ubun…

yolov8实战第四天——yolov8图像分类 ResNet50图像分类(保姆式教程)

yolov8实战第一天——yolov8部署并训练自己的数据集&#xff08;保姆式教程&#xff09;_yolov8训练自己的数据集-CSDN博客在前几天&#xff0c;我们使用yolov8进行了部署&#xff0c;并在目标检测方向上进行自己数据集的训练与测试&#xff0c;今天我们训练下yolov8的图像分类…

PHP序列化总结1--序列化和反序列化的基础知识

序列化和反序列化的作用 1.序列化&#xff1a;将对象转化成数组或者字符串的形式 2.反序列化&#xff1a;将数组或字符串的形式转化为对象 为什么要进行序列化 这种数据形式中间会有很多空格&#xff0c;不同人有不同的书写情况&#xff0c;可能还会出现换行的情况 为此为了…

C# Image Caption

目录 介绍 效果 模型 decoder_fc_nsc.onnx encoder.onnx 项目 代码 下载 C# Image Caption 介绍 地址&#xff1a;https://github.com/ruotianluo/ImageCaptioning.pytorch I decide to sync up this repo and self-critical.pytorch. (The old master is in old ma…

07-项目打包 React Hooks

项目打包 项目打包是为了把整个项目都打包成最纯粹的js&#xff0c;让浏览器可以直接执行 打包命令已经在package.json里面定义好了 运行命令&#xff1a;npm run build&#xff0c;执行时间取决于第三方插件的数量以及电脑配置 打包完之后再build文件夹下&#xff0c;这个…

Self-attention学习笔记(Self Attention、multi-head self attention)

李宏毅机器学习Transformer Self Attention学习笔记记录一下几个方面的内容 1、Self Attention解决了什么问题2、Self Attention 的实现方法以及网络结构Multi-head Self Attentionpositional encoding 3、Self Attention 方法的应用4、Self Attention 与CNN以及RNN对比 1、Se…

STM32移植LVGL图形库

1、问题1&#xff1a;中文字符keil编译错误 解决方法&#xff1a;在KEIL中Options for Target Flash -> C/C -> Misc Controls添加“--localeenglish”。 问题2&#xff1a;LVGL中显示中文字符 使用 LVGL 官方的在线字体转换工具&#xff1a; Online font converter -…

Python面向对象编程 —— 类和异常处理

​ &#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 1. 类 1.1 类的定义 1.2 类变量和实例变量 1.3 类的继承 2. 异常处理 2.1类型异常 2.…

【集合竞价】

文章目录 集合竞价时间集合竞价量柱的关系a、亮度顶部是未匹配的成交量b、量柱底部表示虚拟撮合的成交量 集合竞价常用的几种形态1、低开集合竞价2.平开集合竞价3、高开集合竞价4、看集合竞价的关键时间点&#xff1a;5、需要注意的几点 庄家使用集合竞价进行的操作1、利用集合…

【EI会议征稿通知】2024年通信技术与软件工程国际学术会议 (CTSE 2024)

2024年通信技术与软件工程国际学术会议 (CTSE 2024) 2024 International Conference on Communication Technology and Software Engineering (CTSE 2024) 2024年通信技术与软件工程国际学术会议 (CTSE 2024)将于2024年03月15-17日在中国长沙举行。会议专注于通信技术与软件工…

3D视觉-结构光测量-线结构光测量

概述 线结构光测量中&#xff0c;由激光器射出的激光光束透过柱面透镜扩束&#xff0c;再经过准直&#xff0c;产生一束片状光。这片光束像刀刃一样横切在待测物体表面&#xff0c;因此线结构光法又被成为光切法。线结构光测量常采用二维面阵 CCD 作为接受器件&#xff0c;因此…

【代码随想录】刷题笔记Day42

前言 这两天机器狗终于搞定了&#xff0c;一个控制ROS大佬&#xff0c;一个计院编程大佬&#xff0c;竟然真把创新点这个弄出来了&#xff0c;牛牛牛牛&#xff08;菜鸡我只能负责在旁边喊加油&#xff09;。下午翘了自辩课来刷题&#xff0c;这次应该是元旦前最后一刷了&…

自然语言处理3——玩转文本分类 - Python NLP高级应用

目录 写在开头1. 文本分类的背后原理和应用场景1.1 文本分类的原理1.2 文本分类的应用场景 2. 使用机器学习模型进行文本分类&#xff08;朴素贝叶斯、支持向量机等&#xff09;2.1 朴素贝叶斯2.1.1 基本原理2.1.2 数学公式2.1.3 一般步骤2.1.4 简单python代码实现 2.2 支持向量…

JSON 详解

文章目录 JSON 的由来JSON 的基本语法JSON 的序列化简单使用stringify 方法之 replacerstringify 方法之 replacer 参数传入回调函数stringify 方法之 spacestringify 方法之 toJSONparse 方法之 reviver 利用 stringify 和 parse 实现深拷贝 json 相信大家一定耳熟能详&#x…

2023-12-30 AIGC-LangChain介绍

摘要: 2023-12-30 AIGC-LangChain介绍 LangChain介绍 1. https://youtu.be/Ix9WIZpArm0?t353 2. https://www.freecodecamp.org/news/langchain-how-to-create-custom-knowledge-chatbots/ 3. https://www.pinecone.io/learn/langchain-conversational-memory/ 4. https://de…

AJAX: 整理2:学习原生的AJAX,这边借助express框架

1. npm install express 终端直接安装 2. 测试案例&#xff1a;Hello World&#xff01; 新建一个express.js的文件&#xff0c;写入下方的内容 // 1. 引入express const express require(express)// 2. 创建服务器 const app express()// 3.创建路由规则 // request 是对请…

迪杰斯特拉(Dijkstra)算法详解

【专栏】数据结构复习之路 这篇文章来自上述专栏中的一篇文章的节选&#xff1a; 【数据结构复习之路】图&#xff08;严蔚敏版&#xff09;两万余字&超详细讲解 想了解更多图论的知识&#xff0c;可以去看看本专栏 Dijkstra 算法讲解&#xff1a; 迪杰斯特拉算法(Di…

如何理解李克特量表?选项距离相等+题目权重相等!

在学术研究中&#xff0c;通过开展问卷调查获取数据时&#xff0c;调查问卷分为量表题和非量表题。量表题就是测试受访者的态度或者看法的题目&#xff0c;大多采用李克特量表。 李克特量表是一种评分加总式态度量表&#xff08;attitude scale&#xff09;&#xff0c;由美国…

TCP/IP的五层网络模型

目录 封装&#xff08;打包快递&#xff09; 6.1应用层 6.2传输层 6.3网络层 6.4数据链路层 6.5物理层 分用&#xff08;拆快递&#xff09; 6.5物理层 6.4数据链路层 6.3网络层 6.2传输层 6.1应用层 封装&#xff08;打包快递&#xff09; 6.1应用层 此时做的数据…

【数字图像处理】比特平面分割,对比空间平滑滤波器的尺寸对滤波效果,对比均值滤波器和中值滤波器对图像的平滑效果

实验目的 对比均值滤波器和中值滤波器对图像的平滑效果&#xff1b;编程对比空间平滑滤波器的尺寸对滤波效果的影响&#xff1b;编程对比均值滤波器和中值滤波器对图像的平滑效果。 实验方法 比特平面分割 比特平面分层&#xff0c;代替突出灰度级范围&#xff0c;突出特定…