详细分析Element Plus的el-pagination基本知识(附Demo)

news2025/2/28 6:26:50

目录

  • 前言
  • 1. 基本知识
  • 2. Demo
  • 3. 实战

前言

需求:从无到有做一个分页并且附带分页的导入导出增删改查等功能

前提一定是要先有分页,作为全栈玩家,先在前端部署一个分页的列表

相关后续的功能,是Java,推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

1. 基本知识

主要是用于在数据量较大的情况下,将数据分成多个页面显示

通过分页,可以避免一次性加载大量数据导致的性能问题,并且可以使用户更方便地浏览数据

在这里插入图片描述

怎样才能做到这样一个页面,需要先了解一些基本的知识,可以提前去官网预热下:官网补充说明

需要注意的点(每一步都比较重要,不然会丢失数据,查询不到)

  • 绑定值current-pagepage-size 需要与组件中的数据绑定,以确保分页状态和显示的一致性
  • 事件处理:需要处理分页组件的 current-changesize-change 事件,以便在用户改变当前页或每页条目数时更新数据
  • 数据同步:分页状态变化时,需要确保组件显示的数据和分页控件保持同步

对应的属性说明:

  • current-page:当前页数,类型为 Number
  • page-size: 每页显示条目个数,类型为 Number
  • total:总条目数,类型为 Number
  • page-sizes:显示个数的选择器,类型为 Array
  • layout:组件布局,子组件名用逗号分隔
    常用的子组件有 prev, pager, next, jumper, total, sizes, ->, slot
  • small: 小型分页样式,类型为 Boolean,默认为false

相关的事件设置有如下:

  • current-change:当前页变化时触发,返回当前页数。
  • size-change:每页条目数变化时触发,返回新的每页条目数

2. Demo

基本的Demo主要以形式展示为主

示例 1:基本使用

<template>
  <el-pagination
    :total="100"
    :page-size="10"
    v-model:current-page="currentPage"
    layout="prev, pager, next"
    @current-change="handlePageChange"
  />
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const currentPage = ref(1)

const handlePageChange = (page: number) => {
  console.log(`Current page changed to: ${page}`)
}
</script>

示例 2:带有每页条目数选择器

<template>
  <el-pagination
    :total="1000"
    v-model:current-page="currentPage"
    v-model:page-size="pageSize"
    :page-sizes="[10, 20, 30, 50]"
    layout="sizes, prev, pager, next"
    @size-change="handleSizeChange"
    @current-change="handlePageChange"
  />
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const currentPage = ref(1)
const pageSize = ref(10)

const handlePageChange = (page: number) => {
  console.log(`Current page changed to: ${page}`)
}

const handleSizeChange = (size: number) => {
  console.log(`Page size changed to: ${size}`)
}
</script>

示例 3:显示总条目数和跳转页码

<template>
  <el-pagination
    :total="500"
    v-model:current-page="currentPage"
    layout="total, prev, pager, next, jumper"
    @current-change="handlePageChange"
  />
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const currentPage = ref(1)

const handlePageChange = (page: number) => {
  console.log(`Current page changed to: ${page}`)
}
</script>

示例 4:使用小型分页样式

<template>
  <el-pagination
    :total="200"
    v-model:current-page="currentPage"
    layout="prev, pager, next"
    :small="true"
    @current-change="handlePageChange"
  />
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const currentPage = ref(1)

const handlePageChange = (page: number) => {
  console.log(`Current page changed to: ${page}`)
}
</script>

示例 5:响应式分页按钮数量

<template>
  <el-pagination
    :total="300"
    v-model:current-page="currentPage"
    :pager-count="pagerCount"
    layout="prev, pager, next"
    @current-change="handlePageChange"
  />
</template>

<script lang="ts" setup>
import { ref, computed } from 'vue'

const currentPage = ref(1)
const pagerCount = computed(() => document.body.clientWidth < 768 ? 5 : 7)

const handlePageChange = (page: number) => {
  console.log(`Current page changed to: ${page}`)
}
</script>

3. 实战

可以定义新的一套模版

<template>
  <el-pagination
    :background="true"
    :page-sizes="[5, 10, 30, 50]"
    :pager-count="pagerCount"
    :total="total"
    v-show="total > 0"
    v-model:current-page="currentPage"
    v-model:page-size="pageSize"
    class="float-right mb-15px mt-15px"
    layout="total, sizes, prev, pager, next, jumper"
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
  />
</template>

<script lang="ts" setup>
import { computed, watchEffect, ref } from 'vue'

defineOptions({ name: 'Pagination' })

// 定义组件接收的 props
const props = defineProps({
  // 总条目数
  total: {
    required: true,
    type: Number
  },
  // 当前页数,默认为 1
  page: {
    type: Number,
    default: 1
  },
  // 每页显示条目个数,默认为 20
  limit: {
    type: Number,
    default: 20
  },
  // 最大页码按钮数,移动端默认值为 5,桌面端为 7
  pagerCount: {
    type: Number,
    default: document.body.clientWidth < 992 ? 5 : 7
  }
})

