z-paging.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. <!-- _
  2. ____ _ __ __ _ __ _(_)_ __ __ _
  3. |_ /____| '_ \ / _` |/ _` | | '_ \ / _` |
  4. / /_____| |_) | (_| | (_| | | | | | (_| |
  5. /___| | .__/ \__,_|\__, |_|_| |_|\__, |
  6. |_| |___/ |___/
  7. v2.7.11 (2024-06-28)
  8. by ZXLee
  9. -->
  10. <!-- 文档地址:https://z-paging.zxlee.cn -->
  11. <!-- github地址:https://github.com/SmileZXLee/uni-z-paging -->
  12. <!-- dcloud地址:https://ext.dcloud.net.cn/plugin?id=3935 -->
  13. <!-- 反馈QQ群:790460711(已满)、371624008 -->
  14. <template name="z-paging">
  15. <!-- #ifndef APP-NVUE -->
  16. <view :class="{'z-paging-content':true,'z-paging-content-full':!usePageScroll,'z-paging-content-fixed':!usePageScroll&&fixed,'z-paging-content-page':usePageScroll,'z-paging-reached-top':renderPropScrollTop<1,'z-paging-use-chat-record-mode':useChatRecordMode}" :style="[finalPagingStyle]">
  17. <!-- #ifndef APP-PLUS -->
  18. <view v-if="cssSafeAreaInsetBottom===-1" class="zp-safe-area-inset-bottom"></view>
  19. <!-- #endif -->
  20. <!-- 二楼view -->
  21. <view v-if="showF2 && showRefresherF2" @touchmove.stop.prevent class="zp-f2-content" :style="[{'transform': f2Transform, 'transition': `transform .2s linear`, 'height': superContentHeight + 'px', 'z-index': f2ZIndex}]">
  22. <slot name="f2"/>
  23. </view>
  24. <!-- 顶部固定的slot -->
  25. <slot v-if="!usePageScroll&&zSlots.top" name="top" />
  26. <view class="zp-page-top" @touchmove.stop.prevent v-else-if="usePageScroll&&zSlots.top" :style="[{'top':`${windowTop}px`,'z-index':topZIndex}]">
  27. <slot name="top" />
  28. </view>
  29. <view :class="{'zp-view-super':true,'zp-scroll-view-super':!usePageScroll}" :style="[finalScrollViewStyle]">
  30. <view v-if="zSlots.left" :class="{'zp-page-left':true,'zp-absoulte':finalIsOldWebView}">
  31. <slot name="left" />
  32. </view>
  33. <view :class="{'zp-scroll-view-container':true,'zp-absoulte':finalIsOldWebView}" :style="[scrollViewContainerStyle]">
  34. <scroll-view
  35. ref="zp-scroll-view" :class="{'zp-scroll-view':true,'zp-scroll-view-absolute':!usePageScroll,'zp-scroll-view-hide-scrollbar':!showScrollbar}" :style="[chatRecordRotateStyle]"
  36. :scroll-top="scrollTop" :scroll-x="scrollX"
  37. :scroll-y="finalScrollable" :enable-back-to-top="finalEnableBackToTop"
  38. :show-scrollbar="showScrollbar" :scroll-with-animation="finalScrollWithAnimation"
  39. :scroll-into-view="scrollIntoView" :lower-threshold="finalLowerThreshold" :upper-threshold="5"
  40. :refresher-enabled="finalRefresherEnabled&&!useCustomRefresher" :refresher-threshold="finalRefresherThreshold"
  41. :refresher-default-style="finalRefresherDefaultStyle" :refresher-background="refresherBackground"
  42. :refresher-triggered="finalRefresherTriggered" @scroll="_scroll" @scrolltolower="_onScrollToLower"
  43. @scrolltoupper="_onScrollToUpper" @refresherrestore="_onRestore" @refresherrefresh="_onRefresh(true)"
  44. >
  45. <view class="zp-paging-touch-view"
  46. <!-- #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  47. @touchstart="_refresherTouchstart" @touchmove="_refresherTouchmove" @touchend="_refresherTouchend" @touchcancel="_refresherTouchend"
  48. <!-- #endif -->
  49. <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  50. @touchstart="pagingWxs.touchstart" @touchmove="pagingWxs.touchmove" @touchend="pagingWxs.touchend" @touchcancel="pagingWxs.touchend"
  51. @mousedown="pagingWxs.mousedown" @mousemove="pagingWxs.mousemove" @mouseup="pagingWxs.mouseup" @mouseleave="pagingWxs.mouseleave"
  52. <!-- #endif -->
  53. >
  54. <view v-if="finalRefresherFixedBacHeight>0" class="zp-fixed-bac-view" :style="[{'background': refresherFixedBackground,'height': `${finalRefresherFixedBacHeight}px`}]"></view>
  55. <view class="zp-paging-main" :style="[scrollViewInStyle,{'transform': finalRefresherTransform,'transition': refresherTransition}]"
  56. <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  57. :change:prop="pagingWxs.propObserver" :prop="wxsPropType"
  58. :data-refresherThreshold="finalRefresherThreshold" :data-refresherF2Enabled="refresherF2Enabled" :data-refresherF2Threshold="finalRefresherF2Threshold" :data-isIos="isIos"
  59. :data-loading="loading||isRefresherInComplete" :data-useChatRecordMode="useChatRecordMode"
  60. :data-refresherEnabled="refresherEnabled" :data-useCustomRefresher="useCustomRefresher" :data-pageScrollTop="wxsPageScrollTop"
  61. :data-scrollTop="wxsScrollTop" :data-refresherMaxAngle="refresherMaxAngle" :data-refresherNoTransform="refresherNoTransform"
  62. :data-refresherAecc="refresherAngleEnableChangeContinued" :data-usePageScroll="usePageScroll" :data-watchTouchDirectionChange="watchTouchDirectionChange"
  63. :data-oldIsTouchmoving="isTouchmoving" :data-refresherOutRate="finalRefresherOutRate" :data-refresherPullRate="finalRefresherPullRate" :data-hasTouchmove="hasTouchmove"
  64. <!-- #endif -->
  65. <!-- #ifdef APP-VUE || H5 -->
  66. :change:renderPropIsIosAndH5="pagingRenderjs.renderPropIsIosAndH5Change" :renderPropIsIosAndH5="isIosAndH5"
  67. <!-- #endif -->
  68. >
  69. <view v-if="showRefresher" class="zp-custom-refresher-view" :style="[{'margin-top': `-${finalRefresherThreshold+refresherThresholdUpdateTag}px`,'background': refresherBackground,'opacity': isTouchmoving ? 1 : 0}]">
  70. <view class="zp-custom-refresher-container" :style="[{'height': `${finalRefresherThreshold}px`,'background': refresherBackground}]">
  71. <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" />
  72. <!-- 下拉刷新view -->
  73. <view class="zp-custom-refresher-slot-view">
  74. <slot v-if="!(zSlots.refresherComplete&&refresherStatus===R.Complete)&&!(zSlots.refresherF2&&refresherStatus===R.GoF2)" :refresherStatus="refresherStatus" name="refresher" />
  75. </view>
  76. <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" />
  77. <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" />
  78. <z-paging-refresh ref="refresh" v-else-if="!showCustomRefresher" class="zp-custom-refresher-refresh" :style="[{'height': `${finalRefresherThreshold - finalRefresherThresholdPlaceholder}px`}]" :status="refresherStatus"
  79. :defaultThemeStyle="finalRefresherThemeStyle" :defaultText="finalRefresherDefaultText"
  80. :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text"
  81. :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated"
  82. :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap"
  83. :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" />
  84. </view>
  85. </view>
  86. <view class="zp-paging-container" :style="[{justifyContent:useChatRecordMode?'flex-end':'flex-start'}]">
  87. <!-- 全屏Loading -->
  88. <slot v-if="showLoading&&zSlots.loading&&!loadingFullFixed" name="loading" />
  89. <!-- 主体内容 -->
  90. <view class="zp-paging-container-content" :style="[{transform:virtualPlaceholderTopHeight>0?`translateY(${virtualPlaceholderTopHeight}px)`:'none'},finalPagingContentStyle]">
  91. <slot />
  92. <!-- 内置列表&虚拟列表 -->
  93. <template v-if="finalUseInnerList">
  94. <slot name="header"/>
  95. <view class="zp-list-container" :style="[innerListStyle]">
  96. <template v-if="finalUseVirtualList">
  97. <view class="zp-list-cell" :style="[innerCellStyle]" :id="`zp-id-${item[virtualCellIndexKey]}`" v-for="(item,index) in virtualList" :key="item['zp_unique_index']" @click="_innerCellClick(item,virtualTopRangeIndex+index)">
  98. <view v-if="useCompatibilityMode">使用兼容模式请在组件源码z-paging.vue第99行中注释这一行,并打开下面一行注释</view>
  99. <!-- <zp-public-virtual-cell v-if="useCompatibilityMode" :extraData="extraData" :item="item" :index="virtualTopRangeIndex+index" /> -->
  100. <slot v-else name="cell" :item="item" :index="virtualTopRangeIndex+index"/>
  101. </view>
  102. </template>
  103. <template v-else>
  104. <view class="zp-list-cell" v-for="(item,index) in realTotalData" :key="index" @click="_innerCellClick(item,index)">
  105. <slot name="cell" :item="item" :index="index"/>
  106. </view>
  107. </template>
  108. </view>
  109. <slot name="footer"/>
  110. </template>
  111. <!-- 聊天记录模式加载更多loading -->
  112. <template v-if="useChatRecordMode&&realTotalData.length>=defaultPageSize&&(loadingStatus!==M.NoMore||zSlots.chatNoMore)&&(realTotalData.length||(showChatLoadingWhenReload&&showLoading))&&!isFirstPageAndNoMore">
  113. <view :style="[chatRecordRotateStyle]">
  114. <slot v-if="loadingStatus===M.NoMore&&zSlots.chatNoMore" name="chatNoMore" />
  115. <template v-else>
  116. <slot v-if="zSlots.chatLoading" :loadingMoreStatus="loadingStatus" name="chatLoading" />
  117. <z-paging-load-more v-else @doClick="_onLoadingMore('click')" :zConfig="zLoadMoreConfig" />
  118. </template>
  119. </view>
  120. </template>
  121. <!-- 虚拟列表底部占位view -->
  122. <view v-if="useVirtualList" class="zp-virtual-placeholder" :style="[{height:virtualPlaceholderBottomHeight+'px'}]"/>
  123. <!-- 上拉加载更多view -->
  124. <!-- #ifndef MP-ALIPAY -->
  125. <slot v-if="showLoadingMoreDefault" name="loadingMoreDefault" />
  126. <slot v-else-if="showLoadingMoreLoading" name="loadingMoreLoading" />
  127. <slot v-else-if="showLoadingMoreNoMore" name="loadingMoreNoMore" />
  128. <slot v-else-if="showLoadingMoreFail" name="loadingMoreFail" />
  129. <z-paging-load-more @doClick="_onLoadingMore('click')" v-else-if="showLoadingMoreCustom" :zConfig="zLoadMoreConfig" />
  130. <!-- #endif -->
  131. <!-- #ifdef MP-ALIPAY -->
  132. <slot v-if="loadingStatus===M.Default&&zSlots.loadingMoreDefault&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode" name="loadingMoreDefault" />
  133. <slot v-else-if="loadingStatus===M.Loading&&zSlots.loadingMoreLoading&&showLoadingMore&&loadingMoreEnabled" name="loadingMoreLoading" />
  134. <slot v-else-if="loadingStatus===M.NoMore&&zSlots.loadingMoreNoMore&&showLoadingMore&&showLoadingMoreNoMoreView&&loadingMoreEnabled&&!useChatRecordMode" name="loadingMoreNoMore" />
  135. <slot v-else-if="loadingStatus===M.Fail&&zSlots.loadingMoreFail&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode" name="loadingMoreFail" />
  136. <z-paging-load-more @doClick="_onLoadingMore('click')" v-else-if="showLoadingMore&&showDefaultLoadingMoreText&&!(loadingStatus===M.NoMore&&!showLoadingMoreNoMoreView)&&loadingMoreEnabled&&!useChatRecordMode" :zConfig="zLoadMoreConfig" />
  137. <!-- #endif -->
  138. <view v-if="safeAreaInsetBottom&&useSafeAreaPlaceholder&&!useChatRecordMode" class="zp-safe-area-placeholder" :style="[{height:safeAreaBottom+'px'}]" />
  139. </view>
  140. <!-- 空数据图 -->
  141. <view v-if="showEmpty" :class="{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}" :style="[emptyViewSuperStyle,chatRecordRotateStyle]">
  142. <slot v-if="zSlots.empty" name="empty" :isLoadFailed="isLoadFailed"/>
  143. <z-paging-empty-view v-else :emptyViewImg="finalEmptyViewImg" :emptyViewText="finalEmptyViewText" :showEmptyViewReload="finalShowEmptyViewReload"
  144. :emptyViewReloadText="finalEmptyViewReloadText" :isLoadFailed="isLoadFailed" :emptyViewStyle="emptyViewStyle" :emptyViewTitleStyle="emptyViewTitleStyle"
  145. :emptyViewImgStyle="emptyViewImgStyle" :emptyViewReloadStyle="emptyViewReloadStyle" :emptyViewZIndex="emptyViewZIndex" :emptyViewFixed="emptyViewFixed" :unit="unit"
  146. @reload="_emptyViewReload" @viewClick="_emptyViewClick" />
  147. </view>
  148. </view>
  149. </view>
  150. </view>
  151. </scroll-view>
  152. </view>
  153. <view v-if="zSlots.right" :class="{'zp-page-right':true,'zp-absoulte zp-right':finalIsOldWebView}">
  154. <slot name="right" />
  155. </view>
  156. </view>
  157. <!-- 底部固定的slot -->
  158. <view class="zp-page-bottom-container" :style="{'background': bottomBgColor}">
  159. <slot v-if="!usePageScroll&&zSlots.bottom" name="bottom" />
  160. <view class="zp-page-bottom" @touchmove.stop.prevent v-else-if="usePageScroll&&zSlots.bottom" :style="[{'bottom': `${windowBottom}px`}]">
  161. <slot name="bottom" />
  162. </view>
  163. <!-- 聊天记录模式底部占位 -->
  164. <template v-if="useChatRecordMode&&autoAdjustPositionWhenChat">
  165. <view :style="[{height:chatRecordModeSafeAreaBottom+'px'}]" />
  166. <view class="zp-page-bottom-keyboard-placeholder-animate" :style="[{height:keyboardHeight+'px'}]" />
  167. </template>
  168. </view>
  169. <!-- 点击返回顶部view -->
  170. <view v-if="showBackToTopClass" :class="finalBackToTopClass" :style="[finalBackToTopStyle]" @click.stop="_backToTopClick">
  171. <slot v-if="zSlots.backToTop" name="backToTop" />
  172. <image v-else class="zp-back-to-top-img" :src="backToTopImg.length?backToTopImg:base64BackToTop" />
  173. </view>
  174. <!-- 全屏Loading(铺满z-paging并固定) -->
  175. <view v-if="showLoading&&zSlots.loading&&loadingFullFixed" class="zp-loading-fixed">
  176. <slot name="loading" />
  177. </view>
  178. </view>
  179. <!-- #endif -->
  180. <!-- #ifdef APP-NVUE -->
  181. <component ref="z-paging-content" :is="finalNvueSuperListIs" :style="[finalPagingStyle]" :class="{'z-paging-content-fixed':fixed&&!usePageScroll}" :scrollable="false">
  182. <!-- 二楼view -->
  183. <view v-if="showF2 && showRefresherF2" ref="zp-n-f2" class="zp-f2-content" @touchmove.stop.prevent :style="[{'height': superContentHeight + 'px', 'width': nRefresherWidth + 'px', 'opacity': nF2Opacity}]">
  184. <slot name="f2"/>
  185. </view>
  186. <!-- 顶部固定的slot -->
  187. <view ref="zp-page-top" v-if="zSlots.top" :class="{'zp-page-top':usePageScroll}" :style="[usePageScroll?{'top':`${windowTop}px`,'z-index':topZIndex}:{}]">
  188. <slot name="top" />
  189. </view>
  190. <!-- 聊天记录模式加载更多loading(loading时候显示) -->
  191. <view v-if="useChatRecordMode&&loadingStatus!==M.NoMore&&showChatLoadingWhenReload&&showLoading">
  192. <slot v-if="zSlots.chatLoading" :loadingMoreStatus="loadingStatus" name="chatLoading" />
  193. <z-paging-load-more v-else @doClick="_onLoadingMore('click')" :zConfig="zLoadMoreConfig" />
  194. </view>
  195. <component :is="finalNvueSuperListIs" class="zp-n-list-container" :scrollable="false">
  196. <view v-if="zSlots.left" class="zp-page-left">
  197. <slot name="left" />
  198. </view>
  199. <component :is="finalNvueListIs" ref="zp-n-list" :id="nvueListId" :style="[{'flex': 1,'top':isIos?'0px':'-1px'},usePageScroll?scrollViewStyle:{},chatRecordRotateStyle]" :alwaysScrollableVertical="true"
  200. :fixFreezing="nFixFreezing" :show-scrollbar="showScrollbar" :loadmoreoffset="finalLowerThreshold" :enable-back-to-top="enableBackToTop"
  201. :scrollable="finalScrollable" :bounce="nvueBounce" :column-count="nWaterfallColumnCount" :column-width="nWaterfallColumnWidth"
  202. :column-gap="nWaterfallColumnGap" :left-gap="nWaterfallLeftGap" :right-gap="nWaterfallRightGap" :pagingEnabled="nvuePagingEnabled" :offset-accuracy="offsetAccuracy"
  203. @loadmore="_nOnLoadmore" @scroll="_nOnScroll" @scrollend="_nOnScrollend">
  204. <refresh v-if="(zSlots.top?cacheTopHeight!==-1:true)&&finalNvueRefresherEnabled" class="zp-n-refresh" :style="[nvueRefresherStyle]" :display="nRefresherLoading?'show':'hide'" @refresh="_nOnRrefresh" @pullingdown="_nOnPullingdown">
  205. <view ref="zp-n-refresh-container" class="zp-n-refresh-container" :style="[{background:refresherBackground,width:nRefresherWidth}]" id="zp-n-refresh-container">
  206. <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" />
  207. <!-- 下拉刷新view -->
  208. <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" />
  209. <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" />
  210. <slot v-else-if="(nScopedSlots?nScopedSlots:zSlots).refresher" :refresherStatus="refresherStatus" name="refresher" />
  211. <z-paging-refresh ref="refresh" v-else :status="refresherStatus" :defaultThemeStyle="finalRefresherThemeStyle"
  212. :defaultText="finalRefresherDefaultText" :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text"
  213. :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated"
  214. :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap"
  215. :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" />
  216. </view>
  217. </refresh>
  218. <component :is="nViewIs" v-if="isIos&&!useChatRecordMode?oldScrollTop>10:true" ref="zp-n-list-top-tag" class="zp-n-list-top-tag" style="margin-top: -1rpx;" :style="[{height:finalNvueRefresherEnabled?'0px':'1px'}]"></component>
  219. <component :is="nViewIs" v-if="nShowRefresherReveal" ref="zp-n-list-refresher-reveal" :style="[{transform:`translateY(-${nShowRefresherRevealHeight}px)`},{background:refresherBackground}]">
  220. <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" />
  221. <!-- 下拉刷新view -->
  222. <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" />
  223. <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" />
  224. <slot v-else-if="(nScopedSlots?nScopedSlots:$slots).refresher" :refresherStatus="R.Loading" name="refresher" />
  225. <z-paging-refresh ref="refresh" v-else :status="R.Loading" :defaultThemeStyle="finalRefresherThemeStyle"
  226. :defaultText="finalRefresherDefaultText" :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text"
  227. :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated"
  228. :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap"
  229. :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" />
  230. </component>
  231. <!-- 内置列表 -->
  232. <template v-if="finalUseInnerList">
  233. <component :is="nViewIs">
  234. <slot name="header"/>
  235. </component>
  236. <component :is="nViewIs" class="zp-list-cell" v-for="(item,index) in realTotalData" :key="finalCellKeyName.length?item[finalCellKeyName]:index">
  237. <slot name="cell" :item="item" :index="index"/>
  238. </component>
  239. <component :is="nViewIs">
  240. <slot name="footer"/>
  241. </component>
  242. </template>
  243. <template v-else>
  244. <slot />
  245. </template>
  246. <!-- 全屏Loading -->
  247. <component :is="nViewIs" v-if="showLoading&&zSlots.loading&&!loadingFullFixed" :class="{'z-paging-content-fixed':usePageScroll}" style="flex:1" :style="[chatRecordRotateStyle]">
  248. <slot name="loading" />
  249. </component>
  250. <!-- 上拉加载更多view -->
  251. <component :is="nViewIs" v-if="!refresherOnly&&loadingMoreEnabled&&!showEmpty">
  252. <!-- 聊天记录模式加载更多loading(滚动到顶部加载更多或无更多数据时显示) -->
  253. <template v-if="useChatRecordMode&&realTotalData.length>=defaultPageSize&&(loadingStatus!==M.NoMore||zSlots.chatNoMore)&&realTotalData.length&&isChatRecordModeAndInversion">
  254. <view :style="[chatRecordRotateStyle]">
  255. <slot v-if="loadingStatus===M.NoMore&&zSlots.chatNoMore" name="chatNoMore" />
  256. <template v-else>
  257. <slot v-if="zSlots.chatLoading" :loadingMoreStatus="loadingStatus" name="chatLoading" />
  258. <z-paging-load-more v-else @doClick="_onLoadingMore('click')" :zConfig="zLoadMoreConfig" />
  259. </template>
  260. </view>
  261. </template>
  262. <view :style="nLoadingMoreFixedHeight?{height:loadingMoreCustomStyle&&loadingMoreCustomStyle.height?loadingMoreCustomStyle.height:'80rpx'}:{}">
  263. <slot v-if="showLoadingMoreDefault" name="loadingMoreDefault" />
  264. <slot v-else-if="showLoadingMoreLoading" name="loadingMoreLoading" />
  265. <slot v-else-if="showLoadingMoreNoMore" name="loadingMoreNoMore" />
  266. <slot v-else-if="showLoadingMoreFail" name="loadingMoreFail" />
  267. <z-paging-load-more @doClick="_onLoadingMore('click')" v-else-if="showLoadingMoreCustom" :zConfig="zLoadMoreConfig" />
  268. <view v-if="safeAreaInsetBottom&&useSafeAreaPlaceholder&&!useChatRecordMode" class="zp-safe-area-placeholder" :style="[{height:safeAreaBottom+'px'}]" />
  269. </view>
  270. </component>
  271. <!-- 空数据图 -->
  272. <component :is="nViewIs" v-if="showEmpty" :class="{'z-paging-content-fixed':usePageScroll}" :style="[{flex:emptyViewCenter?1:0},emptyViewSuperStyle,chatRecordRotateStyle]">
  273. <view :class="{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}">
  274. <slot v-if="zSlots.empty" name="empty" :isLoadFailed="isLoadFailed" />
  275. <z-paging-empty-view v-else :emptyViewImg="finalEmptyViewImg" :emptyViewText="finalEmptyViewText" :showEmptyViewReload="finalShowEmptyViewReload"
  276. :emptyViewReloadText="finalEmptyViewReloadText" :isLoadFailed="isLoadFailed" :emptyViewStyle="emptyViewStyle" :emptyViewTitleStyle="emptyViewTitleStyle"
  277. :emptyViewImgStyle="emptyViewImgStyle" :emptyViewReloadStyle="emptyViewReloadStyle" :emptyViewZIndex="emptyViewZIndex" :emptyViewFixed="emptyViewFixed" :unit="unit"
  278. @reload="_emptyViewReload" @viewClick="_emptyViewClick" />
  279. </view>
  280. </component>
  281. <component is="header" v-if="!hideNvueBottomTag" ref="zp-n-list-bottom-tag" class="zp-n-list-bottom-tag"></component>
  282. </component>
  283. <view v-if="zSlots.right" class="zp-page-right">
  284. <slot name="right" />
  285. </view>
  286. </component>
  287. <!-- 底部固定的slot -->
  288. <view class="zp-page-bottom-container" :style="{'background': bottomBgColor}">
  289. <slot name="bottom" />
  290. <!-- 聊天记录模式底部占位 -->
  291. <template v-if="useChatRecordMode&&autoAdjustPositionWhenChat">
  292. <view :style="[{height:chatRecordModeSafeAreaBottom+'px'}]" />
  293. <view class="zp-page-bottom-keyboard-placeholder-animate" :style="[{height:keyboardHeight+'px'}]" />
  294. </template>
  295. </view>
  296. <!-- 点击返回顶部view -->
  297. <view v-if="showBackToTopClass" :class="finalBackToTopClass" :style="[finalBackToTopStyle]" @click.stop="_backToTopClick">
  298. <slot v-if="zSlots.backToTop" name="backToTop" />
  299. <image v-else class="zp-back-to-top-img" :src="backToTopImg.length?backToTopImg:base64BackToTop" />
  300. </view>
  301. <!-- 全屏Loading(铺满z-paging并固定) -->
  302. <view v-if="showLoading&&zSlots.loading&&loadingFullFixed" class="zp-loading-fixed">
  303. <slot name="loading" />
  304. </view>
  305. </component>
  306. <!-- #endif -->
  307. </template>
  308. <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  309. <script src="./wxs/z-paging-wxs.wxs" module="pagingWxs" lang="wxs"></script>
  310. <!-- #endif -->
  311. <script module="pagingRenderjs" lang="renderjs">
  312. import pagingRenderjs from './wxs/z-paging-renderjs.js';
  313. /**
  314. * z-paging 分页组件
  315. * @description 高性能,全平台兼容。支持虚拟列表,支持nvue、vue3
  316. * @tutorial https://z-paging.zxlee.cn
  317. * @notice 以下仅为部分常用属性、方法和事件,完整文档请查阅z-paging官网
  318. * @property {Number|String} default-page-no 自定义初始的pageNo,默认为1
  319. * @property {Number|String} default-page-size 自定义pageSize,默认为10
  320. * @property {Object} paging-style 设置z-paging的style,部分平台(如微信小程序)无法直接修改组件的style,可使用此属性代替
  321. * @property {String} height z-paging的高度,优先级低于pagingStyle中设置的height,传字符串,如100px、100rpx、100%
  322. * @property {String} width z-paging的宽度,优先级低于pagingStyle中设置的width,传字符串,如100px、100rpx、100%
  323. * @property {Boolean} use-page-scroll 使用页面滚动,默认为否
  324. * @property {Boolean} use-virtual-list 是否使用虚拟列表,默认为否
  325. * @property {Boolean} fixed z-paging是否使用fixed布局,若使用fixed布局,则z-paging的父view无需固定高度,z-paging高度默认为100%,默认为是(当使用内置scroll-view滚动时有效)
  326. * @property {Boolean} auto [z-paging]mounted后是否自动调用reload方法(mounted后自动调用接口),默认为是
  327. * @property {Boolean} use-chat-record-mode 使用聊天记录模式,默认为否
  328. * @event {Function} query 下拉刷新或滚动到底部时会自动触发此方法。z-paging加载时也会触发(若要禁止,请设置:auto="false")。pageNo和pageSize会自动计算好,直接传给服务器即可。
  329. * @example <z-paging ref="paging" v-model="dataList" @query="queryList"></z-paging>
  330. */
  331. export default {
  332. name:"z-paging",
  333. // #ifdef APP-VUE || H5
  334. mixins: [pagingRenderjs],
  335. // #endif
  336. }
  337. </script>
  338. <script src="./js/z-paging-main.js" />
  339. <style scoped>
  340. @import "./css/z-paging-main.css";
  341. @import "./css/z-paging-static.css";
  342. </style>