MVVM框架下实现分页功能示例

分页这种组件,几乎每一种框架都有这样的组件,近期我们做了新的项目,因为是在新的分支和新的项目中开发的一期任务,属于什么都没有的状态,几乎所有的效果和业务逻辑都需要重新整理和书写,项目正好完结了,把其中用到的一些小方法分想出来,重在分享思路和逻辑,理清思路和逻辑不论是哪一种框架,都可以轻松搞定

先来看一下效果图:

分页效果图

场景概述:

当前页面需要加载 10条数据 ,每次点击下一页如果之前没有请求过接口需要请求数据,如果在一次页面会话中, 请求过的数据不再从新请求,且要保留每一页面的操作结果 (比如在页面中对数据做的一些操作:点击事情等),且不知道一共有多少数据。

思考逻辑拆分

1.页面初次加载出数据的时候,需要对视图层和分页功能做初始化,如果第一次加载的数据不足 10条 ,证明没有后续页面,所以也就不用显示分页功能,如果等于10条则证明有下一页。

初始化只有1页

2.考虑页面列表显示几个:此处设定为 5个 ,且这个列表要随着点击上一页,下一页而动态更新

页面变化的列表有5条数据

3.需要一个 currentPage 作为索引来显示当前所在页面的下标,以及依靠索引做操作,同时还要记录一个总的页面数据列表 pageList ,还需要一个可以动态更新的显示列表,就是当前看到的5个列表数据 newPages

3.页面数量随着请求不断增加,需要把这些页面中的视图层显示数据存储起来,用于显示和记录数据 Objectives

4.已经请求过得数据不需要每次都请求,如果在当前的页面列表中移动, 不需要动态更新 页面列表,只需要改变currentPage和对应的当前页面数据

在当前的列表中移动

5.点击上一页的时候需要对当前5个页面列表更新,不需要从新请求数据因为都已经请求过,还要考虑第四点

6.点击下一页的时候,如果没有请求过,也就是下一页的下标, 大于总的数据长度 的时候需要从新请求数据,请求下来后需要对整个页面列表数据(存储的所有页面数据,所有的页面个数列表,当前要显示的5个列表)做 整体的更新 。如果下一页小于等于总的数据长度,则只需要当前5个页面列表更新,和此页的对应数据,还要考虑第四点情况

DOM结构书写

以上的思路理清楚之后,就可以开始动手写代码了,先来书写DOM结构吧。

DOM结构

来讲讲这段代码的意思吧,我们用属性currentPage的值来控制当前这些元素的显示与否。用newPages的长度来控制页面动态显示的列表。同时用了2个方法来进行操作,changPage这个方法用来改变当前页面的视图层显示数据,arrowPage 方法用了进行上一页和下一页的操作,方法相同,参数不同。再看一下每一项中都有一个data属性用了存储一个page的值,这个值是用来设置currentPage和显示页面数据用的。

方法实现

现在思路清晰,页面所涉及的方法也理清了,开始来写方法吧!

a.初始定义属性默认值

定义默认值

b.首次加载页面初始化

初始化数据

如果首次请求的数据小于10条,则默认的currentPage还是0,也不需要显示分页功能。如果符合条件,则需要初始化currentPage为1,同时需要执行一个构造分页列表的方法buildPageList

首次要实现的功能

PageList用来存储所有的页面列表,同时用来更新显示的5个页面,所以需要构造当前的5个页面按钮,所以需要方法currentPages

如果pageList小于5个时候则newPages与它相同,不需要做其他处理。下面的情况一会再讲

即这种情况

c.点击上一页和下一页操作

操作方法

根据arrowDirection的值来判断是进行上一页还是下一页的操作。每次点击的时候先更新currentPage的值(data-属性存储的)

1.下一页的操作

如果当前currenPage在当前的页面列表中,点击下一页只需要更换当前的pageData即可

当前是4,下一页在列表中

如果下一页不在当前列表中,但是小于pageList的长度,则需要变更当前显示的5个page列表,和更换当前的pageData,这个时候回到之前的currentPages方法中来变更当前的newPages。

如果下一页不在当前列表中,并且大于pageList的长度。则请求新的数据,变更列表

请求数据变更数据

2.上一页的操作

因为“上一页“数据均属于已经存在的状态,所以不涉及请求,只会设计变更列表和页面数据。开头的思路中已经说明

d.点击类别页面的方法changePage

变更数据即可

不足之处的思考

