百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Vue实战028:功能完善的分页组件实现详解

bigegpt 2024-08-29 11:25 3 浏览

分页在网站中用的比较频繁,现在很多人都喜欢使用第三方组件来快速实现功能,却忽略了其实现原理。这几天抽时间写了个分页组件,功能比较完善,主要包含以下功能:

1,总页数和数据条数

2,可调整显示页码的个数

3,上下和首尾页切换

4,可调整每页显示数据的个数

5,输入指定页面跳转(包括键盘事件(Enter键直接跳转)),限制数据最大不得超过显示页数。

6,当前页为首个或者最后一个时禁止首尾页和上下页选项

创建模板

首先我们还是先来创建HTML模板,模板中:class="{'disabled': current == 1}"是绑定的DOM类,@click="setCurrent(1)绑定的是点击事件,@keyup.enter="submit($event)"绑定的是键盘事件,:style="{width:'28px'}"绑定的是样式。

<template>

<nav>

<span class="pageinfo">共<em>{{pagesum}}</em>页/{{total}}条</span>

<ul class="pagesumnav">

<li :class="{'disabled': current == 1}" @click="setCurrent(1)">首页</li>

<li :class="{'disabled': current == 1}" @click="setCurrent(current-1)">上一页</li>

<li v-for='(num,id) in grouplist' :key='id' @click="setCurrent(num)" :class="{'actived':(current==num)}" :style="{width:'28px'}">{{num}}</li>

<li :class="{'disabled': current == pagesum}" @click="setCurrent(current+1)">下一页</li>

<li :class="{'disabled': current == pagesum}" @click="setCurrent(pagesum)">尾页</li>

</ul>

<div class="pagesumjump">

<select class="pageSelect" @change="pageNum">

<option v-for="(num,ide) in dispaly" :key="ide">{{num}}条/页</option>

</select>

<input type="text" v-model="jumpDefault" @keyup.enter="submit($event)" >

<span @click="jumpTo">跳转</span>

</div>

</nav>

</template>

CSS样式编写

这里就不多阐述了,自己看代码吧,这个应该难不倒大家,主要说下动态的样式:class="{'actived':(current==num)}",在模板中我们绑定了动态样式actived,主要是为了实现当我们点击对应的页码时将背景色及字体颜色更换,让用户一眼就能知道当前在哪页,提供更好的用户体验。还有一个就是:class="{'disabled': current == 1}"样式,这个是用来禁用鼠标事件的。

<style scoped>

.pageinfo em{

font-style: normal;

color:#CA0C16;

padding:2px;

}

.pagesumjump .pageSelect{

padding:4px;

height:29px;

border:none;

outline: none;

background-color:#ccc;

}

.pagesumjump input{

text-align: center;

width:30px;

height: 29px;

margin-left: 3px;

}

.pagesumjump span{

margin-left: 5px;

padding:0 6px;

background-color:#ccc;

border-radius: 3px;

cursor: pointer;

height: 29px;

line-height: 29px;

display: inline-block;

}

.pagesumjump span:hover{

background-color: #CA0C16;

color:#fff;

}

.disabled{

pointer-events: none;

}

.actived{

background-color: #CA0C16;

color:#fff;

}

nav{

margin-top:10px;

display: flex;

justify-content: center;

align-items: center;

}

.pagesumnav{

display: flex;

justify-content: center;

align-items: center;

}

.pagesumnav li{

display: inline-block;

border:1px solid #ccc;

border-radius: 2px;

padding:4px;

margin:0 2px;

cursor: pointer;

-webkit-user-select:none;

-moz-user-select:none;

-ms-user-select:none;

user-select:none;

}

.pagesumnav li:hover{

background-color: #CA0C16;

color:#fff;

}

</style>

功能逻辑实现(重点)

下面是功能的实现,要实现分页功能,我们需要知道我们共有多少条数据,每页显示多少条数据,有多少个分页,显示多少个分页,当前在哪等,给父级修改的我们只需要提供这几个参数:数据总条数、每页显示条数、显示页码数,同时我们需要定义当前页参数(默认为1),显示条数(默认10条),跳转页(默认第1页)

