前端实现 查询包含分页 以及封装table表格 上手即用!

表格组件是 element plus  中的table  又经过了一层封装   封装的table代码在最底下

  <div class="box2">
      <el-radio-group v-model="radio" style="margin-bottom: 16px">
        <el-radio-button label="1">类型1</el-radio-button>
        <el-radio-button label="2">类型2</el-radio-button>
        <el-radio-button label="3">类型3</el-radio-button>
      </el-radio-group>
      <el-form class="form" ref="queryForm" :inline="true">
        <el-form-item label="渠道代码">
          <el-input v-model="code" placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="渠道名称">
          <el-input v-model="name" placeholder="请输入"></el-input>
        </el-form-item>
      </el-form>
    </div>

    <MyTable
      :currentPage="currentPage"
      :pageSize="pageSize"
      :total="total"
      :tableData="tableDataComputed"
      :tableColumn="tableColumn"
      :showOperation="false"
      @pageChange="handlePageChange">
    </MyTable>


<script setup>
  import {
    getWebhookQuery,
    selectEnableChannel,
    parcelSelectEnableChannel,
    expSelectEnableChannel
  } from '@/api/my-center/my-center.js'
  import { onMounted, ref, computed,  } from 'vue'
  import MyTable from './components/MyTable.vue'
  import usePage from './hooks/usePage'

  const radio = ref('1')
  const name = ref('')
  const code = ref('')

  const tableColumn = ref([
    { prop: 'id', label: '渠道代码' },
    { prop: 'name', label: '渠道名称' }
  ])

  const { tableData, currentPage, pageSize, pageChange } = usePage()
  pageSize.value = 10

  let obj = ref({ 1: [], 2: [], 3: [] })

  onMounted(async () => {
    const [
      { data: { token }},
      { data: data2 },
      { data: data3 },
      { data: data4 }
    ] = await Promise.all([
      getWebhookQuery(),
      selectEnableChannel(),
      parcelSelectEnableChannel(),
      expSelectEnableChannel()
    ])
    obj.value = {
      1: data2,
      2: data3,
      3: data4
    }
  })

  let tableDataComputed = computed(() => {
    return obj.value[radio.value]
      .filter(item => item.name.indexOf(name.value) > -1 && item.id.indexOf(code.value) > -1)
      .slice((currentPage.value - 1) * pageSize.value, currentPage.value * pageSize.value)
  })

  let total = computed(() => {
    return obj.value[radio.value].filter(item => item.name.indexOf(name.value) > -1 && item.id.indexOf(code.value) > -1)
      .length
  })

  function handlePageChange (key, value) {
    pageChange(key, value)
  }

</script>

MyTable.vue

<template>
  <el-table
    tooltip-effect="dark"
    style="width: 100%"
    stripe
    max-height="360"
    :header-cell-style="{
      background: '#f1f3f5',
      color: '#000000'
    }"
    :data="tableData"
    :row-key="rowKey">
    <el-table-column
      v-for="(item, index) in tableColumn"
      :key="index"
      :prop="item.prop"
      :label="item.label"
      :min-width="item.width"
      align="center">
      <template v-if="item.slot" v-slot:default="scope">
        <slot :name="item.prop" :row="scope.row" :prop="item.prop"></slot>
      </template>
      <template v-else v-slot:default="scope">
        <div v-if="item.format">
          {{ item.format(scope.row, item.prop) }}
        </div>
        <div v-else>
          {{ scope.row[item.prop] }}
        </div>
      </template>
    </el-table-column>
    <!-- 操作列 -->
    <el-table-column fixed="right" align="center" :min-width="operationWidth" v-if="showOperation" label="操作">
      <template v-slot:default="scope">
        <slot name="operation" :row="scope.row"></slot>
      </template>
    </el-table-column>
  </el-table>
  <el-pagination
    class="pagination"
    v-show="showPage"
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
    :current-page="currentPage"
    :page-sizes="pageSizes"
    :page-size="pageSize"
    layout="total, sizes, prev, pager, next, jumper"
    :total="total"
    background>
  </el-pagination>
</template>

