z-paging.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <!-- _
  2. ____ _ __ __ _ __ _(_)_ __ __ _
  3. |_ /____| '_ \ / _` |/ _` | | '_ \ / _` |
  4. / /_____| |_) | (_| | (_| | | | | | (_| |
  5. /___| | .__/ \__,_|\__, |_|_| |_|\__, |
  6. |_| |___/ |___/
  7. V1.9.3
  8. by ZXLee 2021-07-12
  9. -- >
  10. <!-- API文档地址:http://z-paging.com -->
  11. <!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->
  12. <!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->
  13. <!-- 反馈QQ群:790460711 -->
  14. <template name="z-paging">
  15. <!-- #ifndef APP-NVUE -->
  16. <view :class="!usePageScroll&&fixed?'z-paging-content z-paging-content-fixed':'z-paging-content'"
  17. :style="[finalPagingStyle]">
  18. <!-- 顶部固定的slot -->
  19. <slot v-if="!usePageScroll&&$slots.top" name="top"></slot>
  20. <view class="zp-page-scroll-top" v-else-if="usePageScroll&&$slots.top" :style="[{'top':`${windowTop}px`,'z-index':topZIndex}]">
  21. <slot name="top"></slot>
  22. </view>
  23. <view :class="{'zp-scroll-view-super':!usePageScroll}" :style="[finalScrollViewStyle]">
  24. <scroll-view
  25. :class="{'zp-scroll-view':true,'zp-scroll-view-absolute':!usePageScroll}"
  26. :scroll-top="scrollTop"
  27. :scroll-y="scrollable&&!usePageScroll&&scrollEnable" :enable-back-to-top="finalEnableBackToTop"
  28. :show-scrollbar="showScrollbar" :scroll-with-animation="finalScrollWithAnimation"
  29. :scroll-into-view="scrollIntoView" :lower-threshold="finalLowerThreshold" :upper-threshold="5"
  30. :refresher-enabled="finalRefresherEnabled&&!useCustomRefresher" :refresher-threshold="finalRefresherThreshold"
  31. :refresher-default-style="finalRefresherDefaultStyle" :refresher-background="refresherBackground"
  32. :refresher-triggered="refresherTriggered" @scroll="_scroll" @scrolltolower="_onLoadingMore('toBottom')"
  33. @scrolltoupper="_scrollToUpper" @refresherrestore="_onRestore" @refresherrefresh="_onRefresh"
  34. >
  35. <view class="zp-paging-touch-view"
  36. <!-- #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  37. @touchstart="_refresherTouchstart" @touchmove="_refresherTouchmove" @touchend="_refresherTouchend" @touchcancel="_refresherTouchend"
  38. <!-- #endif -->
  39. <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  40. @touchstart="pagingWxs.touchstart" @touchmove="pagingWxs.touchmove" @touchend="pagingWxs.touchend" @touchcancel="pagingWxs.touchend"
  41. @mousedown="pagingWxs.mousedown" @mousemove="pagingWxs.mousemove" @mouseup="pagingWxs.mouseup" @mouseleave="pagingWxs.mouseleave"
  42. <!-- #endif -->
  43. >
  44. <view v-if="finalRefresherFixedBacHeight>0" class="zp-fixed-bac-view" :style="[{'background-color': refresherFixedBackground,'height': `${finalRefresherFixedBacHeight}px`}]"></view>
  45. <view class="zp-paging-main" :style="[{'transform': finalRefresherTransform,'transition': refresherTransition}]"
  46. <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  47. :change:prop="pagingWxs.propObserver" :prop="wxsPropType"
  48. :data-refresherThreshold="finalRefresherThreshold" :data-isIos="isIos"
  49. :data-loading="loading" :data-useChatRecordMode="useChatRecordMode"
  50. :data-refresherEnabled="refresherEnabled" :data-useCustomRefresher="useCustomRefresher" :data-pageScrollTop="wxsPageScrollTop"
  51. :data-scrollTop="wxsScrollTop" :data-refresherMaxAngle="refresherMaxAngle"
  52. :data-refresherAecc="refresherAngleEnableChangeContinued" :data-usePageScroll="usePageScroll"
  53. :data-oldIsTouchmoving="isTouchmoving" :data-refresherOutRate="finalRefresherOutRate"
  54. <!-- #endif -->
  55. <!-- #ifdef APP-VUE || H5 -->
  56. :change:renderPropScrollTop="pagingRenderjs.renderPropScrollTopChange" :renderPropScrollTop="renderPropScrollTop"
  57. :change:renderUsePageScroll="pagingRenderjs.renderUsePageScrollChange" :renderUsePageScroll="renderUsePageScroll"
  58. <!-- #endif -->
  59. >
  60. <view v-if="finalRefresherEnabled&&useCustomRefresher&&isTouchmoving" class="zp-custom-refresher-view"
  61. :style="[{'margin-top': `-${finalRefresherThreshold}px`,'background-color': refresherBackground}]">
  62. <view :style="[{'height': `${finalRefresherThreshold}px`,'background-color': refresherBackground}]">
  63. <!-- 下拉刷新view -->
  64. <slot
  65. <!-- #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO || MP-BAIDU -->
  66. v-if="zScopedSlots.refresher"
  67. <!-- #endif -->
  68. <!-- #ifndef MP-WEIXIN || MP-QQ || MP-TOUTIAO || MP-BAIDU -->
  69. v-if="$scopedSlots.refresher||$slots.refresher"
  70. <!-- #endif -->
  71. <!-- #ifndef MP-QQ -->
  72. :refresherStatus="refresherStatus"
  73. <!-- #endif -->
  74. name="refresher" />
  75. <z-paging-refresh ref="refresh" v-else :style="[{'height': `${finalRefresherThreshold}px`}]" :refresherStatus="refresherStatus"
  76. :defaultThemeStyle="finalRefresherThemeStyle" :refresherDefaultText="finalRefresherDefaultText"
  77. :refresherPullingText="finalRefresherPullingText" :refresherRefreshingText="finalRefresherRefreshingText"
  78. :showRefresherUpdateTime="showRefresherUpdateTime" :refresherUpdateTimeKey="refresherUpdateTimeKey"></z-paging-refresh>
  79. </view>
  80. </view>
  81. <view class="zp-paging-container">
  82. <slot v-if="useChatRecordMode&&$slots.chatLoading&&loadingStatus!==2&&realTotalData.length"
  83. name="chatLoading" />
  84. <view v-else-if="useChatRecordMode&&loadingStatus!==2&&realTotalData.length"
  85. class="zp-chat-record-loading-container">
  86. <text v-if="loadingStatus!==1" @click="_scrollToUpper()"
  87. :class="defaultThemeStyle==='white'?'zp-loading-more-text zp-loading-more-text-white':'zp-loading-more-text zp-loading-more-text-black'">{{chatRecordLoadingMoreText}}</text>
  88. <image v-else :src="base64Flower" class="zp-chat-record-loading-custom-image">
  89. </image>
  90. </view>
  91. <slot v-if="$slots.loading&&!firstPageLoaded&&(autoHideLoadingAfterFirstLoaded?!pagingLoaded:true)&&loading" name="loading" />
  92. <!-- 空数据图 -->
  93. <view class="zp-empty-view"
  94. v-if="showEmpty">
  95. <slot v-if="$slots.empty" name="empty" />
  96. <z-paging-empty-view v-else :emptyViewImg="finalEmptyViewImg" :emptyViewText="finalEmptyViewText" :showEmptyViewReload="finalShowEmptyViewReload" :emptyViewReloadText="finalEmptyViewReloadText" :isLoadFailed="isLoadFailed" :emptyViewStyle="emptyViewStyle" :emptyViewTitleStyle="emptyViewTitleStyle" :emptyViewImgStyle="emptyViewImgStyle" :emptyViewReloadStyle="emptyViewReloadStyle" :emptyViewZIndex="emptyViewZIndex" @reload="_emptyViewReload">
  97. </z-paging-empty-view>
  98. </view>
  99. <!-- 主体内容 -->
  100. <view class="zp-paging-container-content" :style="[finalPagingContentStyle]">
  101. <slot />
  102. </view>
  103. <!-- 上拉加载更多view -->
  104. <!-- #ifndef MP-ALIPAY -->
  105. <slot v-if="_shouldShowLoading('loadingMoreDefault')" name="loadingMoreDefault" />
  106. <slot v-else-if="_shouldShowLoading('loadingMoreLoading')" name="loadingMoreLoading" />
  107. <slot v-else-if="_shouldShowLoading('loadingMoreNoMore')" name="loadingMoreNoMore" />
  108. <slot v-else-if="_shouldShowLoading('loadingMoreFail')" name="loadingMoreFail" />
  109. <z-paging-load-more @click.native="_onLoadingMore('click')"
  110. v-else-if="_shouldShowLoading('loadingMoreCustom')" :zConfig="zPagingLoadMoreConfig">
  111. </z-paging-load-more>
  112. <!-- #endif -->
  113. <!-- #ifdef MP-ALIPAY -->
  114. <slot v-if="loadingStatus===0&&$slots.loadingMoreDefault&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode"
  115. name="loadingMoreDefault" />
  116. <slot v-else-if="loadingStatus===1&&$slots.loadingMoreLoading&&showLoadingMore&&loadingMoreEnabled"
  117. name="loadingMoreLoading" />
  118. <slot v-else-if="loadingStatus===2&&$slots.loadingMoreNoMore&&showLoadingMore&&showLoadingMoreNoMoreView&&loadingMoreEnabled&&!useChatRecordMode"
  119. name="loadingMoreNoMore" />
  120. <slot v-else-if="loadingStatus===3&&$slots.loadingMoreFail&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode"
  121. name="loadingMoreFail" />
  122. <z-paging-load-more @click.native="_onLoadingMore('click')" v-else-if="showLoadingMore&&showDefaultLoadingMoreText&&!(loadingStatus===2&&!showLoadingMoreNoMoreView)&&loadingMoreEnabled&&!useChatRecordMode" :zConfig="zPagingLoadMoreConfig">
  123. </z-paging-load-more>
  124. <!-- #endif -->
  125. </view>
  126. </view>
  127. </view>
  128. </scroll-view>
  129. </view>
  130. <slot v-if="!usePageScroll&&$slots.bottom" name="bottom"></slot>
  131. <view class="zp-page-scroll-bottom" v-else-if="usePageScroll&&$slots.bottom" :style="[{'bottom': `${windowBottom}px`}]">
  132. <slot name="bottom"></slot>
  133. </view>
  134. <view v-if="showBackToTopClass" :class="backToTopClass" :style="[finalBackToTopStyle]" @click.stop="_backToTopClick">
  135. <image class="zp-back-to-top-img" :src="backToTopImg.length?backToTopImg:base64BackToTop"></image>
  136. </view>
  137. </view>
  138. <!-- #endif -->
  139. <!-- #ifdef APP-NVUE -->
  140. <view :is="finalNvueSuperListIs">
  141. <view ref="zp-page-scroll-top" :is="nViewIs" class="zp-page-scroll-top" v-if="$slots.top" :style="[{'top':`${windowTop}px`,'z-index':topZIndex}]">
  142. <slot name="top"></slot>
  143. </view>
  144. <view ref="n-list" id="z-paging-nlist" :style="[scrollViewStyle,useChatRecordMode ? {transform: nIsFirstPageAndNoMore?'rotate(0deg)':'rotate(180deg)'}:{}]" :is="finalNvueListIs" alwaysScrollableVertical="true"
  145. :fixFreezing="nFixFreezing" :show-scrollbar="showScrollbar" :loadmoreoffset="finalLowerThreshold"
  146. :scrollable="scrollable&&scrollEnable" :bounce="nvueBounce" :column-count="nWaterfallColumnCount" :column-width="nWaterfallColumnWidth"
  147. :column-gap="nWaterfallColumnGap" :left-gap="nWaterfallLeftGap" :right-gap="nWaterfallRightGap"
  148. @loadmore="_nOnLoadmore" @scroll="_nOnScroll">
  149. <refresh class="zp-n-refresh" v-if="finalNvueListIs!=='view'&&refresherEnabled&&!nShowRefresherReveal&&!useChatRecordMode" :display="nRefresherLoading?'show':'hide'" @refresh="_nOnRrefresh"
  150. @pullingdown="_nOnPullingdown">
  151. <view ref="zp-n-refresh-container" class="zp-n-refresh-container">
  152. <!-- 下拉刷新view -->
  153. <slot v-if="zScopedSlots.refresher" :refresherStatus="refresherStatus" name="refresher" />
  154. <z-paging-refresh ref="refresh" v-else :refresherStatus="refresherStatus" :defaultThemeStyle="finalRefresherThemeStyle"
  155. :refresherDefaultText="finalRefresherDefaultText" :refresherPullingText="finalRefresherPullingText" :refresherRefreshingText="finalRefresherRefreshingText"
  156. :showRefresherUpdateTime="showRefresherUpdateTime" :refresherUpdateTimeKey="refresherUpdateTimeKey"></z-paging-refresh>
  157. </view>
  158. </refresh>
  159. <view ref="zp-n-list-top-tag" class="zp-n-list-top-tag" :is="nViewIs"></view>
  160. <view v-if="nShowRefresherReveal" ref="zp-n-list-refresher-reveal" :style="[{transform:`translateY(-${nShowRefresherRevealHeight}px)`,height:'0px'}]" :is="nViewIs">
  161. <slot v-if="zScopedSlots.refresher" :refresherStatus="refresherStatus" name="refresher" />
  162. <z-paging-refresh ref="refresh" v-else :refresherStatus="refresherStatus" :defaultThemeStyle="finalRefresherThemeStyle"
  163. :refresherDefaultText="finalRefresherDefaultText" :refresherPullingText="finalRefresherPullingText" :refresherRefreshingText="finalRefresherRefreshingText"
  164. :showRefresherUpdateTime="showRefresherUpdateTime" :refresherUpdateTimeKey="refresherUpdateTimeKey"></z-paging-refresh>
  165. </view>
  166. <slot />
  167. <!-- 空数据图 -->
  168. <view style="flex: 1;" key="z-paging-empty-view" :style="[scrollViewStyle,useChatRecordMode ? {transform: nIsFirstPageAndNoMore?'rotate(0deg)':'rotate(180deg)'}:{}]" v-if="showEmpty" :is="finalNvueListIs==='scroller'?'view':finalNvueListIs==='waterfall'?'header':'cell'">
  169. <view class="zp-empty-view">
  170. <slot v-if="$slots.empty" name="empty" />
  171. <z-paging-empty-view v-else :emptyViewImg="finalEmptyViewImg" :emptyViewText="finalEmptyViewText" :showEmptyViewReload="finalShowEmptyViewReload" :emptyViewReloadText="finalEmptyViewReloadText" :isLoadFailed="isLoadFailed" :emptyViewStyle="emptyViewStyle" :emptyViewTitleStyle="emptyViewTitleStyle" :emptyViewImgStyle="emptyViewImgStyle" :emptyViewReloadStyle="emptyViewReloadStyle" :emptyViewZIndex="emptyViewZIndex" @reload="_emptyViewReload">
  172. </z-paging-empty-view>
  173. </view>
  174. </view>
  175. <view ref="zp-n-list-bottom-tag" class="zp-n-list-bottom-tag" is="header"></view>
  176. <!-- 全屏 -->
  177. <view style="flex: 1;" :style="[scrollViewStyle,useChatRecordMode ? {transform: nIsFirstPageAndNoMore?'rotate(0deg)':'rotate(180deg)'}:{}]" v-if="$slots.loading&&!firstPageLoaded&&(autoHideLoadingAfterFirstLoaded?!pagingLoaded:true)&&loading" :is="finalNvueListIs==='scroller'?'view':finalNvueListIs==='waterfall'?'header':'cell'">
  178. <slot name="loading" />
  179. </view>
  180. <!-- 上拉加载更多view -->
  181. <view :is="nViewIs">
  182. <view v-if="useChatRecordMode">
  183. <view v-if="loadingStatus!==2&&realTotalData.length">
  184. <slot v-if="$slots.chatLoading"
  185. name="chatLoading" />
  186. <view v-else class="zp-chat-record-loading-container">
  187. <text v-if="loadingStatus!==1" @click="_scrollToUpper()"
  188. :class="defaultThemeStyle==='white'?'zp-loading-more-text zp-loading-more-text-white':'zp-loading-more-text zp-loading-more-text-black'">{{chatRecordLoadingMoreText}}</text>
  189. <view>
  190. <loading-indicator v-if="loadingStatus===1" :animating="true"
  191. class="zp-loading-more-line-loading-image">
  192. </loading-indicator>
  193. </view>
  194. </view>
  195. </view>
  196. </view>
  197. <view :style="nLoadingMoreFixedHeight?{height:loadingMoreCustomStyle&&loadingMoreCustomStyle.height?loadingMoreCustomStyle.height:'80rpx'}:{}">
  198. <slot v-if="_shouldShowLoading('loadingMoreDefault')" name="loadingMoreDefault" />
  199. <slot v-else-if="_shouldShowLoading('loadingMoreLoading')" name="loadingMoreLoading" />
  200. <slot v-else-if="_shouldShowLoading('loadingMoreNoMore')" name="loadingMoreNoMore" />
  201. <slot v-else-if="_shouldShowLoading('loadingMoreFail')" name="loadingMoreFail" />
  202. <z-paging-load-more @click.native="_onLoadingMore('click')"
  203. v-else-if="_shouldShowLoading('loadingMoreCustom')" :zConfig="zPagingLoadMoreConfig">
  204. </z-paging-load-more>
  205. </view>
  206. </view>
  207. </view>
  208. <slot name="bottom"></slot>
  209. <view v-if="showBackToTopClass" :class="backToTopClass" :style="[finalBackToTopStyle]" @click.stop="_backToTopClick">
  210. <image class="zp-back-to-top-img" :src="backToTopImg.length?backToTopImg:base64BackToTop"></image>
  211. </view>
  212. </view>
  213. <!-- #endif -->
  214. </template>
  215. <script
  216. src="./js/z-paging-main.js"></script>
  217. <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  218. <script
  219. src="./wxs/z-paging-wxs.wxs"
  220. module="pagingWxs"
  221. lang="wxs"
  222. ></script>
  223. <!-- #endif -->
  224. <!-- #ifdef APP-VUE || H5 -->
  225. <script module="pagingRenderjs" lang="renderjs">
  226. import pagingRenderjs from './wxs/z-paging-renderjs.js';
  227. export default {
  228. mixins: [pagingRenderjs]
  229. }
  230. </script>
  231. <!-- #endif -->
  232. <style scoped>
  233. @import "./css/z-paging-main.css";
  234. @import "./css/z-paging-static.css";
  235. </style>