index.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <template>
  2. <!-- 列表 -->
  3. <scroll-view class="scroll-view" scroll-y refresher-enabled :refresher-triggered="isRefreshing"
  4. @refresherrefresh="onRefresh" @scrolltolower="onLoadMore">
  5. <!-- 空状态 -->
  6. <view v-if="!loading && !dataList.length" class="empty-state">
  7. <slot v-if="slotEmpty" name="empty"></slot>
  8. <u-empty v-else mode="list" text="暂无扫描记录" margin-top="200"></u-empty>
  9. </view>
  10. <slot></slot>
  11. <!-- 加载更多 -->
  12. <view class="load-more" v-if="dataList.length > 0">
  13. <u-divider bg-color="#f8f8f8">{{ hasMore ? '加载中...' : '我是有底线的' }}</u-divider>
  14. </view>
  15. </scroll-view>
  16. </template>
  17. <script>
  18. export default {
  19. data() {
  20. return {
  21. isRefreshing: false,
  22. loading: false,
  23. page: 1,
  24. hasMore: true,
  25. dataList: [],
  26. }
  27. },
  28. props: {
  29. url: {
  30. type: String,
  31. required: true,
  32. default: '/token/order/scanLogs'
  33. },
  34. pageSize: {
  35. type: Number,
  36. default: 10
  37. },
  38. slotEmpty: {
  39. type: Boolean,
  40. default: false
  41. }
  42. },
  43. onLoad() {
  44. this.loadData()
  45. },
  46. methods: {
  47. // 加载数据
  48. async loadData(isRefresh = false) {
  49. if (isRefresh) {
  50. this.page = 1
  51. this.hasMore = true
  52. }
  53. console.log(this.dataList, this.hasMore, this.loading, 'xxxxx')
  54. if (!this.hasMore || this.loading) return
  55. this.loading = true
  56. try {
  57. const res = await this.fetchBookList()
  58. if (isRefresh) {
  59. this.dataList = res.list
  60. } else {
  61. this.dataList = [...this.dataList, ...res.list]
  62. }
  63. this.$emit('updateList', this.dataList)
  64. this.hasMore = res.hasMore
  65. this.page++
  66. } catch (error) {
  67. uni.showToast({
  68. title: '加载失败',
  69. icon: 'none'
  70. })
  71. } finally {
  72. this.loading = false
  73. if (isRefresh) {
  74. this.isRefreshing = false
  75. }
  76. }
  77. },
  78. // 模拟获取数据
  79. fetchBookList() {
  80. return new Promise((resolve) => {
  81. uni.$u.http.get(this.url, {
  82. pageSize: this.pageSize,
  83. pageNum: this.page
  84. }).then(res => {
  85. resolve({
  86. list: res.rows,
  87. hasMore: res.rows.length < res.total - this.dataList.length
  88. })
  89. })
  90. })
  91. },
  92. reloadData() {
  93. this.page = 1
  94. this.fetchBookList()
  95. },
  96. // 下拉刷新
  97. async onRefresh() {
  98. if (this.loading) return
  99. this.isRefreshing = true
  100. await this.loadData(true)
  101. },
  102. // 上拉加载更多
  103. async onLoadMore() {
  104. if (this.loading || !this.hasMore) return
  105. await this.loadData()
  106. },
  107. }
  108. }
  109. </script>
  110. <style lang="scss">
  111. .scroll-view {
  112. height: calc(100vh - 88rpx);
  113. }
  114. .load-more {
  115. width: 100%;
  116. display: flex;
  117. color: #999999;
  118. font-size: 24rpx;
  119. padding: 30rpx 0;
  120. justify-content: center;
  121. }
  122. </style>