<script setup>
  import { defineProps } from 'vue'
  const props = defineProps({
    tableData: {
      type: Array,

      default: []
    },
    tableColumn: {
      type: Array,
      required: true,
      default: []
    },
    rowKey: {
      type: String,
      defult: 'id'
    },
    showPage: {
      type: Boolean,
      default: true
    },
    showOperation: {
      type: Boolean,
      default: true
    },
    pageSize: {
      type: Number,
      default: 5
    },
    pageSizes: {
      type: Array,
      default: [5, 10, 20]
    },
    currentPage: {
      type: Number,
      default: 1
    },
    total: {
      type: Number,
      default: 200
    },
    operationWidth: {
      type: String
    }
  })
  const emits = defineEmits(['pageChange'])

  function handleSizeChange (value) {
    emits('pageChange', 'pageSize', value)
  }
  function handleCurrentChange (value) {
    emits('pageChange', 'currentPage', value)
  }
</script>

<style lang="scss">
  .pagination {
    display: flex;
    justify-content: end;
    margin-top: 15px;
  }
  .el-pagination.is-background .el-pager li:not(.is-disabled).is-active {
    background-color: #ff7d00;
  }
</style>

usePage.js

import { ref } from 'vue'

export default function () {
  const tableData = ref([])
  let currentPage = ref(1)
  let pageSize = ref(10)
  let total = ref(0)
  function pageChange (key, value) {
    // console.log(key, value, '00000000')
    if (key === 'pageSize') {
      pageSize.value = value
    } else {
      currentPage.value = value
    }
  }
  function pageReset () {
    currentPage.value = 1
    pageSize.value = 10
  }
  return {
    tableData,
    currentPage,
    pageSize,
    total,
    pageChange,
    pageReset
  }
}

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

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

相关文章

vue3 uniapp 项目初始化集成配置【开箱即用】

https://gitee.com/charrie/vue3-uniapp-init 技术说明 采用vue3viteuniapp技术栈&#xff0c;setup语法糖编码方式引入unocss量子化样式引擎&#xff0c;动态css不用自己写样式&#xff0c;引用class即可&#xff0c;降低代码体积全局请求入口已封装&#xff0c;使用时自己封…

易基因: WGBS+ChIP-seq揭示食管癌的细胞类型和癌症特异性表观遗传调控|Genome Biol

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 食管癌是一种常见的恶性肿瘤&#xff0c;有两种亚型&#xff1a;鳞状细胞癌&#xff08;squamous cell carcinoma&#xff0c;ESCC&#xff09;和腺癌&#xff08;adenocarcinoma&#x…

【C++】string类(介绍、常用接口)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 string类的常用接口说明 string类对象的常见构造 ​编辑 string字符串的遍历&#xff08;迭代器&#xf…

力扣刷题Days12--104二叉树最大深度(js)

目录 1&#xff0c;题目 2&#xff0c;代码 2.1深度优先遍历--递归思想 2.2-0广度优先搜索--错误版 2.2广度优先搜索 3&#xff0c;学习与总结 3.1二叉树的复习 3.2array常用函数复习 1&#xff0c;题目 给定一个二叉树 root &#xff0c;返回其最大深度。二叉树的 最大…

解决Iterm2升级后遇到“Stashed changes“的问题

&#xff1c;&#xff1c;&#xff1c;&#xff1c;&#xff1c;&#xff1c;&#xff1c; Updated upstream ...... &#xff1e;&#xff1e;&#xff1e;&#xff1e;&#xff1e;&#xff1e;&#xff1e; Stashed changes冲突标记符的代码如题&#xff0c;最近有升级Item2…

鸿蒙原生应用元服务开发-WebGL网页图形库开发接口说明

一、场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理&#xff0c;比如绘制彩色图形等。目前该功能仅支持使用兼容JS的类Web开发范式开发。 二、接口说明 表1 WebGL主要接口列表 本文参考引用HarmonyOS官方开发文档&#xff0c;基于API9。

RStudio更换R语言版本

