美文网首页
我要造轮子系列 - 常用的分页组件

我要造轮子系列 - 常用的分页组件

作者: 啊力哥_a36e | 来源:发表于2021-07-01 11:49 被阅读0次

前言

分页组件也前端高频组件,但一般用在pc端,移动端出现比较少,因为按照移动端使用习惯在移动端通常会使用下拉加载刷新或者上拉加载刷新 这次编写的组件也是针对pc端。分页组件目的为了方便浏览通常将服务器响应回来的大量数据做分页
从实现方式上来说分页基本分为两种方式:

1.查询所有数据返回给客户,通过显示指定区间实现分页,这种方法一般是指JS分页

2.通过客户发送的请求,构造sql语句,查询表中的一段数据。

分页组件效果

屏幕录制2021-06-29 下午5.58.08.gif

分页组件需求分析

1.总数据量,一般传入后端返回的数据总数字段

2.每页实际条数,传入自定数值

3.每页要显示条数,传入自定的数值,比如每页条数的是10条,在10条之间显示5条

4.总共多少页的计算公式是 总数据量/每页要显示条数

5.点击下一页,上一页改变current 点击首页跳转第一页,点击尾页跳转到最尾一页,判断如果第一页和最尾一页设置禁止点击首页、下一页、上一页、尾页按钮

6.input框输入限制1 - 总数量的输入,设置数值跳转到当前页

7.currentCallBack点击返回当前索引

8.传入color可以自定喜欢的颜色

9.每页显示的条数计算,用vue的watch来监听current值的变化 ,然后通过当前的current计算出实际显示那几页出来,计算方式如下

 watch: {
            current(newVal) {
                let temp = [],
                    max,
                    min = newVal - Math.floor(this.pageNum / 2)
                if (min < 1) min = 1
                max = min + this.pageNum - 1
                if (max > this.pageTotalNum) max = this.pageTotalNum
                for (let i = min; i <= max; i++) {
                    temp.push(i)
                }
                this.pageSizeNum = temp
            }
        },

props参数

参数 说明 类型 默认值
page-total 总数据 Number 100
page-num 要显示页数 Number 10
page-size 分页大小 Number 5
color 传入的主题颜色 Number #409eff
currentCallBack 返回点击的当前索引值 Events

完整代码

<template>
    <div class="_page_container">
        <ul class="_pages _pages_1">
            <li :class="['_home', setFristDisabled]" @click.prevent="setHomePageination">首页</li>
            <li :class="['_prev_ _prev' ,setFristDisabled]" @click="prevPageination">上一页</li>
            <li :class="['_pages_li_1',getCurrent(item)?'_active_1':'']"
                :style="{backgroundColor : getCurrent(item) ? color : ''}"
                :data-index="item"
                v-for="(item) in pageSizeNum"
                :key="item"
                @click.prevent="switchPageination(item)"
            >{{item}}
            </li>
            <li :class="['_next_ _next', setLastDisabled]"
                @click.prevent="nextPageination">下一页
            </li>
            <li :class="['_last', setLastDisabled]"
                @click="setLastPageination">尾页
            </li>
        </ul>
        <div class="_jumper">
            <span class="_count">共 {{pageTotalNum}} 页</span>
            <span>前往</span>
            <label>
                <input class="_jumper_input"
                       type="number"
                       min="1"
                       :max="pageTotalNum"
                       @blur="jumpPageination($event)"
                       @keyup.enter="jumpPageination($event)"/>
            </label>
            <span>页</span>
        </div>
    </div>
</template>

<script>
    export default {
        name: 'pagination',
        props: {
            // 总数据
            pageTotal: {
                type: Number,
                default: 100
            },
            // 实际分页大小
            pageSize: {
                type: Number,
                default: 10
            },
            //显示页数
            pageNum: {
                type: Number,
                default: 5
            },
            //自定义颜色
            color: {
                type: String,
                default: '#409eff'
            }
        },
        data() {
            return {
                current: 1,
                pageSizeNum: Array.from({length: this.pageNum}, (_, index) => index + 1),
                pageTotalNum: Math.ceil(this.pageTotal / this.pageSize)
            }
        },
        computed: {
            getCurrent() {
                return (index) => {
                    return this.current === index
                }
            },
            setFristDisabled() {
                return this.current === 1 ? '_disabled_c _disabled' : ''
            },
            setLastDisabled() {
                return this.current === this.pageTotalNum ? '_disabled_c _disabled' : ''
            }
        },
        watch: {
            current(newVal) {
                let temp = [],
                    max,
                    min = newVal - Math.floor(this.pageNum / 2)
                if (min < 1) min = 1
                max = min + this.pageNum - 1
                if (max > this.pageTotalNum) max = this.pageTotalNum
                for (let i = min; i <= max; i++) {
                    temp.push(i)
                }
                this.pageSizeNum = temp
            }
        },
        updated() {
            this.$emit('currentCallBack', this.current - 1)
        },
        methods: {
            switchPageination(index) {
                this.current = index
            },
            nextPageination() {
                if (this.current === this.pageTotalNum) {
                    this.current = this.pageTotalNum
                }else {
                    this.current++
                }
            },
            prevPageination() {
                if (this.current === 1) {
                    this.current = 1
                }else {
                    this.current--
                }
            },
            setHomePageination() {
                this.current = 1
            },
            setLastPageination() {
                this.current = this.pageTotalNum
            },
            jumpPageination(ev) {
                let value = Number(ev.currentTarget.value)
                if (value < 1) value = 1
                if (value > this.pageTotalNum) value = this.pageTotalNum
                this.current = value
            }
        }
    }
