vue实现通用分页控件,支持前端分页、后端分页。

简介: vue实现通用分页控件,支持前端分页、后端分页。

分页这个功能可以说在开发管理系统中是必不可少的东西

为何分页?

答:因为数据量大,不可能全部给你展示,全部展示页面加载慢,且要不断下滑查看,体验差

谁做分页?

答:对于数据增长比较频繁的,比如订单列表通常后端来做这个分页;对于数据量增长缓慢数据量不大的,比如商品列表、分类列表、员工列表,前端来做分页是不错的选择

分页如何做?

答:

后端实现

通常后端提供一个接口,需要前端传入,页码,每页显示数据条数等参数,后端根据该参数分页查询返回数据。前端需要更新列表数据渲染,那么前端分页控件就只需要调用接口(动态传参),如图每个按钮绑定页码值等参数,点击则调用接口,如何知道有多少页?这个后端接口会做统计查询返回给前端的,前端计算:总数/每页展示数得到总页数,并进行渲染按钮

前端实现

后端会把所有数据全部返回,前端需要做的就是把全部数据列表做分割,按页展示,分页控件分页函数根据页码等参数截取列表的数据

实现这个通用分页控件:

我这里是基于el-pagination分页组件进行封装的一个精简版大家可以按需扩展。

需求:既能兼容后端分页,又可以在前端实现分页

1.自定义属性

如果是后端做分页的话,就传递count属性值这个属性代表总数据量,需要用来计算总页数

如果是前端做分页,就传递itemList属性值,这个属性表示总数据数组,根据这个数组的长度可以计算页数,根据页码可以对数组进行截取并把截取的单页数据通过自定义事件传递给父组件,父组件更新列表数据渲染

const props = defineProps({
    itemList: {//数据列表
        type: Array,
        default: null
    },
    count: {//有值则分页功能后端实现
        type: Number,
        default: null
 
    },
 
})

2.自定义事件

通过自定义事件可以把页码或者是分页后的数据传递给父组件

3.示例代码

分页控件完整代码:

<script lang="ts" setup>
import { ref,onBeforeUpdate} from 'vue'
 
const emit = defineEmits(['updateItemList']);
// 接收父组件传递的数据()
const props = defineProps({
    itemList: {//数据列表
        type: Array,
        default: null
    },
    count: {//有值则分页功能后端实现
        type: Number,
        default: null
 
    },
 
})
//--------------------------------------------------------数据分页------------------------------------------------------------------
const itemList = ref([])//待分页全部数据
const limitItemList = ref([])//分页后数据
const currentPage = ref(1); // 当前页码默认
const pageSize = ref(10); // 每页显示数量
//全部数据按每页展示数量、页码截取
const displayedItemList = () => {
    const startIndex = (currentPage.value - 1) * pageSize.value;
    const endIndex = startIndex + pageSize.value;
    limitItemList.value = itemList.value.slice(startIndex, endIndex);
};
 
//选中页设置为当前页
function changePage(page:number) {
    currentPage.value = page
  
}
//------------------------------------------------------------------------------------------------------------------------------------
 
//预处理
onBeforeUpdate(() => {
    if (props.count != null&&props.itemList==null) {
        emit('updateItemList', currentPage.value)
        return
    }
        itemList.value = props.itemList
        displayedItemList()
        emit('updateItemList', limitItemList.value)
})
</script>
<template>
    <div style="display: flex;justify-content: center;margin-top: 10px;">
        <el-pagination background="blue" layout="prev, pager, next"
            :total="props.count == null ? itemList.length : props.count"
            :current-page.sync="currentPage"
            :page-size="pageSize" 
            @current-change="changePage" 
            prev-text="上一页" 
            next-text="下一页">
        </el-pagination>
    </div>
</template>
1.如果后端做分页

要传递总数据量,以及触发自定义事件(在该自定义事件的回调函数可以进行接口调用更新数据)

 <div>
      <Limit :count="count" @updateItemList="getItemList"></Limit>
    </div>
