HBuilder mui入门教程——(4)下拉刷新,上拉加载

本文介绍如何在移动端应用中实现下拉刷新和上拉加载功能,包括具体实现细节和注意事项。通过保存ID的方式实现数据按时间顺序加载,并提供了一个示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于下拉刷新,上拉加载在官方文档已经有了比较详细的说明,这里只说一下实际使用是需要注意的地方。
官方下拉刷新:http://dev.dcloud.net.cn/mui/pulldown/
官方上拉加载:http://dev.dcloud.net.cn/mui/pullup/

可以在HBuilder中直接【文件】->【新建】->【Html页面】,在下面选择"mui下拉刷新、上拉加载",这里默认创建的是双webview式的页面。在pullrefresh_main.html中包含页面的标题,pullrefresh_sub.html中包含了加载刷新的逻辑。

打开pullrefresh_sub.html页面,里面的pulldownRefresh是下拉刷新的回调函数,pullupRefresh是上拉加载的回调函数。业务主要围绕这两个写。

比如给定一个数据库中的表products,其中有ID,Name,AddTime。要求按AddTime降序排列。

上拉加载

默认的上拉加载是随机加载20个,每个的序号是总长度+1。现在的要求下,首次进入页面应该自动进行下拉加载20个项目。然后再次下拉时,应该按这个AddTime降序顺序,读取21-40个,后面依旧。这里就要考虑下怎么达到这个效果。

经验丰富的开发者一定想到了,可以在每次加载后保存下此次加载的AddTime最小的ID,然后ajax请求服务器的时候,附加上这个ID。在服务器端,收到ID后,先找到这个ID对应的时间,然后按AddTime降序从这个时间往后面取20个,返回给客户端。

所以就需要保存下每次加载的AddTime最小的ID,记为oldestID。注意,这个oldestID不能直接在页面中创建临时变量保存:

var oldestID;//错误的ID保存方式
/**
 * 上拉加载具体业务实现
 */
function pullupRefresh() {
    mui.ajax('http://www.test.com/mobile/products.ashx',{
        data:{
            id:oldestID
        },
        success:function(data){
            //...
        }
    });
}

因为已加载的列表必然是按AddTime降序排列的,所以只要把oldestID作为属性保存在最后一项中就可以了

<li data-id="{id}">
...
</li>

全部代码如下:

/**
* 上拉加载具体业务实现,加载以前的
 */
function pullupRefresh() {
    //新元素插入在table里面
    var table = document.body.querySelector('.mui-table-view');
    var last=table.querySelector('li:last-child');
    var oldestID=last!=null?last.getAttribute('data-id'):'';
    var self=this;
    mui.ajax('http://www.test.com/mobile/products.ashx',{
        data:{
            id:oldestID
        },
        success:function(data){
            if(data.Code<0){//有错误
                plus.nativeUI.toast(data.Msg);return;
            }
            for(var i=0;i<data.Data.length;i++){
                var item=data.Data[i];
                //通过getItemElement函数将数据转换为可插入的Element元素
                table.appendChild(getItemElement(item));
            }
            //如果列表为空,表示以前的产品加载完了
            self.endPullupToRefresh(data.Data.length==0);
        },error:function(){
            self.endPullupToRefresh(false);
        }
    });
}

这里面Url是客户端响应ajax请求的地址,根据自己的实际情况改。
下拉刷新和上拉加载都需要吧json数据转换为Element插入到DOM,索性写个getItemElement做个转换:

var itemHtmlOri=
['<li class="mui-table-view-cell" data-id="{id}">',
    '<div class="mui-table">',
        '<div class="mui-table-cell mui-col-xs-3">',
            '{name}',
        '</div>',
        '<div class="mui-table-cell mui-col-xs-9 mui-navigate-right">',
            '{date}',
        '</div>',
    '</div>',
'</li>'].join('');

function getItemElement(item){
    var box = document.createElement('div');
    var itemHtml=itemHtmlOri;
    itemHtml=itemHtml.replace(/{name}/g,item.Name)
            .replace(/{date}/g,item.AddTime)
            .replace(/{id}/g,item.Id);
    box.innerHTML=itemHtml;
    return box.firstChild;
}

下拉刷新

下拉刷新和上拉加载类似,也需要保存一个最新ID,每次下拉刷新的时候,向服务器请求这个ID,服务器先找到这个ID对应的AddTime,再看看有没有更新的Product,有就全部返回。

鉴于这两次请求基本相似,服务器干的活也差不多,唯一区别是前面找比给定ID旧的,这次找比它新的,所以为了代码复用,干脆再给服务器传一个参数type,告诉他找新的还是找旧的。这样两个函数就可以用一个地址了。

