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

效果:

二次封装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分页组件

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

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

相关文章

遗传算法的应用——求解一元函数的极值

遗传算法的应用——求解一元函数的极值 1 基本概念2 预备知识3.1 模拟二进制转化为十进制的方法3.2 轮盘赌选择算法 3 问题4 Matlab代码5 运行效果6 总结 1 基本概念 遗传算法(Genetic Algorithm,GA)是模拟生物在自然环境中遗传和进化过程从而形成的随机全局搜索和优化方法&am…

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

工作原理 多线结构光测量在测量方式上类似上述线结构光测量&#xff0c;但是两者也有着一些明显的差别。这种形式的结构光测量&#xff0c;也常常被成为面结构光测量。首先激光器发出电光源通过通过光栅的调制产生多个切片光束&#xff0c;这些切片光束照射到待测物体表面后形成…

2023第三届中国高校大数据挑战赛B题代码

任务已完成&#xff0c;聚类效果很好&#xff08;主要在于数据的处理以及特征工程&#xff09;, 需代码si&#xff0c;yuer有限先到先得。

AI测试|颠覆客户端UI自动化?别担心,你还不会失业!AppAgent框架简单试用

01 AppAgent会成为新的趋势吗&#xff1f; 近日&#xff0c;腾讯团队发表了一篇论文&#xff0c;并开源了一款基于大语言模型的&#xff0c;用于手机端执行复杂任务的多模态智能代理框架——AppAgent。该框架设计的初衷&#xff0c;是让 AI 智能体能自己操作手机&#xff0c;完…

数据压缩专题——静止图像的小波变换编码

随着数字图像技术的发展和应用的广泛&#xff0c;对图像的压缩和编码变得越来越重要。小波变换编码作为一种有效的图像压缩和编码方法&#xff0c;在静止图像处理中得到了广泛应用。本文将介绍静止图像的小波变换编码的基本原理和关键步骤&#xff0c;以及其在图像压缩中的应用…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率获取方式CameraExplorer如何查看相机帧率信息在NEOAPI SDK里通过函数获取相机帧率&#xff08;C&#xff09; …

前后端分离nodejs+vue医院预约挂号系统6nrhh

医院预约挂号系统主要有管理员、用户和医生三个功能模块。以下将对这三个功能的作用进行详细的剖析。 运行软件:vscode 前端nodejsvueElementUi 语言 node.js 框架&#xff1a;Express/koa 前端:Vue.js 数据库&#xff1a;mysql 开发软件&#xff1a;VScode/webstorm/hbuiderx均…

HBuilder常用的快捷键

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置&#xff0c;前后端开发环境的配置&#xff0c;编辑器的配置&#xff0c;网络服务的配置&#xff0c;网络命令的应用与配置&#xff0c;windows常见问题的解决等。 文章目录 常用快捷键分9项快捷键1.文件(4)2.编辑(13)3.…

JavaScript系列——正则表达式

文章目录 需求场景正则表达式的定义创建正则表达式通过 / 表示式/ 创建通过构造函数创建 编写一个正则表达式的模式使用简单模式使用特殊字符常用特殊字符列表特殊字符组和范围 正则表达式使用代码演示 常用示例验证手机号码合法性 小结 需求场景 在前端开发领域&#xff0c;在…

Idea中使用Tomcat部署并启动Web项目

首先在Idea中选择编辑运行配置&#xff0c;如下图 左上角的“”号&#xff0c;选择Tomcat服务&#xff0c;如下图 自定义服务名称和项目在浏览器的访问路径 配置Tomcat服务器路径&#xff0c;如下图 然后在服务器中部署项目&#xff08;下面的警告提示&#xff1a;Warning: No …

PostgreSQL 作为向量数据库:入门和扩展

PostgreSQL 拥有丰富的扩展和解决方案生态系统&#xff0c;使我们能够将该数据库用于通用人工智能应用程序。本指南将引导您完成使用 PostgreSQL 作为向量数据库构建生成式 AI 应用程序所需的步骤。 我们将从pgvector 扩展开始&#xff0c;它使 Postgres 具有特定于向量数据库…

HCIP:rip综合实验

实验要求&#xff1a; 【R1-R2-R3-R4-R5运行RIPV2】 【R6-R7运行RIPV1】 1.使用合理IP地址规划网络&#xff0c;各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.加快网络收敛&#xff0c;减少路由条目数量&#xff0c;增…

Vue 框架前导:详解 Ajax

Ajax Ajax 是异步的 JavaScript 和 XML。简单来说就是使用 XMLHttpRequest 对象和服务器通信。可以使用 JSON、XML、HTML 和 text 文本格式来发送和接收数据。具有异步的特性&#xff0c;可在不刷新页面的情况下实现和服务器的通信&#xff0c;交换数据或者更新页面 01. 体验 A…

golang 图片加水印

需求&#xff1a; 1&#xff0c;员工签到图片加水印 2&#xff0c;水印文字需要有半透明的底色&#xff0c;避免水印看不清 3&#xff0c;图片宽设置在600&#xff0c;小于600或者大于600都需要等比例修改图片的高度&#xff0c;保持水印在图片中的大小和位置 4&#xff0c;处理…

湘潭大学-2023年下学期-c语言-作业0x0a-综合1

A 求最小公倍数 #include<stdio.h>int gcd(int a,int b) {return b>0?gcd(b,a%b):a; }int main() {int a,b;while(~scanf("%d%d",&a,&b)){if(a0&&b0) break;printf("%d\n",a*b/gcd(a,b));}return 0; }记住最大公约数的函数&…

【C++杂货铺】C++11新特性——lambda

文章目录 一、C98中的排序二、先来看看 lambda 表达式长什么样三、lambda表达式语法3.1 捕捉列表的使用细节 四、lambda 的底层原理五、结语 一、C98中的排序 在 C98 中&#xff0c;如果要对一个数据集合中的元素进行排序&#xff0c;可以使用 std::sort 方法&#xff0c;下面…

《掌握这些黑科技,让你的电脑办公效率飞升》

随着电脑在现代办公中的广泛应用&#xff0c;如何提升电脑办公效率成为了一个重要的话题。随着科技的不断发展&#xff0c;越来越多的黑科技涌现出来&#xff0c;为我们提升电脑办公效率提供了更多的选择。在这篇文章中&#xff0c;我将为大家介绍几种提升电脑办公效率的黑科技…

【23.12.30高可用篇】什么是SLA?

什么是SLA&#xff1f; ✔️简述✔️拓展知识✔️4个9、5个9 ✔️简述 SLA是Service Level Agreement的缩写&#xff0c;意为服务等级协议。它是指供应商和客户之间达成的一份正式协议&#xff0c;规定了供应商应该向客户提供的服务水平、质量、可靠性和响应时间等指标。 SLA通…

Redis为何如此快速?

1. 引言 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的键值对存储数据库。它以其出色的性能和灵活的数据结构而闻名&#xff0c;今天就来谈谈redis为什么会这么快。 1.1 Redis是单线程吗&#xff1f; Redis 的单线程主要是指 Redis 的网络 IO 和键值对…

GBASE南大通用携手宇信科技打造“一表通”全链路解决方案

什么是“一表通”&#xff1f; “一表通”是国家金融监督管理总局为发挥统计监督效能、完善银行保险监管统计制度、推进监管数据标准化建设、打破数据壁垒&#xff0c;而制定的新型监管数据统计规范。相较于以往的报送接口&#xff0c;“一表通”提高了对报送时效性、校验准确…