移动端页面实现下拉刷新、上拉加载 – 基于MUI插件

以乐淘的商品搜索(结果)页面为例。

【待补充:效果图】

HTML的实现

使用MUI的父子盒子嵌套的结构。

  • 区域滚动中,上下拉动后出现的提示信息(转菊花、文本等)元素是用绝对定位方式定位到该区域的顶端,且会被页面其他元素(如固定定位的元素)遮住。
  • 调整父容器样式:(原默认样式为绝对定位,不符合需求)设置父高100%,设置(子绝)父相。

MUI插件模板:下拉刷新、上拉加载

产品文档写的比较乱,没有完整模板。
产品文档链接:MUI文档JS组件

代码框架模板

模板经整理如下。
其中,倒计时器是在本地模拟服务器响应时长,实际生产环境中基本不会用倒计时器。

    mui.init({
        pullRefresh: {  
        container: ".mui-scroll-wrapper", //下拉刷新父容器容器标识
        down: {     //down表示控制下拉刷新
           callback: function() {     //callback表示下拉刷新时的回调函数 可以发生ajax请求来刷新页面
           setTimeout(function() {     //模拟请求时间 延迟1秒结束下拉刷新
           //当数据请求完毕后结束下拉刷新
           mui('.mui-scroll-wrapper').pullRefresh().endPulldownToRefresh();
                    }, 1000)
                }
            },
         up: {     //up表示控制上拉加载更多
           contentrefresh: '正在加载...',
           contentnomore: '没有更多数据了',
           callback: function() {     //上拉加载更多的回调函数 可以发送ajax请求来加载更多数据
                }
            }  
        }
    });


pullRefresh可选参数
  1. 下拉刷新
  • style:'circle',必选,下拉刷新样式,目前支持原生5+ ‘circle’样式
  • color:'#2BD009', 可选,默认“#2BD009” 下拉刷新控件颜色
  • height:'50px', 可选,默认50px.下拉刷新控件的高度,
  • range:'100px', 可选 默认100px,控件可下拉拖拽的范围
  • offset:'0px', 可选 默认0px,下拉刷新控件的起始位置
  • auto: true, 可选,默认false.首次加载自动上拉刷新一次
  • contentdown : "下拉可以刷新", 可选,在下拉可刷新状态时,下拉刷新控件上显示的标题内容
  • contentover : "释放立即刷新", 可选,在释放可刷新状态时,下拉刷新控件上显示的标题内容
  • contentrefresh : "正在刷新...", 可选,正在刷新状态时,下拉刷新控件上显示的标题内容
  1. 上拉加载更多
  • contentrefresh: '正在下拉加载的时候的提示文字',
  • contentnomore: '所有数据数据加载完毕后的提示文字'
    但是要显示所有数据加载完毕必须结束【上拉加载更多】
    要调用结束方法:
    mui('.mui-scroll-wrapper').pullRefresh().endPullupToRefresh(true);
  1. 结束下拉刷新的方法
    mui('.mui-scroll-wrapper').pullRefresh().endPulldownToRefresh();
  2. 结束上拉加载更多方法
    mui('.mui-scroll-wrapper').pullRefresh().endPullupToRefresh();
  3. 结束上拉加载更多方法 并且提示没有更多数据了
    mui('.mui-scroll-wrapper').pullRefresh().endPullupToRefresh(true);
  4. 重置上拉加载更多方法
    mui('.mui-scroll-wrapper').pullRefresh().refresh(true);

场景与流程分析

用户操作:搜索页输入关键词点击搜索

→ window:跳转到新页面productlist,JS:取到地址中的proNam (search关键词)
→JS:通过aJax调用“搜索产品”接口,向后台传入proNam,拿到后台数据→渲染页面生成初始(新)的商品列表

用户操作:下拉操作

→JS:下拉结束后,down的回调函数通过aJax调用“搜索产品”接口,向后台再请求一次数据→用数据渲染页面生成新的商品列表

用户操作:上拉操作

→JS:下拉结束后,up的回调函数通过aJax调用“搜索产品”接口,向后台请求其他数据→用数据渲染页面生成新的商品列表

用户操作:点击不同排序按钮

→JS:点击事件中,通过aJax调用“搜索产品”接口,向后台请求数据→用数据渲染页面生成新的商品列表

综上所述,商品的查找、筛选及排序都通过同一个后台接口【搜素产品】完成,传入的参数不同返回的结果不同。

搜素产品接口参数:
data: {
proNam:产品名称(非必须),
brandId:品牌id(非必须),
price:使用价格排序(非必须)(1升序,2降序),
num:产品库存排序(非必须)(1升序,2降序),
pag:第几页(!必须),
pageSize:每页的条数(!必须)
}

总结:
  • 在该页面中,不同的行为都会调用同一个后台接口,向这个后台接口传入同样的对象(对象中的属性不同),对拿到的数据做不同的处理。
  • 所以,将aJax请求封装成各行为公共的方法,
    在上拉、下拉、排序等不同行为的函数中,向这个公共方法传入两个参数:ajax传输的data,拿到data后的页面渲染行为(回调函数)。

JS中如何实现

依赖的框架与库
  • 依赖框架:MUI
  • 依赖JS库:Zepto
  • 页面渲染依赖插件: art-template(非必须,本案例中需要用模板引擎调用生成页面元素)
实现模式:
功能一:模块初始化,调用mui.init方法

在原插件中,下拉和上拉是可以相互独立的两个功能,也可以写到一起。
在初始化模板中设置MUI的pullRefresh各项参数。

功能二(公共方法):通过aJax向后台接口请求数据,执行传进来的函数

这个功能既会被上拉调用,也会被下拉调用,因此独立封装在初始化模块的外部,与需求二函数同级作用域。

  • 必传值的判断赋值:必传项(pag, pageSize)如无传入值则写默认值
    原因:product页面加载时,这个方法即第一次被调用,没有其他函数向它传data值
  • aJax请求数据:success回调函数callback需要被传入,使用短路运算符

功能三:下拉后刷新页面、上拉后加载更多商品,传入mui.init方法作为回调函数调用

其中,下拉down与上拉up的参数中的回调函数用函数名调用,函数声明在初始化模块的外部(同级作用域,而不是内部)。

  • 下拉down的回调函数:
    向公共方法传入data;
    向公共方法传入回调函数:
    -调用模板引擎渲染并替换页面内容;
    -结束下拉刷新(调用MUI方法);
    -重置page,
    -重置上拉加载(调用MUI方法)。

  • 上拉up的回调函数:
    page++,
    向公共方法传入data;
    向公共方法传入回调函数:
    -判断返回数据是否为空(没有更多数据了),如为空则结束上拉加载并提示没有更多数据(调用MUI方法),如数据不为空则渲染内容并向页面append加载;
    -数据刷新完毕后结束上拉加载。
    -重置上拉加载。

功能四:商品排序

*注册singleTap事件(不能用click):
MUI提倡在模板中用tap而不是click,MUI的插件源码中会阻止click的默认事件

  • 获取data的排序参数(顺/逆序、排序类型等)。
  • 向公共方法传入回调函数:渲染并替换页面内容。
  • 改变被点击的排序按钮样式。

【待补充:代码实现】


2018.1.31

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容