waterfall.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <template>
  2. <view>
  3. <helang-waterfall-list
  4. :status="waterfall.status"
  5. :list="waterfall.list"
  6. :reset="waterfall.reset"
  7. @click="onClick"
  8. @done="onDone"
  9. >
  10. <template>
  11. <view v-if="waterfall.status == 'await'">
  12. <view class="load-txt">上拉加载更多</view>
  13. </view>
  14. <view v-else-if="waterfall.status == 'loading'">
  15. <view class="load-txt">加载中</view>
  16. </view>
  17. <view v-else-if="waterfall.status == 'success'">
  18. <view class="load-txt">加载中</view>
  19. </view>
  20. <view v-else-if="waterfall.status == 'finish'">
  21. <view class="load-txt">没有更多了</view>
  22. </view>
  23. <view v-else-if="waterfall.status == 'fail'">
  24. <image class="load-icon" src="../../static/waterfall/fail.png"></image>
  25. <view class="load-txt">出错了,请刷新重试</view>
  26. </view>
  27. <view v-else-if="waterfall.status == 'empty'">
  28. <image class="load-icon" src="../../static/waterfall/empty.png"></image>
  29. <view class="load-txt">暂无数据</view>
  30. </view>
  31. <view v-else><!-- 别问我为什么要写一个 v-else 的空 view,不写H5平台就会有CSS生效的离谱BUG --></view>
  32. </template>
  33. </helang-waterfall-list>
  34. <view class="status-change" @tap="onStatusChange">
  35. <view>切换<br />状态</view>
  36. </view>
  37. </view>
  38. </template>
  39. <script>
  40. import helangWaterfallList from "@/uni_modules/helang-waterfall/components/waterfall/waterfall-list"
  41. // 列表接口模拟数据
  42. import mockData from '../../mock-data/waterfall-list.js'
  43. export default {
  44. components: {
  45. "helang-waterfall-list": helangWaterfallList
  46. },
  47. data() {
  48. return {
  49. // 异步请求相关
  50. ajax: {
  51. // 是否可以加载
  52. load: true,
  53. // 每页的请求条件
  54. rows:10,
  55. // 页码
  56. page:1,
  57. // 数据列表
  58. dataList:[]
  59. },
  60. // 瀑布流组件相关
  61. waterfall:{
  62. status:"",
  63. reset:false,
  64. list:[]
  65. }
  66. }
  67. },
  68. onReady() {
  69. this.getList();
  70. },
  71. // 触底触发
  72. onReachBottom() {
  73. this.getList();
  74. },
  75. // 下拉刷新
  76. onPullDownRefresh(){
  77. // 正常情况下接口返回应该很会很快。故意延迟调用,让用户有在刷新的体验感
  78. setTimeout(()=>{
  79. this.ajax.page = 1;
  80. this.ajax.load = true;
  81. this.getList();
  82. },800);
  83. },
  84. methods: {
  85. // 瀑布流组件点击事件
  86. onClick(data,index, tag){
  87. console.log(data);
  88. let direction = {
  89. "left":'左',
  90. "right":'右'
  91. }
  92. uni.showToast({
  93. title:`${direction[tag]}侧列表第${index+1}个被点击`,
  94. icon:'none'
  95. })
  96. },
  97. // 瀑布流组件渲染完成
  98. onDone(){
  99. // 设置组件为 非重置,这行代码保留不删即可
  100. this.waterfall.reset = false;
  101. // 恢复 getList 方法的调用
  102. this.ajax.load = true;
  103. this.ajax.page++;
  104. // 设置组件状态为 等待加载
  105. this.waterfall.status = 'await';
  106. /**
  107. * 如果你是一个追求完美的开发者,可以通过判断当前数据的长度和请求的数据长度来优化前端请求,减少不必要请求
  108. * 不需要则删除
  109. * */
  110. /**
  111. if(this.ajax.dataCount >= this.ajax.rows){
  112. this.ajax.load = true;
  113. this.ajax.page++;
  114. }
  115. */
  116. },
  117. // 获取数据
  118. getList() {
  119. if (!this.ajax.load) {
  120. return;
  121. }
  122. this.ajax.load = false;
  123. // 设置状态为加载中
  124. this.waterfall.status = 'loading';
  125. // 请求数据, mockData.getList 示例一个 ajax 请求
  126. mockData.getList({
  127. pageNum:this.ajax.page,
  128. pageSize:this.ajax.rows
  129. }).then(res=>{
  130. // 获取到的数据,请注意数据结构
  131. console.log(res);
  132. // 第一页数据执行以下代码
  133. if(this.ajax.page == 1){
  134. // 关闭下拉
  135. uni.stopPullDownRefresh();
  136. // 设置组件状态为 重置,可供下拉刷新这类需要重置列表功能时使用
  137. this.waterfall.reset = true;
  138. }
  139. // 数据无效时处理
  140. if(!res || res.length < 1){
  141. // 设置组件为 加载结束 状态
  142. this.waterfall.status = 'finish';
  143. return;
  144. }
  145. // 将数据赋值给瀑布流 list 属性
  146. this.waterfall.list = res;
  147. // 设置组件为 加载成功 状态,此时瀑布流组件开始计算当前数据的布局
  148. this.waterfall.status = 'success';
  149. /**
  150. * 下方的代码为扩展其他功能的示例代码 可做参考,不需要可删除
  151. * */
  152. // 缓存当前数据给其他需要该数据的功能使用
  153. if(this.ajax.page == 1){
  154. this.ajax.dataList = res;
  155. }else{
  156. this.ajax.dataList = [...this.ajax.dataList,...res];
  157. }
  158. // 记录本次数据长度,意义请看 done 事件的回调
  159. this.ajax.dataCount = res.length || 0;
  160. // 。。。下面不需要写代码了,等待组件渲染完成
  161. })
  162. },
  163. // 导航状态切换演示监听
  164. onStatusChange(){
  165. uni.showActionSheet({
  166. itemList: ['常规', '加载异常', '加载错误'],
  167. success: (res)=> {
  168. switch(res.tapIndex){
  169. case 0:
  170. this.ajax.page = 1;
  171. this.ajax.load = true;
  172. this.getList();
  173. break;
  174. case 1:
  175. // alert(111)
  176. this.waterfall.status = 'fail';
  177. break;
  178. case 2:
  179. this.waterfall.status = 'empty';
  180. break;
  181. default:
  182. }
  183. }
  184. });
  185. },
  186. }
  187. }
  188. </script>
  189. <style lang="scss">
  190. page {
  191. background-color: #f3f3f3;
  192. }
  193. .load-txt{
  194. padding: 0 0 20rpx 0;
  195. text-align: center;
  196. color: #999;
  197. font-size: 24rpx;
  198. }
  199. .load-icon{
  200. width: 300rpx;
  201. height: 300rpx;
  202. margin: 0 auto 20rpx auto;
  203. display: block;
  204. }
  205. .status-change{
  206. position: fixed;
  207. right: 10rpx;
  208. top: 60%;
  209. width: 80rpx;
  210. height: 80rpx;
  211. z-index: 100;
  212. font-size: 24rpx;
  213. border-radius: 50%;
  214. background-color: #0089ff;
  215. color: #fff;
  216. line-height: 1;
  217. opacity: .33;
  218. display: flex;
  219. flex-direction: row;
  220. flex-wrap: nowrap;
  221. justify-content: center;
  222. align-items: center;
  223. align-content: center;
  224. }
  225. </style>