props:{

total:{// 数据总条数

type:Number,

default:10,

},

dispaly:{// 每页显示条数

type:Array,

default(){

return [10,20,30,50]

}

},

pagegroup:{// 显示页码个数

type:Number,

default:5,

},

},

data(){

return{

current: 1,//当前页码

currentSize:this.dispaly[0],//当前显示条数,默认10条

jumpDefault:1, //跳转默认值

}

}

拿到以上几个参数我们开始计算其他数据,接着我们需要知道总共有多少页,根据当前页显示所需的页码。当总页数小于显示页码数时直接显示即可,当当总页数大于显示页码数时我们就需要对当前页进行判断:

当前页在显示页中间的左边时将中心位置移至中间(即处理最前面几个值),当当前页在显示页中间的右边时将中心位置移至中间(即处理最后几个值的)。

computed:{

pagesum(){ // 根据数据的条数和每页显示数量算出总页数,如果没有则为1 ;

return Math.ceil(this.total/this.currentSize) || 1

},

grouplist(){ //获取分页码

var len=this.pagesum

var count=Math.floor(this.pagegroup/2)

var center =this.current

var temp=[]

if(len<this.pagegroup){

while(len--){

temp.push(this.pagesum-len)

}

return temp

}

while(len--){

temp.push(this.pagesum-len)

}

var idx = temp.indexOf(center);

if(idx<=count){

center=center+count-idx

}else if(idx>this.pagesum-count-1){

center=this.pagesum-count

}

var temp=temp.splice(center-count-1,this.pagegroup)

return temp

}

},

监听input框参数,当输入的值大于当前的总页数时只显示总页数值,避免超程现象出现。

watch:{

jumpDefault(){

if(this.jumpDefault>=this.pagesum){

this.jumpDefault=this.pagesum

}

}

},

接下来是页面跳转功能的实现了,pageNum获取我们切换显示数据条数参数,将值赋给currentSize并重置jumpDefault参数和选择页面,setCurrent(idx)跳转页面并将当前页和分页显示数传给父组件。jumpTo跳转按钮功能实现,submit($event)为键盘监听事件。

methods:{

pageNum(){ //切换显示条数

let nums=document.getElementsByClassName('pageSelect')[0].value

var num=nums.split('条')[0]

this.currentSize=num

this.jumpDefault=1

this.setCurrent(1)

},

setCurrent(idx){

// 判断当前页码不等于本身,和大于零,而且要小于总页数的时候,才触发

if (this.current != idx && idx > 0 && idx < this.pagesum + 1) {

this.current = idx;

}

this.$emit('pagedata',{currentpage:this.current,currentSize:this.currentSize})

},

jumpTo(){

this.current=parseInt(this.jumpDefault)

this.setCurrent(this.current)

},

submit($event){

this.jumpTo()

}

}

父组件调用

到这里我们的功能就基本实现了,现在我们在父组件中调用子组件并模拟些数据来测试下效果,因为我子组件传参都给了默认值,所以这里我只传了关键参数:total="num",并监听子组件传回来的数据@pagedata="getpagedata"。

#HTML

<ul class="articalList">

<li v-for="(artical,ide) in articalList" :key="ide">{{artical}}</li>

</ul>

<PageNav @pagedata="getpagedata" :total="num"></PageNav>

#JavaScript

import PageNav from '@/components/pagenav'

created(){

for(let i = 0; i<300 ; i++){

this.temp.push('this is Page design test database : '+i)

}

},

computed:{

num(){

let num =this.temp.length

return num

}

},

components:{

PageNav,

},

methods:{

getpagedata(data){

var current=data.currentpage

var size=data.currentSize

this.articalList=this.temp.slice((current-1)*size,current*size)

}

}

通过getpagedata(data)方法拿到子组件中传回来的当前页和每页显示的数据个数,接着把现实数据筛选出来并赋给循环列表即可将数据渲染出来,下面是显示结果。

