在微信项目中有应用过几个上拉加载更多的组件,但总会出现一些兼容性方面的bug,需要各种补漏(注:组件都是基于iscroll实现的, iscroll原本就有些坑)。Vux也有提供Scroller组件实现上拉加载或下拉刷新,但官方已经不再维护该组件(未实际使用过,不知是否有坑)。所以这次我们采用更为简单的方式来实现加载更多数据效果,废话不多说,直接看效果图。

实际效果图

实现思路

组件模板

<template>
<div>
<div v-for="(item,idx) in tableData"
:key="idx"
class="box">
<slot :item="item"></slot>
</div>
<load-more v-if="loading"
tip="正在加载"></load-more>
<load-more v-else
:show-loading="false"
@click.prevent.native="load"
:tip="tipText"
background-color="#fbf9fe"></load-more>
</div>
</template>

结合后端分页查询接口

export default {
data () {
const _this = this
return {
tableData: [], // 列表数据
loading: false,
isLoadMore: true,
// 查询参数
queryJson: (() => {
const { params } = _this
return params
})(), pageIndex: 1, // 当前页
total: 0 // 数据总条数
}
},
methods: {
load () {
if (!this.isLoadMore) {
return
}
this.fetch()
},
fetch () {
this.loading = true
let { url, pageSize, pageIndex, sortName, sordName, listField, totalField,
pageIndexField, pageSizeField, sortNameField, sordField } = this let params = Object.assign({}, this.queryJson) // 分页参数
params = Object.assign(params, {
[pageIndexField]: pageIndex,
[pageSizeField]: pageSize
})
// 排序参数
params = Object.assign(params, {
[sortNameField]: sortName,
[sordField]: sordName
})
axios.get(url, { params }).then(response => {
this.total = response[totalField] // 总数
let result = response[listField] // 当次加载的数据 // 是否还可以加载更多 此种逻辑设计存在缺陷,如果在浏览列表的同时,又增加了新的记录
this.isLoadMore = result.length === pageSize
this.pageIndex++
for (let item of result) {
this.tableData.push(item)
}
}).catch(error => {
console.error('获取数据失败 ', error)
}).finally(() => {
this.loading = false
})
}
}
}

变更loadmore组件内容

判断isLoadMore(是否正在加载)的值,以及tableData(显示数据列表内容) 的长度来控制底部loadmore组件显示的内容

computed: {
tipText () {
// 暂无数据, 没有更多数据, 轻按加载更多
if (!this.tableData || this.tableData.length === 0) {
return '暂无数据'
}
return this.isLoadMore ? '轻按加载更多' : '没有更多数据'
}
},

监听查询参数的变化

watch: {
params: function (val) {
this.queryJson = val
this.pageIndex = 1
this.tableData = []
this.fetch()
}
},

具体应用

<template>
<div>
<group title='钱包明细'>
<vloadmore v-bind="table">
<template slot-scope="{ item }">
<cell-box>
<!-- 具体每一行的布局 -->
</cell-box>
</template>
</vloadmore>
</group>
</div>
</template>
<script>
import { Group, CellBox } from 'vux'
import { CsLoadMore } from '@/components'
export default {
data () {
return {
table: {
url: '/pms/wallet/getpagelist',
pageSize: 3
}
}
},
components: {
Group,
CellBox,
vloadmore: CsLoadMore
}
}
</script>

源码

组件源码请查看https://github.com/yinboxie/BlogExampleDemo/tree/master/Vux

最新文章

  1. ansible入门
  2. 转-浅谈HTTP-GET 、 HTTP-POST 和SOAP
  3. 使用JDBC获取各数据库的Meta信息——表以及对应的列
  4. python 关于 ImportError: No module named 的问题
  5. ubantu下重启apache
  6. cannot be deleted directly via the port API: has device owner network:floatingip
  7. Creating LVM Logical Volumes
  8. ARP 和 RARP
  9. 一步一步深入spring(3)--spring的依赖注入方式
  10. 疯狂的 JAVA 后++
  11. 原生JavaScript实现一个简单的todo-list
  12. js 数组的一些基本操作
  13. django-debug-toolbar使用指南
  14. Java面向对象——类,对象和方法
  15. git 语法
  16. Remove duplicates from array
  17. PHP 获取url里文件的扩展名
  18. 面向对象总结、configparser配置文件模块、logging日志模块
  19. Python MySQL - 创建/查询/删除数据库
  20. Spring-data-jpa 学习笔记(一)

热门文章

  1. 张忠谋:3nm制程会出来 2nm后很难(摩尔定律还可维持10年)
  2. mysql/Java服务端对emoji的支持 专题
  3. android该怎么办iphone那种画面抖动的动画效果(含有button和EditText)
  4. Mac安装jupyter(原ipython)方法
  5. 升级PHPstudy自带的mysql版本 从5.5升级到5.7.22
  6. WPF 绑定父类属性
  7. html 自制属性
  8. 通通玩blend美工(2)——时钟
  9. CORS 专题
  10. SqlServer删除复制监视器中无效的发布名称