// 定义组件发出的事件
const emit = defineEmits(['update:page', 'update:limit', 'pagination'])

// 计算属性,用于双向绑定 currentPage 和 pageSize
const currentPage = computed({
  get() {return props.page},
  set(val) {emit('update:page', val)}
})
const pageSize = computed({
  get() {return props.limit},
  set(val) {emit('update:limit', val)}
})

// 处理每页条目数变化的函数
const handleSizeChange = (val) => {
  // 如果修改后当前页超过最大页面,则跳转到第一页
  if (currentPage.value * val > props.total) {
    currentPage.value = 1
  }
  emit('pagination', { page: currentPage.value, limit: val })
}

// 处理当前页变化的函数
const handleCurrentChange = (val) => {
  emit('pagination', { page: val, limit: pageSize.value })
}
</script>

<style>
/* 可选样式 */
.float-right {
  float: right;
}
.mb-15px {
  margin-bottom: 15px;
}
.mt-15px {
  margin-top: 15px;
}
</style>

之后通过这个模版 直接引用(实战提取的Demo)

<template>
  <!-- 分页 -->
  <Pagination
    :total="total"
    v-model:page="queryParams.pageNo"
    v-model:limit="queryParams.pageSize"
    @pagination="getList"
  />
</template>

<script setup lang="ts">
import { GoodsStoragePlanApi } from '@/api/dangerous/goodsstorageplan'
import { ref, reactive, onMounted } from 'vue'

const loading = ref(true)
const list = ref([])
const total = ref(0)
const queryParams = reactive({
  pageNo: 1,
  pageSize: 10,
  createTime: [],
})

/** 查询列表 */
const getList = async () => {
  loading.value = true
  try {
    const data = await GoodsStoragePlanApi.getGoodsStoragePlanPage(queryParams)
    list.value = data.list
    total.value = data.total
  } finally {
    loading.value = false
  }
}

/** 初始化 **/
onMounted(() => {
  getList()
})
</script>

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

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

相关文章

rockchip linux sdk指定编译配置文件

SDK&#xff1a;rk3568_linux4.19_V1.4.0 硬件平台&#xff1a;RK3566 一、指定板级配置文件 板级配置文件在<SDK>/device/rockchip/rk3566_rk3568目录下。 1、方法1 ./build.sh后⾯加上板级配置⽂件&#xff0c;例如&#xff1a; ./build.sh /device/rockchip/rk3…

STM32微控制器库指南:函数特性、应用范围与实践

在嵌入式系统的设计和开发中&#xff0c;STM32系列微控制器因其卓越的处理能力和多样的外设选项而广受推崇。STM32库函数作为开发流程中不可或缺的工具&#xff0c;扮演着至关重要的角色。本文将详细阐述STM32库函数的主要特性、应用场景及其在实际开发中的应用实例。 什么是ST…

Golang | Leetcode Golang题解之第168题Excel表列名称

题目&#xff1a; 题解&#xff1a; func convertToTitle(columnNumber int) string {ans : []byte{}for columnNumber > 0 {columnNumber--ans append(ans, Abyte(columnNumber%26))columnNumber / 26}for i, n : 0, len(ans); i < n/2; i {ans[i], ans[n-1-i] ans[n…

JavaScript基础部分知识点总结(Part3)

函数的概念 1. 函数的概念 在JS 里面&#xff0c;可能会定义非常多的相同代码或者功能相似的代码&#xff0c;这些代码可能需要大量重复使用。虽然for循环语句也能实现一些简单的重复操作&#xff0c;但是比较具有局限性&#xff0c;此时我们就可以使用JS 中的函数。函数&…

RabbitMQ实践——交换器(Exchange)和绑定(Banding)

大纲 direct型交换器默认交换器命名交换器 fanout型交换器topic型交换器headers型交换器 RabbitMQ在概念上由三部分组成&#xff1a; 交换器&#xff08;Exchange&#xff09;&#xff1a;负责接收消息发布者发布消息的结构&#xff0c;同时它会根据“绑定关系”&#xff08;Ba…

PySide(PyQt)的特殊按钮(互锁、自锁、独占模式)

界面图&#xff1a; Qt Designer中创建窗口&#xff0c;放置一个QGroupBox&#xff0c;命名为btnStation&#xff0c;这就是自定义的按钮站&#xff0c;按钮站里放置6个按钮。自锁按钮相当于电器中的自锁功能的按钮&#xff0c;每按一次状态反转并保持不变。独占按钮也是自锁功…

使用asyncua模块的call_method方法调用OPC UA的Server端方法报错:asyncio.exceptions.TimeoutError

使用asyncua模块的call_method方法调用OPC UA的Server端方法报错&#xff1a;asyncio.exceptions.TimeoutError 报错信息如下&#xff1a; Traceback (most recent call last): asyncio.run(main()) File “D:\miniconda3\envs\py31013\lib\asyncio\runners.py”, line 44, in…