//接收分页组件传递的页码
const getItemList = async (page:number) => {
  console.log('接收:')
  console.log(page)
  if (page != null) {
    loadingItemList.value = true
    //分页查询接口
    const res = await orderListApi(activeName_order_status.value, page)//传递页码
    orderList.value = res.data.data
    count.value = parseInt(res.data.count)
   
  }
}
2.如果前端做分页

要传递所有数据的数组

 <div>
      <Limit :itemList="itemList" @updateItemList="getLimitItemList" />
 </div>
//接收分页组件分页后的每页数据
const getLimitItemList = (displayedItemList: Array<Object>) => {
  console.log("接收:")
  console.log(displayedItemList)
  limitItemList.value = displayedItemList
}


目录
相关文章
|
5天前
|
缓存 安全 JavaScript
前端安全:Vue应用中防范XSS和CSRF攻击
【4月更文挑战第23天】本文探讨了在Vue应用中防范XSS和CSRF攻击的重要性。XSS攻击通过注入恶意脚本威胁用户数据,而CSRF则利用用户身份发起非授权请求。防范措施包括:对输入内容转义、使用CSP、选择安全的库;采用Anti-CSRF令牌、同源策略和POST请求对抗CSRF;并实施代码审查、更新依赖及教育团队成员。通过这些实践,可提升Vue应用的安全性,抵御潜在攻击。
|
3天前
|
前端开发 JavaScript Java
前端与后端:构建现代Web应用的双翼
前端与后端:构建现代Web应用的双翼
|
9天前
|
NoSQL JavaScript 前端开发
报错场景:ant design vue前端登录时,输入的验证码是对的,但是一直提上验证码错误,登录不进去 报错信息(Error in execution; nested exception)
报错场景:ant design vue前端登录时,输入的验证码是对的,但是一直提上验证码错误,登录不进去 报错信息(Error in execution; nested exception)
18 0
|
16天前
|
小程序 前端开发 JavaScript
小程序全栈开发:前端与后端的完美结合
【4月更文挑战第12天】本文介绍了小程序全栈开发,涵盖前端和后端的关键点。前端使用WXML和WXSS进行页面结构和样式设计,JavaScript处理逻辑及组件使用;后端采用Node.js等语言处理业务逻辑、数据库设计和API接口开发。前端与后端通过数据交互实现结合,采用前后端分离模式,支持跨平台运行。调试测试后,提交微信审核并上线运营。掌握前端后端结合是小程序成功的关键。
|
16天前
|
Web App开发 移动开发 运维
跨域解决方案[前端+后端]
跨域解决方案[前端+后端]
25 0
|
17天前
|
JavaScript 前端开发 关系型数据库
旅游规划助手:结合Vue的交云性设计和Python的强大后端功能
【4月更文挑战第11天】本文探讨了如何使用Vue.js和Python(Flask或Django)构建旅游规划助手应用,简化旅行规划。首先,确保安装了Python、Node.js、数据库系统和Git。接着,介绍如何用Python搭建后端API,分别展示了Flask和Django的例子。然后,利用Vue.js初始化前端项目,结合Vuex和Vue Router构建用户界面。最后,通过Axios实现前端与后端的数据通信。这样的架构有利于团队协作和代码维护,便于扩展应用功能。
|
17天前
|
JavaScript 前端开发 API
游戏开发入门:Python后端与Vue前端的协同工作方式
【4月更文挑战第11天】使用Python后端(Flask或Django)和Vue.js前端开发游戏变得流行,能提高开发效率和可维护性。本文指导如何构建这样的项目,包括设置环境、创建虚拟环境、搭建后端API及前端Vue组件,强调前后端协作和API接口的重要性。这种架构促进团队合作,提升代码质量和游戏体验。
|
8月前
|
Web App开发 前端开发 JavaScript
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
95 0
|
8月前
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-地图单线程配置
前端学习笔记202305学习笔记第二十三天-地图单线程配置
65 0
前端学习笔记202305学习笔记第二十三天-地图单线程配置
|
8月前
|
前端开发 API
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-react-redux的工作流程
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-react-redux的工作流程
55 0