方法已经书写完毕了,思考一圈之后肯定能发现有很多不足之处吧,是的的确存在一些不足之处。

1.不应该靠currentPage这个属性来控制这么多的DOM元素的显示

2.因为是一次一次的请求数据,不能知道一共有多少数据和记录尾页,只能开最后一次请求时发现没有数据,给出提示,最好的方式应该是在请求最后一次之前能知道下一次没有数据。

3.有一些地方用了固定的数字来做处理,这样日后如果产品要改成显示10个页的列表呢?就得挨个改数字,所以最好用一个熟悉值来控制

对!!!没有给出完整的实例和代码。是的,写出来分享思路和基本方法,目的就是希望看到的人能和我交流思路和方法,给出更好的建议,而不是用来让别人复制粘贴的,这样毫无意义。

思考与总结

到这里所有的思路和方法都已经结合的讲解完毕,基本的代码也都分析全面,基于上面的方法和思想,来写一个适合你们项目框架的分页功能吧,最好能把它封装成一个组件,但是如果由于接口给的数据方式不同或者需求不同,功能实现起来可能会大相径庭,但是基本的思路和方法可以学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Android的MVVM框架 - 数据绑定

    本教程是跟着 Data Binding Guide学习过程中得出的一些实践经验,同时修改了官方教程的一些错误,每一个知识点都有对应的源码,争取做到实践与理论相结合. Data Binding 解决了 Android UI 编程中的一个痛点,官方原生支持 MVVM 模型可以让我们在不改变既有代码框架的前提下,非常容易地使用这些新特性.其实在此之前,已经有些第三方的框架可以支持 MVVM 模型,无耐由于框架的侵入性太强,导致一直没有流行起来. 准备 Android Studio 更新到 1.3 版

  • vue,angular,avalon这三种MVVM框架优缺点

    本文的主要内容是参考官方文档说明总结而来: Vue.js Vue.js @尤雨溪 老师写的一个用于创建 web 交互界面的库,是一个精简的 MVVM.从技术角度讲,Vue.js 专注于 MVVM 模型的 ViewModel 层.它通过双向数据绑定把 View 层和 Model 层连接了起来.实际的 DOM 封装和输出格式都被抽象为了Directives 和 Filters.Vue.js和其他库相比是一个小而美的库,作者的主要目的是通过一个尽量简单的 API 产生可反映的数据绑定和可组合的视图组件

  • 前端MVVM框架解析之双向绑定

    MVVM 框架 近年来前端一个明显的开发趋势就是架构从传统的 MVC 模式向 MVVM 模式迁移.在传统的 MVC 下,当前前端和后端发生数据交互后会刷新整个页面,从而导致比较差的用户体验.因此我们通过 Ajax 的方式和网关 REST API 作通讯,异步的刷新页面的某个区块,来优化和提升体验. MVVM 框架基本概念 在 MVVM 框架中,View(视图) 和 Model(数据) 是不可以直接通讯的,在它们之间存在着 ViewModel 这个中间介充当着观察者的角色.当用户操作 View(视

  • js实现一个简单的MVVM框架示例

    以前都是默默地看园子里的文章,猥琐的点赞,今天也分享一下自己用js实现的一个简单mvvm框架. 最初只做了自动绑定事件,后面又参考学习了vue,knouckout以及argular实现方式,以及结合自己做WPF的一些经验,增加了属性绑定,今天又稍微整理了下,完善了部分功能,把代码提交到了码云:https://gitee.com/zlj_fy/Simple-MVVM 先简单介绍下用法: <form class="form-horizontal" role="form&qu

  • MVVM框架下实现分页功能示例

    分页这种组件,几乎每一种框架都有这样的组件,近期我们做了新的项目,因为是在新的分支和新的项目中开发的一期任务,属于什么都没有的状态,几乎所有的效果和业务逻辑都需要重新整理和书写,项目正好完结了,把其中用到的一些小方法分想出来,重在分享思路和逻辑,理清思路和逻辑不论是哪一种框架,都可以轻松搞定 先来看一下效果图: 分页效果图 场景概述: 当前页面需要加载 10条数据 ,每次点击下一页如果之前没有请求过接口需要请求数据,如果在一次页面会话中, 请求过的数据不再从新请求,且要保留每一页面的操作结果 (

  • Yii框架引入coreseek分页功能示例

    本文实例讲述了Yii框架引入coreseek分页功能.分享给大家供大家参考,具体如下: 把sphinxapi.php改为SphinxClient.php 类文件随便放,你能找到就行,我放在advanced/frontend/web/SphinxClient.php,打开common/config/bootstrap.php 在里面添加 Yii::$classMap['SphinxClient']='@frontend/web/SphinxClient.php'; 地址写正确 在需要用得控制其中

  • ThinkPHP3.2框架自带分页功能实现方法示例

    本文实例讲述了ThinkPHP3.2框架自带分页功能实现方法.分享给大家供大家参考,具体如下: 1.前端-分页代码: <tfoot> <!--分页显示?--> <tr> <td textalign="center" cl nowrap="true" colspan="9" height="20"> <div class="pages">{$page

  • JavaScript前端实现小说分页功能示例

    目录 先让我找找我的思路在哪里 思路已至,码来! 结束 先让我找找我的思路在哪里 在小说读书APP中,都会有分页的功能,那么前端如何实现这个功能呢? 因为没有什么思路,那就只能在前辈的项目中寻找思路了. 这不,直接打开起点的页面,按下那个传说中的F12键,开始我传奇生涯!...不好意思,串台了 好了,然后在找一本有缘书,跟我一同前往那神秘的未知世界. 就决定是你了,开始免费试读. 然后我们就可以发现起点是如何实现这个功能的了,原来是使用columns这个属性来让文章自动分页的昂. 我们现在就去搜

  • Vue+element-ui 实现表格的分页功能示例

    本文介绍了Vue+element-ui 实现表格的分页功能示例,分享给大家,具体如下: 实现效果如下图所示: template部分: <el-table :data="tempList" :header-cell-style="rowClass" stripe border style="margin-bottom:14px;" :empty-text="emptyText"> <el-table-colum

  • ThinkPHP框架下微信支付功能总结踩坑笔记

    本文实例讲述了ThinkPHP框架下微信支付功能总结.分享给大家供大家参考,具体如下: 摘要 此文主要为个人解决 ThinkPHP3.2.3 下微信支付所遇到的一些坑的解决方案,仅供参考 详情请参考 原文 : 微信公众平台开发教程之ThinkPHP框架下微信支付功能 踩坑记录 为便于参考,此处附录部分 weixinpay.class代码截图 ①. 验证不严谨,损失教训 补充时间:[2017-01-02] 情况描述 [我尊重你,但不认同你] 恰逢元旦期间,遭到微信支付被大牛攻破的情况,损失近 80

  • 微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解

    本文实例讲述了ThinkPHP框架下微信支付功能.分享给大家供大家参考,具体如下: 声明:原文主要摘自白俊遥博客 ,部分内容针对个人事例已作修改,主要用于自己的参考,欢迎指正. 注意:微信公众号支付,强烈建议使用外网可访问的链接测试,否则即便代码正确也无法调出支付界面,可使用草料二维码生成可扫描图片,也可直接在微信中输入网址. 使用框架:ThinkPHP 3.2.3 一.微信公众平台信息配置 1).进入微信公众平台 由左侧的"微信支付"进入配置界面,添加或修改正确的支付授权目录,注意该

  • Vue后台管理系统之实现分页功能示例

    本文主要介绍了Vue后台管理系统之实现分页功能,分享给大家,具体如下: 效果图: 功能描述: 显示数据的总数目 可选择每天的显示条数 点击页码跳转到指定页数 输入页码可跳转到指定页 1.功能实现 1.1 结构 <!-- 分页 --> <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="quer

  • thinkPHP5.1框架使用SemanticUI实现分页功能示例

    本文实例讲述了thinkPHP5.1框架使用SemanticUI实现分页功能.分享给大家供大家参考,具体如下: 1.config目录下新建paginate.php,下面是文件的内容 <?php //分页配置 return [ 'type' => 'Semantic', 'var_page' => 'page', ]; 2.thinkphp\library\think\paginator\driver\下新建Semantic.php,下面是文件的内容 <?php /** * Crea

  • Django框架实现的简单分页功能示例

    本文实例讲述了Django框架实现的简单分页功能.分享给大家供大家参考,具体如下: 前面一篇<Django开发的简易留言板>写了个简单的留言板,如果数据量太多的话在一页显示就不那么友好了,本文就是做一个分页显示. 代码在上一篇的基础上修改. 导入分页模块并修改views #只需修改index函数即可 from django.core.paginator import Paginator def index(request): messages = models.Message.objects.

随机推荐