Python酷库之旅-比翼双飞情侣库(17)

目录 一、xlwt库的由来 1、背景和需求 2、项目启动 3、功能特点 4、版本兼容性 5、与其他库的关系 6、示例和应用 7、发展历史 二、xlwt库优缺点 1、优点 1-1、简单易用 1-2、功能丰富 1-3、兼容旧版Excel 1-4、社区支持 1-5、稳定性 2、缺点 2-1、不支持.xls…

什么是无限铸币攻击?它是如何运作的?

一、无限铸币攻击解释 无限铸币攻击是指攻击者操纵合约代码不断铸造超出授权供应限制的新代币。 这种黑客行为在去中心化金融 (DeFi) 协议中最为常见。这种攻击通过创建无限数量的代币来损害加密货币或代币的完整性和价值。 例如&#xff0c;一名黑客利用了 Paid 网络的智能…

第三十三章 添加和使用自定义标题元素

文章目录 第三十三章 添加和使用自定义标题元素SOAP 标头元素简介如何表示 SOAP 标头 第三十三章 添加和使用自定义标题元素 本主题介绍如何添加和使用自定义 SOAP 标头元素。 有关发生故障时添加标头元素的信息&#xff0c;请参阅 SOAP 故障处理。 WS-Addressing 标头元素在…

Java swing JTable 示例

代码&#xff0c; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable;public class Mylmlk {public static void main(String[] agrs){JFrame framenew JFrame("学生成绩表");frame.setSize(500,2…

it职业生涯规划系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;职业介绍管理&#xff0c;答题管理&#xff0c;试题管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;在线答题&#xff0…

QT基础 - QMainWindow主窗口

目录 零. 简介 一. 菜单栏 二. 工具栏 三. 状态栏 四. 可停靠区域 五. 总结 零. 简介 QMainWindow 是 Qt 中用于构建主窗口的类。 它通常包含以下几个主要部分&#xff1a; 菜单栏&#xff1a;用于提供各种操作选项。工具栏&#xff1a;放置常用的操作按钮。中心区域&…

DAMA学习笔记(二)-数据治理

1.引言 数据治理&#xff08;Data Governance&#xff0c;DG&#xff09;的定义是在管理数据资产过程中行使权力和管控&#xff0c;包括计划、监控和实施。在所有组织中&#xff0c;无论是否有正式的数据治理职能&#xff0c;都需要对数据进行决策。建立了正式的数据治理规程及…

【STM32-ST-Link】

STM32-ST-Link ■ ST-Link简介■ ST-Link驱动的安装。■ ST-Link编程软件(MDK)配置。■ ST-Link固件升级方法 ■ ST-Link简介 由于德产 J-LINK 价格非常昂贵&#xff0c; 而国产 J-LINK 因为版权问题将在万能的淘宝销声匿迹。 所以我们有必要给大家介绍 JTAG/SWD 调试工具中另…

排序算法及源代码

堆排序&#xff1a; 在学习堆之后我们知道了大堆和小堆&#xff0c;对于大堆而言第一个节点就是对大值&#xff0c;对于小堆而言&#xff0c;第一个值就是最小的值。如果我们把第一个值与最后一个值交换再对最后一个值前面的数据重新建堆&#xff0c;如此下去就可以实现建堆排…

【Java】已解决java.util.concurrent.TimeoutException异常

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决java.util.concurrent.TimeoutException异常 一、问题背景 java.util.concurrent.TimeoutException是Java并发编程中常见的一个异常&#xff0c;它通常发生在使用Future或Future…

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会,爱慕向来短暂,失去才是唯一出路

202483读书笔记|《把你写进诗歌里》——人生是一场不知何时散场的约会&#xff0c;爱慕向来短暂&#xff0c;失去才是唯一出路 摘录 《把你写进诗歌里&#xff08;2020年度中国优秀诗歌&#xff09;》&#xff0c;作者上官文露。并不惊艳&#xff0c;中英文双语对照的一本诗集&…

OpenGL3.3_C++_Windows(13)

demo演示 demo演示 面剔除 当我们都以逆时针绘制三角形顶点&#xff0c;那么从三角形的背面看就是顺时针&#xff0c;面剔除正是根据这个原理&#xff0c;glEnable&#xff08;&#xff09;首先启用&#xff0c;glCullFace&#xff08;&#xff09;改变需要剔除的面类型&#…

【Java面试】二十一、JVM篇(中):垃圾回收相关

文章目录 1、类加载器1.1 什么是类加载器1.2 什么是双亲委派机制 2、类装载的执行过程&#xff08;类的生命周期&#xff09;3、对象什么时候可以被垃圾回收器处理4、JVM垃圾回收算法4.1 标记清除算法4.2 标记整理算法4.3 复制算法 5、分代收集算法5.1 MinorGC、Mixed GC、Full…