</script>

<style scoped>


    ._page_container {
        height: 28px;
        line-height: 28px;
        text-align: center;
        user-select: none;

    }

    ._page_container input[type=number] {
        -moz-appearance: textfield;
    }

    ._page_container input[type=number]::-webkit-inner-spin-button,
    ._page_container input[type=number]::-webkit-outer-spin-button {
        -webkit-appearance: none;
        margin: 0;
    }

    ._page_container ._pages {
        display: inline-block;
    }

    ._page_container ._pages li {
        display: inline-block;
        list-style: none;
        vertical-align: top;
        color: #303133;
        font-weight: bold;
        min-width: 30px;
        text-align: center;
        margin: 0 5px;
        border-radius: 2px;
        cursor: pointer;
    }

    ._page_container ._pages li:hover {
        opacity: .6;
        transition-duration: 500ms;
        transition-timing-function: ease;
    }

    ._page_container ._pages li:first-child, ._page_container ._pages li:last-child {
        font-size: 14px;
    }

    ._page_container ._pages ._prev, ._page_container ._pages ._next, ._page_container ._pages ._home, ._page_container ._pages ._last {
        font-size: 12px;
        font-weight: normal;
        padding: 0 8px;
    }

    ._page_container ._jumper {
        display: inline-block;
        color: #606266;
        margin-left: 10px;
    }

    ._page_container ._jumper ._count {
        margin-right: 10px;
    }

    ._page_container ._jumper ._jumper_input {
        display: inline-block;
        font-size: 14px;
        color: #606266;
        width: 50px;
        height: 26px;
        text-align: center;
        margin: 0 5px;
        padding: 3px;
        border: 1px solid #dcdfe6;
        border-radius: 4px;
        background: none;
        outline: none;
        box-sizing: border-box;
    }

    ._page_container ._jumper ._jumper_input:focus {
        border-color: #409eff;
        transition-duration: 500ms;
        transition-timing-function: ease;
    }

    ._pages_1 li {
        background-color: #f4f4f5;
    }

    ._active_1 {
        color: #fff !important;
        transition-duration: 500ms;
        transition-timing-function: ease;
    }

    ._active_2 {
        color: #409eff !important;
    }

    ._disabled {
        cursor: not-allowed !important;
    }

    ._disabled_c {
        color: #c0c4cc !important;
    }

</style>

最后

我要造轮子系列的分页组件也完成了,希望同学们有空余时间也多写写,大家一起学习、一起进步,共勉!!

npm

npm install nigo-vue-pagination

yarn

yarn add nigo-vue-pagination

github

git clone https://github.com/shinewen189/nigo-vue-pagination.git

我要造轮子系列文章

【1】.我要造轮子系列-一个轮子的诞生过程

【2】.我要造轮子系列-常用的拖拽组件

相关文章

  • 我要造轮子系列 - 常用的分页组件

    前言 分页组件也前端高频组件,但一般用在pc端,移动端出现比较少,因为按照移动端使用习惯在移动端通常会使用下拉加载...

  • 我要造轮子系列 - 常用的拖拽组件

    先上效果 我要造轮子系列第二个组件是常用的拖拽组件。 很多时候,我们需要让用户来自定义自己想要的菜单顺序,或者一些...

  • 移动端的一些组件

    最近整理了一些移动端常用的组件,自己造轮子中,你可能会好奇为啥要自己造,github上面的的东西不是更成熟吗?一,...

  • 造轮子-nav组件

    补充知识:如果你需要相对引用你得加一个./否则会被认为你是在引用一个第三方库比如: 首先我们需要三个组件分别是na...

  • 造轮子-sticky组件

    最初的api设计 上面的api就是接受一个distance参数,意思是距离顶部多少距离的时候固定住 当需要通过滚动...

  • 最近的想法

    为了提升自己,想在 GitHub 上造一些开源的轮子。首先想到了自己平时的项目中经常用到的各种工作的组件,我整理一...

  • 2019-05-31 程序员修仙进阶标准,你到哪个阶段了?

    闭门造轮子 > 使用别人的轮子 > 开门造轮子 > 分享轮子

  • 自己造轮子-AdaBoost-DS

    自己造轮子系列今天造的是AdaBoost,基分类器用的是DS(decision stump)。之所以会写这个系列主...

  • 造轮子之仿射变换

    有人说,我们不应该再造轮子;也有人说,学习怎么造轮子可以带来更深的理解。我说,用轮子有用轮子的乐趣,造轮子有造轮子...

  • Springboot - Mybatis 集成PageHelpe

    一. 说明 分页是web开发中常遇到的功能模块,之前看了一些分页算法,感觉都比较繁琐,不想再重复造轮子,项目中用到...

网友评论

      本文标题:我要造轮子系列 - 常用的分页组件

      本文链接:https://www.haomeiwen.com/subject/pusjultx.html