美文网首页
vue+原生js手写分页

vue+原生js手写分页

作者: chenjundi | 来源:发表于2019-05-09 10:07 被阅读0次

本文只是一个简单地DEMO,所以不会用vue全家桶去构建一个工程。

一、引入vue.js
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
二、分页css(包含一些简单地动画效果)
.pagewrap {
    padding: 25px 0;
    -webkit-user-select: none;
    user-select: none;
    width: 100%;
    color: #666;
    text-align: center;
    font-size: 14px;
}

.pagewrap i {
    height: 34px;
    padding: 0;
    border: 1px solid #ccc;
    line-height: 34px;
    border-radius: 3px;
    width: 34px;
    display: inline-block;
    cursor: pointer;
    margin: 0 4px;
    vertical-align: middle;
}

.pagewrap i.button {
    width: 68px;
}

.pagewrap i:hover {
    border-color: #fdb800;
    color: #fdb800;
    animation: buttonshake .4s ease-out forwards;
}

.pagewrap i.current:hover, i.current, i.button:hover {
    border-color: #fdb800;
    color: #fdb800;
    animation: none;
}

.pagewrap i.disabled, i.disabled:hover {
    background: #EFEFEF;
    border-color: #EFEFEF;
    color: #AAA;
    cursor: text;
    animation: none;
}

.pagewrap i.ellipsis, i.ellipsis:hover {
    background: none;
    border-color: #FFF;
    color: #AAA;
    cursor: text;
    animation: none;
}

@-webkit-keyframes buttonshake {
    25% {
        -webkit-transform: rotate(45deg);
    }
    75% {
        -webkit-transform: rotate(-45deg);
    }
    100% {
        -webkit-transform: rotate(0deg);
    }
}

@keyframes buttonshake {
    25% {
        transform: rotate(45deg);
    }
    75% {
        transform: rotate(-45deg);
    }
    100% {
        transform: rotate(0deg);
    }
}
三、分页html(for循环生成分页按钮和样式条件)
<div id="app">
    <div class="pagewrap">
        <i v-for="button in page.buttons"
           :class="{button: button.button, disabled: button.disabled, current: button.current, ellipsis: button.ellipsis}"
           @click="button.current || button.ellipsis || button.disabled || loadList(button.number);">
            {{button.title}}
        </i>
    </div>
</div>
四、分页js(可以尝试传入不同参数打印buttons)
var app = new Vue({
   el: '#app',
   data: {
       page: {}
   },
   methods: {
       pagination(current, total) {
           var buttons = [];
           if (total) {
               var last = {
                   title: '上一页',
                   disabled: !(current > 0),
                   button: 1,
                   number: current - 1,
                   log: '{"evtname":"上一页","evtvalue":"prev"}'
               };
               var next = {
                   title: '下一页',
                   disabled: !(current < total - 1),
                   button: 2,
                   number: current + 1,
                   log: '{"evtname":"下一页","evtvalue":"next"}'
               };
               buttons.push(last);
               var i = 0;
               if (total <= 10) {
                   i = 0;
                   for (; i < total; i++) {
                       buttons.push({
                           title: i + 1,
                           number: i,
                           current: current == i
                       });
                   }
               } else if (current < 5) {
                   i = 0;
                   for (; i < 8; i++) {
                       buttons.push({
                           title: i + 1,
                           number: i,
                           current: current == i
                       });
                   }
                   buttons.push({
                       title: '…',
                       ellipsis: 1
                   });
                   buttons.push({
                       title: total,
                       number: total - 1
                   });
               } else if (total - current - 1 < 5) {
                   buttons.push({
                       title: '1',
                       number: 0
                   });
                   buttons.push({
                       title: '…',
                       ellipsis: 1
                   });
                   i = total - 8;
                   for (; i < total; i++) {
                       buttons.push({
                           title: i + 1,
                           number: i,
                           current: current == i
                       });
                   }
               } else {
                   buttons.push({
                       title: '1',
                       number: 0
                   });
                   buttons.push({
                       title: '…',
                       ellipsis: 1
                   });
                   i = current - 2;
                   for (; i < current + 4; i++) {
                       buttons.push({
                           title: i + 1,
                           number: i,
                           current: current == i
                       });
                   }
                   buttons.push({
                       title: '…',
                       ellipsis: 1
                   });
                   buttons.push({
                       title: total,
                       number: total - 1
                   });
               }
               buttons.push(next);
           }
           console.log(buttons);
           return buttons;
       }
   },
   created() {
       // 当前第5页,一共21页
       this.page.buttons = this.pagination(5, 21);
    }
})

效果图(到这里简单的样子已经出来了)

pagination.png
五、配合后台数据,引入axios
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
data: {
    page: {
        number: 0,
        size: 10
    }
},
// methods里添加方法
methods: {
    loadList() {
        // 后端给的url地址,传参一般是当前页数和展示条数
        axios.post(URL, {
            page: this.page.number || 0,
            size: this.page.size
        })
        .then(data => {
            console.log("加载列表成功");
            // 这里的传值具体看后端返回数据
            this.page.buttons = this.pagination(data.current, data.total);
        })
        .catch(data => {
             console.log("加载列表失败");
        });
    }
},
// 调用方法
created() {
     // this.page.buttons = this.pagination(5, 21);
     this.loadList();
}

相关文章

  • vue+原生js手写分页

    本文只是一个简单地DEMO,所以不会用vue全家桶去构建一个工程。 一、引入vue.js 二、分页css(包含一些...

  • 使用JQuery插件进行分页

    在上一篇 PageHelper分页 中,手写分页的逻辑,重用性不高。那么,有没有更好的方式? 有,可以使用 JS ...

  • 原生js分页效果

    2017年4月份,我去无锡某软件公司面试,项目经理当时问到一个问题:怎么实现分页效果,说明实现的原理?当时觉得分页...

  • 搜狗面试

    原型链上手写事件,手写原生js实现ajax事件,jsonp实现原理,阻止事件IE冒泡代码,事件捕获、处理,冒泡代码...

  • 自己动手封装AJAX

    一、手写AJAX 首先我们先用原生JS手写一个AJAX: 这是一个POST请求的AJAX,可以通过修改 open ...

  • bootstrap-paginator.js分页插件的优化--增

    bootstrap-paginator.js是一款基于bootstrap框架的很好用的生成分页导航插件. 原生插件...

  • 原生js-分页表格

    效果如图这款功能简单的分页表格有两种分页类型,一种是normal,一种是simple,可以通过type进行配置,其...

  • 原生js之分页算法

    var data=[ '标题1', '标题2', '标题3', '标题4', '标题5', ...

  • 原生JS手写无缝滚动

    css *{ margin: 0; padding: 0; } ....

  • django 使用原生sql及分页

    python3 django 使用原生sql及分页 django 使用原生sql及分页,类似于django res...

网友评论

      本文标题:vue+原生js手写分页

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