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

news2024/11/23 11:42:17

表格组件是 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
  }
}

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

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

相关文章

2024/3/11打卡分巧克力(第8届蓝桥杯省赛)——二分

题目 儿童节那天有 K 位小朋友到小明家做客。 小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 N 块巧克力&#xff0c;其中第 i 块是 HiWi 的方格组成的长方形。 为了公平起见&#xff0c;小明需要从这 N 块巧克力中切出 K 块巧克力分给小朋友们。 切出的巧克力需要满足&…

亚马逊热卖SN-48B压线钳 2.8/4.8/6.3 300PCS插簧端子压接工具

品牌&#xff1a;SANJIANG 型号&#xff1a;SN-48B(橙色手柄)300PCS 颜色分类&#xff1a;SN-48B(橙色手柄),SN-48B(红蓝双色手柄),300PCS插簧端子,SN-48B(橙色手柄)300PCS,SN-48B(红蓝双色手柄)300PCS SN-48B 300PCS 0.5mm的电线尺寸应与0.5mm的连接器匹配&#xff0c;然后…

软考高级:统一过程阶段和工作流概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

使用Python的zipfile模块巧解Word批量生成问题

目录 一、zipfile模块简介 二、Word文档的结构 三、使用zipfile模块生成Word文档 创建ZIP文件 添加文件到ZIP中 生成Word文档内容 批量生成Word文档 四、案例与代码实现 五、总结 在日常办公和自动化任务中&#xff0c;批量生成Word文档是一个常见的需求。然而&am…

算法练习-牛牛的快递(思路+流程图+代码)

难度参考 难度&#xff1a;简单 分类&#xff1a;分支控制 难度与分类参考题目来源网站。 题目 链接&#xff1a;牛牛的快递__牛客网 (nowcoder.com) 来源&#xff1a;牛牛的快递__牛客网 (nowcoder.com) 牛牛正在寄快递&#xff0c;他了解到快递在 1kg 以内的按起步价…

vue上传文件夹+上传文件vue-simple-uploader

vue上传文件夹上传文件vue-simple-uploader 使用插件 在main.js引入 import uploader from vue-simple-uploaderVue.use(uploader);<el-dialog title"上传文件" :visible.sync"dialogFileVisible" width"50%" :before-close"handleFil…

《安富莱嵌入式周报》第334期:开源SEM扫描电子显微镜,自制编辑器并搭建嵌入式环境,免费产品设计审查服务,实用电子技术入门,USB资料汇总,UDS统一诊断

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV1om411Z714/ 《安富莱嵌入式周报》第334期&#xff1a;开源SEM…

Primavera P6 – 从资源池中分配专属项目资源

前言 在使用P6的资源分配功能中&#xff0c;尝试使用 Primavera P6 的搜索功能来解决此问题仍然会导致每次尝试向活动添加资源时都会搜索单个资源。 这很费力&#xff0c;并不能节省太多的时间和精力。 这个简单、省时的技巧为使用 Primavera P6 的项目管理从业者提供了解决此…

前端之用HTML弄一个古诗词

将进酒 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>将进酒</title><h1><big>将进酒</big> 君不见黄河之水天上来</h1><table><tr><td ><img…

记一次特殊的渗透经历

起因 搞安全的小伙伴们应该知道&#xff0c;干我们这行老是会碰到一些奇奇怪怪的问题和需求&#xff0c;比如上次&#xff0c;某客户领导说让我给他找个会渗透的小伙子来&#xff0c;有个比较棘手的业务。我一听&#xff0c;心想&#xff1a;好嘛&#xff0c;这私活不就来了嘛…

python语音处理常见开源库介绍

在 Python 中&#xff0c;有几个著名的开源语音处理库&#xff0c;它们提供了丰富的工具和功能&#xff0c;用于处理和分析语音数据。以下是几个流行的 Python 语音处理库及其安装方法、特点和优势&#xff1a; 1. librosa 安装 pip install librosa特点 - **音频处理*…

【图像超分】论文精读:efficient sub-pixel convolutional neural network (ESPCN)

文章目录 前言Abstract1.Introduction1.1. Related Work1.2. Motivations and contributions 2. Method2.1. Deconvolution layer2.2. Efficient sub-pixel convolution layer 3. Experiments3.1. Datasets3.2. Implementation details3.3. Image super-resolution results3.3.…

羊大师揭秘,羊奶养生秘籍大公开

羊大师揭秘&#xff0c;羊奶养生秘籍大公开 羊奶&#xff0c;这个古老的营养佳品&#xff0c;近年来因其丰富的营养价值和独特的养生功效而受到越来越多人的青睐。今天&#xff0c;就让小编羊大师一起揭开羊奶养生的神秘面纱&#xff0c;让你每天都充满活力&#xff01; 一、…

elementui el-table表格自动循环滚动【超详细图解】

效果如图 1. 当表格内容超出时&#xff0c;自动滚动&#xff0c;滚动到最后一条之后在从头滚动。 2. 鼠标移入表格中&#xff0c;停止滚动&#xff1b;移出后&#xff0c;继续滚动。 直接贴代码 <template><div><div class"app-container"><e…

数据持久化(Json)

平常写代码的时候就应该习惯性的加【SerializeField】System.Serializable 如果是公有变量可以不加 泛型就要用<> JSon语法 之后Lua热更新的学习也会使用Sublime Text Excel转Json https://www.bejson.com/json/col2json 记得检查一下&#xff0c;得到的Json格式是否…

再写“罗马数字字符串转整”

输入有效的罗马数字字符串&#xff0c;返回对应的十进制整数(字符大小写均可)。 (笔记模板由python脚本于2024年03月12日 16:01:08创建&#xff0c;本篇笔记适合对罗马数字感兴趣且有一定编程基础的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.…

和泓海棠府——与阳光大海约会 悦享惬意生活

海南三亚海棠湾 四季如春的梦想在这里即可实现和泓海棠府 与阳光大海约会 悦享惬意生活 如果在三亚有一套房 你就可以把父母接过来一起住 尽己所能让老人圆一个海居梦 带着孩子一起在园林里探索自然 陪孩子度过每一个有趣的海边假期 你也可以随时沿着会唱歌的沙滩迎风漫…

爬虫技术必学之用强大的正则提取一切你想要的内容!JavaScript正则表达式提取网站高价值信息【附代码】!

前面给大家介绍过&#xff0c;本人既精通GIS开发全栈技术&#xff0c;也精通爬虫技术&#xff0c;对人工智能算法也比较熟悉。这些技术我会一一给大家讲解。 今天&#xff0c;咱们的主题是给大家通过一个案例讲解一下正则表达式的强大之处。当我们用爬虫获取网页的源码或内容时…

波司登:品牌引领 从中国第一迈向“全球领先”

专注羽绒服领域48年&#xff0c;波司登不断夯实品牌核心竞争力&#xff0c;推进新型工业化&#xff0c;培育新质生产力&#xff0c;扛起新时代企业责任担当—— 波司登&#xff1a;品牌引领 从中国第一迈向“全球领先” 入选工信部首批“工业图强”企业史志优秀案例&#xff0c…

【数仓】通过Flume+kafka采集日志数据存储到Hadoop

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用&#xff08;集群配置&#xff09;【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置【数仓】kafka软件安装及集群配置【数仓】flume软件安…