如果优美地实现加载更多
前言
在小程序或者原生app开发的时候,为了更好的体验,需要翻页的列表往往在触底的时候需要显示加载中,在没有数据后显示没有更多了。
分析
- 一直在底部显示”加载中”,但是在视窗范围内看不到,在触底的时候发起翻页请求(此时可以看到”加载中”),等数据返回后,将”加载中”顶到最下面。
- 判断count数和list长度相等时隐藏”加载中”,显示”没有更多了”,并且不再请求
实现
假设后端返回的数据结构为:
1 2 3 4 5 6 7
| { code: 1001, result: { count: 37, items: [...] } }
|
以小程序为例,我们全局声明变量
1 2 3 4 5 6
| data: { list: [], // 列表 currentPage: 0, // 当前页 count: 0, // 列表总数 pageLoading: false, // 控制页面laoding的变量 },
|
在wxml结构中:
1 2 3 4 5 6
| <view wx:if="{{ list.length !== count && !pageLoading }}" class="loading-text"> 正在加载<dot>...</dot> </view> <view wx:if="{{ list.length === count && !pageLoading }}" class="no-more-text"> 没有更多了~ </view>
|
在js中的逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| async onLoad() { this.setData({ pageLoading: true, }) await this.goPage() this.setData({ pageLoading: false, }) }, goPage() { return new Promise(async (resolve) => { const res = await axios.get('/users', { page: this.currentPage, pageSize: 10, }) if (res.code !== 1001) { resolve(false) } this.setData({ list: this.data.list.contact(res.result.items || []), count: res.result.count, }) resolve() }) }, onReachBottom() { if (this.data.list.length === this.data.count) return // 没有更多后不再请求 this.setData({ currentPage: this.data.currentPage + 1, }) this.goPage() // 执行请求,page参数使用currentPage },
|
wxss部分,点点点的动效:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| /* 加载更多 点点点的动效 */ dot { display: inline-block; height: 1em; line-height: 1; text-align: left; vertical-align: -.25em; overflow: hidden; } dot::before { display: block; content: '...\A..\A.\A'; white-space: pre-wrap; /* 也可以是white-space: pre */ animation: dot 2s infinite step-start both; } @keyframes dot { 25% { transform: translateY(-3em); } 50% { transform: translateY(-2em); } 75% { transform: translateY(-1em); } }
|
css特效参考自张鑫旭的博客:
CSS3 animation渐进实现点点点等待提示效果