uni-app x 基于 list-view 或 scroll-view 来实现下拉加载更多,我们为大家封装了 ux-load-more-box 组件,来帮助开发者快速实现数据加载整个过程的动画效果。具体操作请参考下面的演示源码。
组合模式 : 开发者基于基础组件组合实现,优点 : 更加自由,缺点 : 需要自行编写相关逻辑代码。
在 App 中,基于 recycle-view 的 list,才能实现长列表的资源自动回收,以保障列表加载很多项目时,屏幕外的资源被有效回收。
list-view 就是基于 recycle-view 的 list 组件。
1 使用 list-view 或 scroll-view 作为核心布局组件。
2 监听 list-view 或 scroll-view 的触底事件 @scrolltolower。
3 通过上面的事件调整加载组件的状态,展示对应状态的提示内容。
4 触发加载更多事件时加载数据。
5 加载完成后调整并重置 加载组件的状态( 过程中通过状态来实现 防抖 )。
<template>
<!-- #ifdef APP -->
<list-view
class="scroll-view ux-flex1"
:scroll-y="true"
:custom-nested-scroll="true"
@scrolltolower="getData">
<list-item
v-for="item in dataList"
class="content-item">
<text
class="demo ux-text-center ux-color-grey3 ux-text-small ux-bg-grey6">{{item.plugin_name}}</text>
</list-item>
<list-item>
<ux-load-more-box :status="loadMoreStatus"></ux-load-more-box>
</list-item>
</list-view>
<!-- #endif -->
<!-- #ifdef H5 -->
<scroll-view
class="scroll-view ux-flex1"
:scroll-y="true"
:custom-nested-scroll="true"
@scrolltolower="getData">
<view
v-for="item in dataList"
class="content-item">
<text
class="demo ux-text-center ux-color-grey3 ux-text-small ux-bg-grey6">{{item.plugin_name}}</text>
</view>
<view>
<ux-load-more-box :status="loadMoreStatus"></ux-load-more-box>
</view>
</scroll-view>
<!-- #endif -->
</template>
<script lang="uts">
const SERVER_URL = "https://ext.dcloud.net.cn/plugin/uniappx-plugin-list"
const PAGE_SIZE = 10; // 每页数据量 10
type ListItem = {
plugin_id : number,
plugin_img_link : string,
plugin_name : string,
plugin_intro : string,
score : number,
tags : Array<string>,
update_date : string,
author_name : string,
}
type ResponseDataType = {
code : number,
data : ListItem[]
}
export default {
data() {
return {
// 数据列表
dataList : [] as ListItem[],
// 模拟页码
page : 1,
// 加载更多状态
loadMoreStatus : 0
}
},
created:function(){
this.getData();
},
methods: {
// 模拟数据加载请求
getData : function(){
// 只有当 loadMoreStatus== 0 时
// 才执行加载函数
// 从而实现防抖
if(this.loadMoreStatus != 0){
return ;
}
this.loadMoreStatus = 1;
uni.request<ResponseDataType>({
url: SERVER_URL,
data: {
type: '',
page: this.page,
page_size: PAGE_SIZE
},
success: (res) => {
const responseData = res.data
if (responseData == null) {
return
}
// 第一页
if(this.page == 1){
this.dataList = responseData.data;
this.loadMoreStatus = 0;
this.page = this.page + 1;
}else{
// 假设3页后加载全部数据
// 实际开发中利用接口返回值判断
if(this.page >= 3){
this.loadMoreStatus = 2;
}else{
this.loadMoreStatus = 0;
}
this.page = this.page + 1;
// 填充数据
this.dataList.push(...responseData.data);
}
},
});
}
}
}
</script>
<style scoped>
.demo{margin:30rpx; padding:60rpx;}
</style>