今天下载R语言用于读取.xlsx文件的readxl包时&#xff0c;RStudio提示该包是使用R-4.3.3版本构建&#xff0c;而我现在使用的是R-4.3.2版本&#xff0c;所以需要升级一下R语言版本&#xff0c;这里先下载最新版本的R语言&#xff0c; 下载地址&#xff1a;The Comprehensive R…

Early if-conversion - 优化阅读笔记

Early if-conversion 用于对于没有很多可预测指令的乱序CPU。目标是消除可能误预测的条件分支。 来自分支两侧的指令都会被推测性地执行&#xff0c;并使用 cmov 指令选择结果。 // SSAIfConv 类在确定可能的情况下&#xff0c;对SSA形式的机器码执行if-conversion。该类不包…

基于JAVA实现自由教学平台设计【附项目源码】分享

基于JAVA实现自由教学平台系统演示 视频&#xff1a;ssm自由教学平台演示录像-CSDN直播基于JAVA实现自由教学平台设计https://live.csdn.net/v/369811 项目源码地址&#xff1a;https://download.csdn.net/download/weixin_43894652/88842681 一、目标 构建一个基于JAVA的网…

第八十天 WAF攻防-漏洞利用HPP污染分块传输垃圾数据

第80天 WAF攻防-漏洞利用&HPP污染&分块传输&垃圾数据 参考点&#xff1a; #将MySQL注入函数分为几类 拆分字符串函数&#xff1a;mid、1eft、1pad等 编码函数&#xff1a;ord、hex、a3ci等 运算函数&#xff1a;*/&^&#xff01;1 ike rlike reg等 空格替换部…

Python-Pong-Game

我还加了音效&#xff0c;类似于小时候游戏机上的弹球游戏 import os import turtle import pygame#初始化pygame pygame.init()#加载声音文件 bounce_sound pygame.mixer.Sound("bounce.mp3")wn turtle.Screen() wn.title("Pong by ") wn.bgcolor(&qu…

【猫头虎科技解码】探秘Drools语法:规则引擎在实战中的应用️

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

关于yolov8文档的记录,补充一些整理的知识点

2023年由Ultralytics 提供了YOLOv8开源项目。YOLOv8 支持全方位的视觉 AI 任务&#xff0c;包括检测、分割、姿态估计、跟踪和分类。这种多功能性使用户能够在各种应用和领域中利用YOLOv8 的功能。安装yolov8开源项目 pip install githttps://github.com/ultralytics/ultralyti…

SPEL表达式及注入漏洞

SPEL,全称为Spring表达式语言&#xff0c;是一个由 Spring 框架提供的表达式语言。它是一种基于字符串的表达式语言&#xff0c;可以在运行时对对象进行查询和操作。 SpEL 支持在XML和注解配置中使用&#xff0c;它可以在Spring框架的各种组件中使用&#xff0c;如Spring MVC …

7.无重复字符的最长字串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

Flink技术简介与入门实践

架构简介 Flink 是一个分布式流处理和批处理计算框架&#xff0c;具有高性能、容错性和灵活性。下面是 Flink 的架构概述&#xff1a; JobManager&#xff1a;JobManager 是 Flink 集群的主节点&#xff0c;负责接收和处理用户提交的作业。JobManager 的主要职责包括&#xff1…

【wps】wps与office办公函数储备使用(结合了使用案例 持续更新)

【wps】wps与office办公函数储备使用(结合了使用案例 持续更新) 1、TODAY函数 返回当前电脑系统显示的日期 TODAY函数&#xff1a;表示返回当前电脑系统显示的日期。 公式用法&#xff1a;TODAY() 2、NOW函数 返回当前电脑系统显示的日期和时间 NOW函数&#xff1a;表示返…

案例分析篇11:一篇文章搞定UML设计考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

【linux线程(一)】什么是线程?怎样操作线程?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程 1. 前言2. 什么是线…

阻塞队列学习

1、什么是阻塞队列&#xff1f; 顾名思义&#xff0c;就是支持阻塞的队列&#xff0c;相比于其他的队列&#xff0c;阻塞队列支持以下特性&#xff1a; 队列为空的时候&#xff0c;获取元素的线程会等待队列变为非空。队列为满的时候&#xff0c;存储元素的线程会等待队列可以…