欢迎关注本人的公众号:编程手札,文章也会在公众号更新

相关推荐

Docker篇(二):Docker实战,命令解析

大家好,我是杰哥上周我们通过几个问题,让大家对于Docker有了一个全局的认识。然而,说跟练往往是两个概念。从学习的角度来说,理论知识的学习,往往只是第一步,只有经过实战,才能真正掌握一门技术所以,本...

docker学习笔记——安装和基本操作

今天学习了docker的基本知识,记录一下docker的安装步骤和基本命令(以CentOS7.x为例)一、安装docker的步骤:1.yuminstall-yyum-utils2.yum-con...

不可错过的Docker完整笔记(dockerhib)

简介一、Docker简介Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,...

扔掉运营商的 IPTV 机顶盒,全屋全设备畅看 IPTV!

其实现在看电视节目的需求确实大大降低了,折腾也只是为了单纯的让它实现,享受这个过程带来的快乐而已,哈哈!预期构想家里所有设备直接接入网络随时接收并播放IPTV直播(电信点播的节目不是太多,但好在非常稳...

第五节 Docker 入门实践:从 Hello World 到容器操作

一、Docker容器基础运行(一)单次命令执行通过dockerrun命令可以直接在容器中执行指定命令,这是体验Docker最快捷的方式:#在ubuntu:15.10容器中执行ech...

替代Docker build的Buildah简单介绍

Buildah是用于通过较低级别的coreutils接口构建OCI兼容镜像的工具。与Podman相似,Buildah不依赖于Docker或CRI-O之类的守护程序,并且不需要root特权。Builda...

Docker 命令大全(docker命令大全记录表)

容器生命周期管理run-创建并启动一个新的容器。start/stop/restart-这些命令主要用于启动、停止和重启容器。kill-立即终止一个或多个正在运行的容器rm-于删除一个或...

docker常用指令及安装rabbitMQ(docker安装rabbitmq配置环境)

一、docker常用指令启动docker:systemctlstartdocker停止docker:systemctlstopdocker重启docker:systemctlrestart...

使用Docker快速部署Storm环境(docker部署confluence)

Storm的部署虽然不是特别麻烦,但是在生产环境中,为了提高部署效率,方便管理维护,使用Docker来统一管理部署是一个不错的选择。下面是我开源的一个新的项目,一个配置好了storm与mono环境的D...

Docker Desktop安装使用指南:零基础教程

在之前的文章中,我多次提到使用Docker来安装各类软件,尤其是开源软件应用。鉴于不少读者对此有需求,我决定专门制作一期关于Docker安装与使用的详细教程。我主要以Macbook(Mac平台)为例进...

Linux如何成功地离线安装docker(linux离线安装httpd)

系统环境:Redhat7.2和Centos7.4实测成功近期因项目需要用docker,所以记录一些相关知识,由于生产环境是不能直接连接互联网,尝试在linux中离线安装docker。步骤1.下载...

Docker 类面试题(常见问题)(docker面试题目)

Docker常见问题汇总镜像相关1、如何批量清理临时镜像文件?可以使用sudodockerrmi$(sudodockerimages-q-fdanging=true)命令2、如何查看...

面试官:你知道Dubbo怎么优雅上下线的吗?你:优雅上下线是啥?

最近无论是校招还是社招,都进行的如火如荼,我也承担了很多的面试工作,在一次面试过程中,和候选人聊了一些关于Dubbo的知识。Dubbo是一个比较著名的RPC框架,很多人对于他的一些网络通信、通信协议、...

【Docker 新手入门指南】第五章:Hello Word

适合人群:完全零基础新手|学习目标:30分钟掌握Docker核心操作一、准备工作:先确认是否安装成功打开终端(Windows用户用PowerShell或GitBash),输入:docker--...

松勤软件测试:详解Docker,如何用portainer管理Docker容器

镜像管理搜索镜像dockersearch镜像名称拉取镜像dockerpullname[:tag]列出镜像dockerimages删除镜像dockerrmiimage名称或id删除...