vue3 基于element plus对el-pagination进行二次封装

vue3 基于element plus对el-pagination进行二次封装

1、前言

在vue3项目中,如果每个列表页都敲一遍分页方法,显然是不合理的,那么,下面我将基于element plus对el-pagination进行二次封装,使用vue3语法糖格式,废话不多说,开干。

2、在components文件夹中新建pagination.vue文件

javascript 复制代码
<template>
  <div class="pagination">
    <el-pagination 
    	background 
    	:layout="layout" 
    	:pager-count="pagerCount" 
    	:page-sizes="pageSizes" 
    	:page-size="pageSize"
        :total="pageTotal" 
        v-model:currentPage="currentPages" 
        @size-change="sizeChange" 
        @current-change="current"
        @prev-click="prev" 
        @next-click="next"
    ></el-pagination>
  </div>
</template>
 
<script setup>
import { ref, reactive, onMounted } from "vue"
const props = defineProps({
  pageTotal: {
    type: Number,
    default: 0, //总页数
  },
  pagerCount: {
    type: Number,
    default: 5, //如果页数很多大概展示的页码
  },
  layout: {
    type: String,
    default: "total,sizes, prev, pager, next, jumper, ->, slot", //分页组件会展示的功能项
  },
  pageSizes: {
    type: Array,
    default: () => {
      return [10, 20, 50, 100] //指定分页展示条数
    },
  },
  currentPage: {
    type: Number,
    default: 1, //指定跳转到多少页
  },
  pageSize: {
    type: Number,
    default: 10, //每页展示的条数,根据自己实际,且会带入请求
  },
  pageNum: {
    type: Number,
    default: 1, //第几页数据,根据自己实际,且会带入请求
  },
})

let currentPages = ref(props.currentPage)
let pageData = reactive({
  pageSize: props.pageSize,
  pageNum: props.pageNum,
})

const emit = defineEmits(["pageFunc"])

//选择每页显示数量 Change page size
const sizeChange = (val) => {
  pageData.pageSize = val
  emit("pageFunc", pageData)
}
//选择某一页
const current = (val) => {
  pageData.pageNum = currentPages.value
  emit("pageFunc", pageData)
}
//上一页
const prev = () => {
  pageData.pageNum = pageData.pageNum - 1
  emit("pageFunc", pageData)
}
//下一页
const next = () => {
  pageData.pageNum = pageData.pageNum + 1
  emit("pageFunc", pageData)
}
</script>
 
<style scoped lang="less">
.pagination {
  width: 100%;
  background: #fff;
  padding: 5px 0;
  text-align: center;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
}
</style>

3、在组件内使用分页

javascript 复制代码
<template>
	<pagination 
		v-show="totalRows > 0" 
		:pageNum="queryParams.pageNum" 
		:pageSize="queryParams.pageSize" 
		:pageTotal="totalRows" 
		@pageFunc="pageFunc" 
	/>
</template>
<script setup>
import { reactive, ref } from 'vue'
// 引入分页组件
import Pagination from '@/components/pagination.vue'
// 查询参数
const queryParams = reactive({
	pageNum: 1,
	pageSize: 10,
	organId: '',
	projectName: '',
	projectStatus: '',
	projectLeader: '',
})
// 项目总条数
const totalRows = ref(0)
// 分页回调
const pageFunc = (data) => {
	queryParams.pageSize = data.pageSize
	queryParams.pageNum = data.pageNum
	// 触发获取项目数据函数
	getProjectList()  
}
</script>
相关推荐
gis开发之家29 分钟前
《Vue3 从入门到大神35篇》Vue3 源码详解(五):effect 依赖收集原理——track 与 trigger 是如何工作的?
javascript·typescript·前端框架·vue3·vue3源码
橘子星2 小时前
我一个前端切图仔,凭什么能在浏览器里跑大模型?
前端·javascript·前端框架
半个落月2 小时前
用 LangChain JS 做可控写作实验:理解温度参数、提示词与异步调用
javascript·人工智能·后端
观远数据2 小时前
Excel到数据资产池:文件数据入湖的治理规范怎么建
前端·javascript·excel
CoderWeen2 小时前
我写了个能一步步点着看的 Dijkstra 可视化项目(Vue3 + Leaflet + Generator)
前端·javascript·vue.js
无人生还2 小时前
第 1 篇:从 Vue3 到 React 的思维转变
前端·vue.js·react.js
就业发动机3 小时前
我用 Tauri 做了一个约 1.5 MB 的开源屏幕标注工具:MarkerOn
vue.js·rust
爱分享的程序猿-Clark3 小时前
【前端分享】vue开发项目,如何实现 从A页面跳转到B页面,并传值!
前端·javascript·vue.js
冰暮流星3 小时前
javascript之String方法介绍
开发语言·javascript·ecmascript
徐小夕3 小时前
花了3天,我写了一款开源AI公众号编辑器
前端·vue.js·github