可以规定当type=1时找新的,type为空或null时找旧的,这样上面的代码就不用动了:

/**
 * 下拉刷新具体业务实现,加载最新的
 */
function pulldownRefresh() {
    //新元素插入到table中
    var table = document.body.querySelector('.mui-table-view');
    var first=table.querySelector('li:first-child');
    var newestID=first!=null?first.getAttribute('data-id'):'';
    mui.ajax('http://www.test.com/mobile/products.ashx',{
        data:{
            id:id,
            type:'1'
        },
        success:function(data){
            mui('#pullrefresh').pullRefresh().endPulldownToRefresh();
            if(data.Code<0){//有错误
                plus.nativeUI.toast(data.Msg);return;
            }
            for(var i=data.Data.length-1;i>=0;i--){
                var item=data.Data[i];
                table.insertBefore(getItemElement(item), table.firstChild);
            }
        },error:function(){
            mui('#pullrefresh').pullRefresh().endPulldownToRefresh();
        }
    });
}

其他注意的

首次进入页面的时候是空的,应该自动上拉加载20项。这个模板中已经写好了:

if (mui.os.plus) {
    mui.plusReady(function() {
        setTimeout(function() {
            mui('#pullrefresh').pullRefresh().pullupLoading();
        }, 1000);

    });
} else {
    mui.ready(function() {
        mui('#pullrefresh').pullRefresh().pullupLoading();
    });
}
2018mui教程 mui实战视频教程 web移动端开发教程+源码 课程简介: 结合MUI框架完成HTML5移动端混合应用开发(微信实战)。 本课程将介绍如何使用HTML5完成移动端混合应用开发,课程以移动端框架MUI为基础,以微信项目为目标,介绍MUI框架的使用,包含移动端排版布局,HTML5借助框架完成手机摄像头调用、手机相册调用、手机重力感应调用等特效,并最终完成微信案例项目。 课程目标: 学习HTML5移动端混合应用开发,并完成微信项目实战,本课程介绍了MUI框架的使用,以及Hbublder工具的基本操作。适用人群本课程适合具有HTML与CSS基础,了解HTML5及CSS3,并想跨入HTML5移动端混合应用开发领域的同仁。 课程目录介绍: 1【MUI框架】HTML5混合应用开发与MUI框架 2 MUI移动端框架初体验 3【微信主页】顶部标题栏 4【微信主页】底部Tab导航 5【微信主页】底部Tab导航样式调整 6【微信主页】图文列表 7【微信项目】整体效果展示 8【微信子页面】DIV方式创建子页面 9【真机调试】HTML5程序真机调试 10【微信子页面】WebView方式创建子页面 11【微信子页面】WebView方式创建子页面 12【微信子页面】webView子页面效果演示 13【微信子页面】底栏Tab页面切换 14【微信子页面】打开微信聊天子页面 15【微信子页面】聊天页面效果展示 16【微信子页面】页面间传值 17【相册】Html5访问手机相册,发送单张图片 18【相册】Html5访问手机相册,发送多张图片 19【摄像头】Html5访问手机摄像头,发送拍摄照片 20【摇一摇】获取重力感应 21【摇一摇】监控重力感应及摇一摇实现逻辑 22【微信子页面】发现页面 23【朋友圈】朋友圈页面布局 24【朋友圈】下拉刷新 25【朋友圈】上拉加载 26【事件】移动端事件 27【其他】MUI其他相关 28【案例包】项目案例包效果展示 29【案例包】项目案例包源码获取 30【应用退出】应用程序退出实现 31【打包部署】应用程序云端打包与发布 Mui视频教程部分 MUI - dialog对话框、ipnut (表单).mp4 MUI - datepicker(时间选择器).mp4 MUI 介绍、新项目创建、 基础布局.mp4 MUI - 窗口管理及窗口之间的数据传递.mp4 MUI - 复选框、单选框、使用js获取选择值.mp4 MUI - cardview(卡片视图)、mask(遮罩蒙版).mp4 MUI - accordion(折叠面板)、button(按钮).mp4 h.js 使用教程.mp4 MUI - actionsheet(操作表)、badge(数字角标).mp4 MUI - slide(轮播组件).mp4 APP与服务器之间的交互原理、MUI Ajax使用.mp4 MUI - progressbar(进度条)、滑块及switch开关.mp4 MUI - 事件管理及自定义事件详解.mp4 微信实战-结合MUI框架完成HTML5移动端混合应用开发视频教程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值