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

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

1,总页数和数据条数

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

3,上下和首尾页切换

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

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

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

Vue实战028:功能完善的分页组件实现详解_第1张图片

 创建模板

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

CSS样式编写

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

功能逻辑实现(重点)

下面是功能的实现,要实现分页功能,我们需要知道我们共有多少条数据,每页显示多少条数据,有多少个分页,显示多少个分页,当前在哪等,给父级修改的我们只需要提供这几个参数:数据总条数、每页显示条数、显示页码数,同时我们需要定义当前页参数(默认为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(lenthis.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
  • {{artical}}
#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)方法拿到子组件中传回来的当前页和每页显示的数据个数,接着把现实数据筛选出来并赋给循环列表即可将数据渲染出来,下面是显示结果。

Vue实战028:功能完善的分页组件实现详解_第2张图片

这是完整组件,有兴趣的可以下载参考:    https://download.csdn.net/download/kevinfan2011/11253158 

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

 

你可能感兴趣的:(Vue,vue,分页)