z-paging.vue 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674
  1. <!-- _
  2. ____ _ __ __ _ __ _(_)_ __ __ _
  3. |_ /____| '_ \ / _` |/ _` | | '_ \ / _` |
  4. / /_____| |_) | (_| | (_| | | | | | (_| |
  5. /___| | .__/ \__,_|\__, |_|_| |_|\__, |
  6. |_| |___/ |___/
  7. v2.8.8 (2025-08-29)
  8. @author ZXLee <admin@zxlee.cn>
  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群:343409055 -->
  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}, pagingClass]" :style="[finalPagingStyle]">
  17. <!-- #ifndef APP-PLUS -->
  18. <view v-if="cssSafeAreaInsetBottom===-1" class="zp-safe-area-inset-bottom" style="position: absolute"/>
  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. <template v-if="zSlots.top">
  26. <slot v-if="!usePageScroll" name="top" />
  27. <view v-else class="zp-page-top" @touchmove.stop.prevent :style="[{'top':`${windowTop}px`,'z-index':topZIndex}]">
  28. <slot name="top" />
  29. </view>
  30. </template>
  31. <view :class="{'zp-view-super':true,'zp-scroll-view-super':!usePageScroll}" :style="[finalScrollViewStyle]">
  32. <view v-if="zSlots.left" :class="{'zp-page-left':true,'zp-absoulte':finalIsOldWebView}">
  33. <slot name="left" />
  34. </view>
  35. <view :class="{'zp-scroll-view-container':true,'zp-absoulte':finalIsOldWebView}" :style="[scrollViewContainerStyle]">
  36. <scroll-view
  37. ref="zp-scroll-view" :class="{'zp-scroll-view':true,'zp-scroll-view-absolute':!usePageScroll,'zp-scroll-view-hide-scrollbar':!showScrollbar}" :style="[chatRecordRotateStyle]"
  38. :scroll-top="scrollTop" :scroll-left="scrollLeft" :scroll-x="scrollX"
  39. :scroll-y="finalScrollable" :enable-back-to-top="finalEnableBackToTop"
  40. :show-scrollbar="showScrollbar" :scroll-with-animation="finalScrollWithAnimation"
  41. :scroll-into-view="scrollIntoView" :lower-threshold="finalLowerThreshold" :upper-threshold="5"
  42. :refresher-enabled="finalRefresherEnabled&&!useCustomRefresher" :refresher-threshold="finalRefresherThreshold"
  43. :refresher-default-style="finalRefresherDefaultStyle" :refresher-background="refresherBackground"
  44. :refresher-triggered="finalRefresherTriggered" @scroll="_scroll" @scrolltolower="_onScrollToLower"
  45. @scrolltoupper="_onScrollToUpper" @refresherrestore="_onRestore" @refresherrefresh="_onRefresh(true)"
  46. >
  47. <view class="zp-paging-touch-view"
  48. <!-- #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  49. @touchstart="_refresherTouchstart" @touchmove="_refresherTouchmove" @touchend="_refresherTouchend" @touchcancel="_refresherTouchend"
  50. <!-- #endif -->
  51. <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  52. @touchstart="pagingWxs.touchstart" @touchmove="pagingWxs.touchmove" @touchend="pagingWxs.touchend" @touchcancel="pagingWxs.touchend"
  53. @mousedown="pagingWxs.mousedown" @mousemove="pagingWxs.mousemove" @mouseup="pagingWxs.mouseup" @mouseleave="pagingWxs.mouseleave"
  54. <!-- #endif -->
  55. >
  56. <view v-if="finalRefresherFixedBacHeight>0" class="zp-fixed-bac-view" :style="[{'background': refresherFixedBackground,'height': `${finalRefresherFixedBacHeight}px`}]"></view>
  57. <view class="zp-paging-main" :style="[scrollViewInStyle,{'transform': finalRefresherTransform,'transition': refresherTransition}]"
  58. <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  59. :change:prop="pagingWxs.propObserver" :prop="wxsPropType"
  60. :data-refresherThreshold="finalRefresherThreshold" :data-refresherF2Enabled="refresherF2Enabled" :data-refresherF2Threshold="finalRefresherF2Threshold" :data-isIos="isIos"
  61. :data-loading="loading||isRefresherInComplete" :data-useChatRecordMode="useChatRecordMode"
  62. :data-refresherEnabled="finalRefresherEnabled" :data-useCustomRefresher="useCustomRefresher" :data-pageScrollTop="wxsPageScrollTop"
  63. :data-scrollTop="wxsScrollTop" :data-refresherMaxAngle="refresherMaxAngle" :data-refresherNoTransform="refresherNoTransform"
  64. :data-refresherAecc="refresherAngleEnableChangeContinued" :data-usePageScroll="usePageScroll" :data-watchTouchDirectionChange="watchTouchDirectionChange"
  65. :data-oldIsTouchmoving="isTouchmoving" :data-refresherOutRate="finalRefresherOutRate" :data-refresherPullRate="finalRefresherPullRate" :data-hasTouchmove="hasTouchmove"
  66. <!-- #endif -->
  67. <!-- #ifdef APP-VUE || H5 -->
  68. :change:renderPropIsIosAndH5="pagingRenderjs.renderPropIsIosAndH5Change" :renderPropIsIosAndH5="isIosAndH5"
  69. <!-- #endif -->
  70. >
  71. <view v-if="showRefresher" class="zp-custom-refresher-view" :style="[{'margin-top': `-${finalRefresherThreshold+refresherThresholdUpdateTag}px`,'background': refresherBackground,'opacity': isTouchmoving ? 1 : 0}]">
  72. <view class="zp-custom-refresher-container" :style="[{'height': `${finalRefresherThreshold}px`,'background': refresherBackground}]">
  73. <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" />
  74. <!-- 下拉刷新view -->
  75. <view class="zp-custom-refresher-slot-view">
  76. <slot v-if="!(zSlots.refresherComplete&&refresherStatus===R.Complete)&&!(zSlots.refresherF2&&refresherStatus===R.GoF2)" :refresherStatus="refresherStatus" name="refresher" />
  77. </view>
  78. <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" />
  79. <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" />
  80. <z-paging-refresh ref="refresh" v-else-if="!showCustomRefresher" class="zp-custom-refresher-refresh" :style="[{'height': `${finalRefresherThreshold - finalRefresherThresholdPlaceholder}px`}]" :status="refresherStatus"
  81. :defaultThemeStyle="finalRefresherThemeStyle" :defaultText="finalRefresherDefaultText" :isIos="isIos"
  82. :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text"
  83. :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated"
  84. :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap"
  85. :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" />
  86. </view>
  87. </view>
  88. <view class="zp-paging-container" :style="[{justifyContent:useChatRecordMode?'flex-end':'flex-start'}]">
  89. <!-- 全屏Loading -->
  90. <slot v-if="showLoading&&zSlots.loading&&!loadingFullFixed" name="loading" />
  91. <!-- 主体内容 -->
  92. <view class="zp-paging-container-content" :style="[finalPlaceholderTopHeightStyle,finalPagingContentStyle]">
  93. <!-- #ifdef VUE3 -->
  94. <!-- 虚拟列表顶部占位view -->
  95. <view v-if="useVirtualList" class="zp-virtual-placeholder" :style="[{height:virtualPlaceholderTopHeight+'px'}]"/>
  96. <!-- #endif -->
  97. <slot />
  98. <!-- 内置列表&虚拟列表 -->
  99. <template v-if="finalUseInnerList">
  100. <slot name="header"/>
  101. <view class="zp-list-container" :style="[innerListStyle]">
  102. <template v-if="finalUseVirtualList">
  103. <view class="zp-list-cell" :style="[innerCellStyle]" :id="`${fianlVirtualCellIdPrefix}-${item[virtualCellIndexKey]}`" v-for="(item,index) in virtualList" :key="item['zp_unique_index']" @click="_innerCellClick(item,virtualTopRangeIndex+index)">
  104. <view v-if="useCompatibilityMode">使用兼容模式请在组件源码z-paging.vue第105行中注释这一行,并打开下面一行注释</view>
  105. <!-- <zp-public-virtual-cell v-if="useCompatibilityMode" :extraData="extraData" :item="item" :index="virtualTopRangeIndex+index" /> -->
  106. <slot v-else name="cell" :item="item" :index="virtualTopRangeIndex+index"/>
  107. </view>
  108. </template>
  109. <template v-else>
  110. <view class="zp-list-cell" v-for="(item,index) in realTotalData" :key="index" @click="_innerCellClick(item,index)">
  111. <slot name="cell" :item="item" :index="index"/>
  112. </view>
  113. </template>
  114. </view>
  115. <slot name="footer"/>
  116. </template>
  117. <!-- 聊天记录模式加载更多loading -->
  118. <template v-if="useChatRecordMode&&realTotalData.length>=defaultPageSize&&(loadingStatus!==M.NoMore||zSlots.chatNoMore)&&(realTotalData.length||(showChatLoadingWhenReload&&showLoading))&&!isFirstPageAndNoMore">
  119. <view :style="[chatRecordRotateStyle]">
  120. <slot v-if="loadingStatus===M.NoMore&&zSlots.chatNoMore" name="chatNoMore" />
  121. <template v-else>
  122. <slot v-if="zSlots.chatLoading" :loadingMoreStatus="loadingStatus" name="chatLoading" />
  123. <z-paging-load-more v-else @doClick="_onLoadingMore('click')" :zConfig="zLoadMoreConfig" />
  124. </template>
  125. </view>
  126. </template>
  127. <!-- 虚拟列表底部占位view -->
  128. <view v-if="useVirtualList" class="zp-virtual-placeholder" :style="[{height:virtualPlaceholderBottomHeight+'px'}]"/>
  129. <!-- 上拉加载更多view -->
  130. <!-- #ifndef MP-ALIPAY -->
  131. <slot v-if="showLoadingMoreDefault" name="loadingMoreDefault" />
  132. <slot v-else-if="showLoadingMoreLoading" name="loadingMoreLoading" />
  133. <slot v-else-if="showLoadingMoreNoMore" name="loadingMoreNoMore" />
  134. <slot v-else-if="showLoadingMoreFail" name="loadingMoreFail" />
  135. <z-paging-load-more @doClick="_onLoadingMore('click')" v-else-if="showLoadingMoreCustom" :zConfig="zLoadMoreConfig" />
  136. <!-- #endif -->
  137. <!-- #ifdef MP-ALIPAY -->
  138. <slot v-if="loadingStatus===M.Default&&zSlots.loadingMoreDefault&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode" name="loadingMoreDefault" />
  139. <slot v-else-if="loadingStatus===M.Loading&&zSlots.loadingMoreLoading&&showLoadingMore&&loadingMoreEnabled" name="loadingMoreLoading" />
  140. <slot v-else-if="loadingStatus===M.NoMore&&zSlots.loadingMoreNoMore&&showLoadingMore&&showLoadingMoreNoMoreView&&loadingMoreEnabled&&!useChatRecordMode" name="loadingMoreNoMore" />
  141. <slot v-else-if="loadingStatus===M.Fail&&zSlots.loadingMoreFail&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode" name="loadingMoreFail" />
  142. <z-paging-load-more @doClick="_onLoadingMore('click')" v-else-if="showLoadingMore&&showDefaultLoadingMoreText&&!(loadingStatus===M.NoMore&&!showLoadingMoreNoMoreView)&&loadingMoreEnabled&&!useChatRecordMode" :zConfig="zLoadMoreConfig" />
  143. <!-- #endif -->
  144. <!-- 底部安全区域useSafeAreaPlaceholder模式占位,此时占位不再固定在底部而是跟随页面一起滚动 -->
  145. <!-- 如果底部slot=bottom存在,占位区域会插入在slot=bottom下方,不再跟随页面滚动,因此这里就没必要显示了 -->
  146. <!-- 聊天记录模式因为列表倒置,此处不需要显示底部安全区域,另行处理 -->
  147. <view v-if="safeAreaInsetBottom&&finalUseSafeAreaPlaceholder&&!useChatRecordMode" class="zp-safe-area-placeholder" :style="[{height:safeAreaBottom+'px'}]" />
  148. </view>
  149. <!-- 空数据图 -->
  150. <view v-if="showEmpty" :class="{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}" :style="[emptyViewSuperStyle,chatRecordRotateStyle]">
  151. <slot v-if="zSlots.empty" name="empty" :isLoadFailed="isLoadFailed"/>
  152. <z-paging-empty-view v-else :emptyViewImg="finalEmptyViewImg" :emptyViewText="finalEmptyViewText" :showEmptyViewReload="finalShowEmptyViewReload"
  153. :emptyViewReloadText="finalEmptyViewReloadText" :isLoadFailed="isLoadFailed" :emptyViewStyle="emptyViewStyle" :emptyViewTitleStyle="emptyViewTitleStyle"
  154. :emptyViewImgStyle="emptyViewImgStyle" :emptyViewReloadStyle="emptyViewReloadStyle" :emptyViewZIndex="emptyViewZIndex" :emptyViewFixed="emptyViewFixed" :unit="unit"
  155. @reload="_emptyViewReload" @viewClick="_emptyViewClick" />
  156. </view>
  157. </view>
  158. </view>
  159. </view>
  160. </scroll-view>
  161. </view>
  162. <view v-if="zSlots.right" :class="{'zp-page-right':true,'zp-absoulte zp-right':finalIsOldWebView}">
  163. <slot name="right" />
  164. </view>
  165. </view>
  166. <!-- 底部固定的slot -->
  167. <view class="zp-page-bottom-container" :style="{'background': bottomBgColor}">
  168. <template v-if="zSlots.bottom">
  169. <!-- 非页面滚动底部插槽(父容器开启flex,中间列表设置了flex:1,通过中间列表撑开固定在底部) -->
  170. <slot v-if="!usePageScroll" name="bottom" />
  171. <!-- 页面滚动底部插槽(通过position: fixed固定在底部) -->
  172. <view v-else class="zp-page-bottom" @touchmove.stop.prevent :style="[{'bottom': `${windowBottom}px`, 'background': bottomBgColor}]">
  173. <slot name="bottom" />
  174. <!-- 页面滚动底部安全区域占位(仅slot=bottom存在时展示在slot=bottom插入的view下方,当slot=bottom不存在时,通过控制容器的marginBottom设置底部安全区域间距) -->
  175. <template v-if="safeAreaInsetBottom">
  176. <!-- 如果是App,则使用style中的safeAreaBottom设置高度,非APP使用class,因为class中的env(safe-area-inset-bottom)在部分app中无效 -->
  177. <!-- #ifdef APP-PLUS -->
  178. <view :style="[{height:safeAreaBottom+'px'}]" />
  179. <!-- #endif -->
  180. <!-- #ifndef APP-PLUS -->
  181. <view class="zp-safe-area-inset-bottom" />
  182. <!-- #endif -->
  183. </template>
  184. </view>
  185. </template>
  186. <!-- 非页面滚动底部安全区域占位(无论slot=bottom是否存在)-->
  187. <!-- 如果useSafeAreaPlaceholder开启了并且slot=bottom不存在就不显示这个占位view了,因为此时useSafeAreaPlaceholder会是跟随滚动的状态 -->
  188. <!-- 聊天记录模式因为列表倒置,此处不需要显示底部安全区域,另行处理 -->
  189. <template v-if="safeAreaInsetBottom&&!usePageScroll&&!(finalUseSafeAreaPlaceholder)&&!useChatRecordMode">
  190. <!-- 如果是App,则使用style中的safeAreaBottom设置高度,非APP使用class,因为class中的env(safe-area-inset-bottom)在部分app中无效 -->
  191. <!-- #ifdef APP-PLUS -->
  192. <view :style="[{height:safeAreaBottom+'px'}]" />
  193. <!-- #endif -->
  194. <!-- #ifndef APP-PLUS -->
  195. <view class="zp-safe-area-inset-bottom" />
  196. <!-- #endif -->
  197. </template>
  198. <!-- 聊天记录模式底部占位 -->
  199. <template v-if="useChatRecordMode&&autoAdjustPositionWhenChat">
  200. <view :style="[{height:chatRecordModeSafeAreaBottom+'px'}]" />
  201. <view class="zp-page-bottom-keyboard-placeholder-animate" :style="[{height:keyboardHeight+'px'}]" />
  202. </template>
  203. </view>
  204. <!-- 点击返回顶部view -->
  205. <view v-if="showBackToTopClass" :class="finalBackToTopClass" :style="[finalBackToTopStyle]" @click.stop="_backToTopClick">
  206. <slot v-if="zSlots.backToTop" name="backToTop" />
  207. <image v-else class="zp-back-to-top-img" :class="{'zp-back-to-top-img-inversion': useChatRecordMode&&!backToTopImg.length}" :src="backToTopImg.length?backToTopImg:base64BackToTop" />
  208. </view>
  209. <!-- 全屏Loading(铺满z-paging并固定) -->
  210. <view v-if="showLoading&&zSlots.loading&&loadingFullFixed" class="zp-loading-fixed">
  211. <slot name="loading" />
  212. </view>
  213. </view>
  214. <!-- #endif -->
  215. <!-- #ifdef APP-NVUE -->
  216. <component ref="z-paging-content" :is="finalNvueSuperListIs" :style="[finalPagingStyle]" :class="[{'z-paging-content-fixed':fixed&&!usePageScroll}, pagingClass]" :scrollable="false">
  217. <!-- 二楼view -->
  218. <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}]">
  219. <slot name="f2"/>
  220. </view>
  221. <!-- 顶部固定的slot -->
  222. <view ref="zp-page-top" v-if="zSlots.top" :class="{'zp-page-top':usePageScroll}" :style="[usePageScroll?{'top':`${windowTop}px`,'z-index':topZIndex}:{}]">
  223. <slot name="top" />
  224. </view>
  225. <!-- 聊天记录模式加载更多loading(loading时候显示) -->
  226. <view v-if="useChatRecordMode&&loadingStatus!==M.NoMore&&showChatLoadingWhenReload&&showLoading">
  227. <slot v-if="zSlots.chatLoading" :loadingMoreStatus="loadingStatus" name="chatLoading" />
  228. <z-paging-load-more v-else @doClick="_onLoadingMore('click')" :zConfig="zLoadMoreConfig" />
  229. </view>
  230. <component :is="finalNvueSuperListIs" class="zp-n-list-container" :scrollable="false">
  231. <view v-if="zSlots.left" class="zp-page-left">
  232. <slot name="left" />
  233. </view>
  234. <!-- 因在nvue+vue3+waterfall中,使用<component is="waterfall" />设置的瀑布流无效,因此此处只能单独判断finalNvueListIs等于waterfall时,直接写<waterfall />标签暂时解决 -->
  235. <!-- 下方的v-if和v-else中的代码完全一致,仅标签不同,等待官方解决后再统一,已提issue:https://ask.dcloud.net.cn/question/168505 -->
  236. <component v-if="finalNvueListIs !== 'waterfall'" :is="finalNvueListIs" ref="zp-n-list" :id="nvueListId" :style="[{'flex': 1,'top':isIos?'0px':'-1px'},usePageScroll?scrollViewStyle:{},chatRecordRotateStyle]" :alwaysScrollableVertical="true"
  237. :fixFreezing="nFixFreezing" :show-scrollbar="showScrollbar" :loadmoreoffset="finalLowerThreshold" :enable-back-to-top="enableBackToTop"
  238. :scrollable="finalScrollable" :bounce="nvueBounce" :column-count="nWaterfallColumnCount" :column-width="nWaterfallColumnWidth"
  239. :column-gap="nWaterfallColumnGap" :left-gap="nWaterfallLeftGap" :right-gap="nWaterfallRightGap" :pagingEnabled="nvuePagingEnabled" :offset-accuracy="offsetAccuracy"
  240. @loadmore="_nOnLoadmore" @scroll="_nOnScroll" @scrollend="_nOnScrollend">
  241. <refresh v-if="(zSlots.top?cacheTopHeight!==-1:true)&&finalNvueRefresherEnabled" class="zp-n-refresh" :style="[nvueRefresherStyle]" :display="nRefresherLoading?'show':'hide'" @refresh="_nOnRrefresh" @pullingdown="_nOnPullingdown">
  242. <view ref="zp-n-refresh-container" class="zp-n-refresh-container" :style="[{background:refresherBackground,width:nRefresherWidth}]" id="zp-n-refresh-container">
  243. <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" />
  244. <!-- 下拉刷新view -->
  245. <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" />
  246. <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" />
  247. <slot v-else-if="(nScopedSlots?nScopedSlots:zSlots).refresher" :refresherStatus="refresherStatus" name="refresher" />
  248. <z-paging-refresh ref="refresh" v-else :status="refresherStatus" :defaultThemeStyle="finalRefresherThemeStyle" :isIos="isIos"
  249. :defaultText="finalRefresherDefaultText" :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text"
  250. :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated"
  251. :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap"
  252. :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" />
  253. </view>
  254. </refresh>
  255. <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>
  256. <component :is="nViewIs" v-if="nShowRefresherReveal" ref="zp-n-list-refresher-reveal" :style="[{transform:`translateY(-${nShowRefresherRevealHeight}px)`},{background:refresherBackground}]">
  257. <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" />
  258. <!-- 下拉刷新view -->
  259. <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" />
  260. <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" />
  261. <slot v-else-if="(nScopedSlots?nScopedSlots:$slots).refresher" :refresherStatus="R.Loading" name="refresher" />
  262. <z-paging-refresh ref="refresh" v-else :status="R.Loading" :defaultThemeStyle="finalRefresherThemeStyle" :isIos="isIos"
  263. :defaultText="finalRefresherDefaultText" :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text"
  264. :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated"
  265. :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap"
  266. :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" />
  267. </component>
  268. <!-- 内置列表 -->
  269. <template v-if="finalUseInnerList">
  270. <component :is="nViewIs">
  271. <slot name="header"/>
  272. </component>
  273. <component :is="nViewIs" class="zp-list-cell" v-for="(item,index) in realTotalData" :key="finalCellKeyName.length?item[finalCellKeyName]:index">
  274. <slot name="cell" :item="item" :index="index"/>
  275. </component>
  276. <component :is="nViewIs">
  277. <slot name="footer"/>
  278. </component>
  279. </template>
  280. <template v-else>
  281. <slot />
  282. </template>
  283. <!-- 全屏Loading -->
  284. <component :is="nViewIs" v-if="showLoading&&zSlots.loading&&!loadingFullFixed" :class="{'z-paging-content-fixed':usePageScroll}" style="flex:1" :style="[chatRecordRotateStyle]">
  285. <slot name="loading" />
  286. </component>
  287. <!-- 上拉加载更多view -->
  288. <component :is="nViewIs" v-if="!isOnly&&loadingMoreEnabled&&!showEmpty">
  289. <!-- 聊天记录模式加载更多loading(滚动到顶部加载更多或无更多数据时显示) -->
  290. <template v-if="useChatRecordMode&&realTotalData.length>=defaultPageSize&&(loadingStatus!==M.NoMore||zSlots.chatNoMore)&&realTotalData.length&&isChatRecordModeAndInversion">
  291. <view :style="[chatRecordRotateStyle]">
  292. <slot v-if="loadingStatus===M.NoMore&&zSlots.chatNoMore" name="chatNoMore" />
  293. <template v-else>
  294. <slot v-if="zSlots.chatLoading" :loadingMoreStatus="loadingStatus" name="chatLoading" />
  295. <z-paging-load-more v-else @doClick="_onLoadingMore('click')" :zConfig="zLoadMoreConfig" />
  296. </template>
  297. </view>
  298. </template>
  299. <view :style="nLoadingMoreFixedHeight?{height:loadingMoreCustomStyle&&loadingMoreCustomStyle.height?loadingMoreCustomStyle.height:loadingMoreFixedHeight}:{}">
  300. <slot v-if="showLoadingMoreDefault" name="loadingMoreDefault" />
  301. <slot v-else-if="showLoadingMoreLoading" name="loadingMoreLoading" />
  302. <slot v-else-if="showLoadingMoreNoMore" name="loadingMoreNoMore" />
  303. <slot v-else-if="showLoadingMoreFail" name="loadingMoreFail" />
  304. <z-paging-load-more @doClick="_onLoadingMore('click')" v-else-if="showLoadingMoreCustom" :zConfig="zLoadMoreConfig" />
  305. <!-- 底部安全区域useSafeAreaPlaceholder模式占位,此时占位不再固定在底部而是跟随页面一起滚动 -->
  306. <!-- 如果底部slot=bottom存在,占位区域会插入在slot=bottom下方,不再跟随页面滚动,因此这里就没必要显示了 -->
  307. <!-- 聊天记录模式因为列表倒置,此处不需要显示底部安全区域,另行处理 -->
  308. <view v-if="safeAreaInsetBottom&&finalUseSafeAreaPlaceholder&&!useChatRecordMode" class="zp-safe-area-placeholder" :style="[{height:safeAreaBottom+'px'}]" />
  309. </view>
  310. </component>
  311. <!-- 空数据图 -->
  312. <component :is="nViewIs" v-if="showEmpty" :class="{'z-paging-content-fixed':usePageScroll}" :style="[{flex:emptyViewCenter?1:0},emptyViewSuperStyle,chatRecordRotateStyle]">
  313. <view :class="{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}">
  314. <slot v-if="zSlots.empty" name="empty" :isLoadFailed="isLoadFailed" />
  315. <z-paging-empty-view v-else :emptyViewImg="finalEmptyViewImg" :emptyViewText="finalEmptyViewText" :showEmptyViewReload="finalShowEmptyViewReload"
  316. :emptyViewReloadText="finalEmptyViewReloadText" :isLoadFailed="isLoadFailed" :emptyViewStyle="emptyViewStyle" :emptyViewTitleStyle="emptyViewTitleStyle"
  317. :emptyViewImgStyle="emptyViewImgStyle" :emptyViewReloadStyle="emptyViewReloadStyle" :emptyViewZIndex="emptyViewZIndex" :emptyViewFixed="emptyViewFixed" :unit="unit"
  318. @reload="_emptyViewReload" @viewClick="_emptyViewClick" />
  319. </view>
  320. </component>
  321. <component :is="nViewIs" v-if="!hideNvueBottomTag" ref="zp-n-list-bottom-tag" class="zp-n-list-bottom-tag"></component>
  322. </component>
  323. <waterfall v-else :is="finalNvueListIs" ref="zp-n-list" :id="nvueListId" :style="[{'flex': 1,'top':isIos?'0px':'-1px'},usePageScroll?scrollViewStyle:{},chatRecordRotateStyle]" :alwaysScrollableVertical="true"
  324. :fixFreezing="nFixFreezing" :show-scrollbar="showScrollbar" :loadmoreoffset="finalLowerThreshold" :enable-back-to-top="enableBackToTop"
  325. :scrollable="finalScrollable" :bounce="nvueBounce" :column-count="nWaterfallColumnCount" :column-width="nWaterfallColumnWidth"
  326. :column-gap="nWaterfallColumnGap" :left-gap="nWaterfallLeftGap" :right-gap="nWaterfallRightGap" :pagingEnabled="nvuePagingEnabled" :offset-accuracy="offsetAccuracy"
  327. @loadmore="_nOnLoadmore" @scroll="_nOnScroll" @scrollend="_nOnScrollend">
  328. <refresh v-if="(zSlots.top?cacheTopHeight!==-1:true)&&finalNvueRefresherEnabled" class="zp-n-refresh" :style="[nvueRefresherStyle]" :display="nRefresherLoading?'show':'hide'" @refresh="_nOnRrefresh" @pullingdown="_nOnPullingdown">
  329. <view ref="zp-n-refresh-container" class="zp-n-refresh-container" :style="[{background:refresherBackground,width:nRefresherWidth}]" id="zp-n-refresh-container">
  330. <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" />
  331. <!-- 下拉刷新view -->
  332. <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" />
  333. <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" />
  334. <slot v-else-if="(nScopedSlots?nScopedSlots:zSlots).refresher" :refresherStatus="refresherStatus" name="refresher" />
  335. <z-paging-refresh ref="refresh" v-else :status="refresherStatus" :defaultThemeStyle="finalRefresherThemeStyle" :isIos="isIos"
  336. :defaultText="finalRefresherDefaultText" :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text"
  337. :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated"
  338. :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap"
  339. :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" />
  340. </view>
  341. </refresh>
  342. <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>
  343. <component :is="nViewIs" v-if="nShowRefresherReveal" ref="zp-n-list-refresher-reveal" :style="[{transform:`translateY(-${nShowRefresherRevealHeight}px)`},{background:refresherBackground}]">
  344. <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" />
  345. <!-- 下拉刷新view -->
  346. <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" />
  347. <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" />
  348. <slot v-else-if="(nScopedSlots?nScopedSlots:$slots).refresher" :refresherStatus="R.Loading" name="refresher" />
  349. <z-paging-refresh ref="refresh" v-else :status="R.Loading" :defaultThemeStyle="finalRefresherThemeStyle" :isIos="isIos"
  350. :defaultText="finalRefresherDefaultText" :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text"
  351. :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated"
  352. :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap"
  353. :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" />
  354. </component>
  355. <!-- 内置列表 -->
  356. <template v-if="finalUseInnerList">
  357. <component :is="nViewIs">
  358. <slot name="header"/>
  359. </component>
  360. <component :is="nViewIs" class="zp-list-cell" v-for="(item,index) in realTotalData" :key="finalCellKeyName.length?item[finalCellKeyName]:index">
  361. <slot name="cell" :item="item" :index="index"/>
  362. </component>
  363. <component :is="nViewIs">
  364. <slot name="footer"/>
  365. </component>
  366. </template>
  367. <template v-else>
  368. <slot />
  369. </template>
  370. <!-- 全屏Loading -->
  371. <component :is="nViewIs" v-if="showLoading&&zSlots.loading&&!loadingFullFixed" :class="{'z-paging-content-fixed':usePageScroll}" style="flex:1" :style="[chatRecordRotateStyle]">
  372. <slot name="loading" />
  373. </component>
  374. <!-- 上拉加载更多view -->
  375. <component :is="nViewIs" v-if="!isOnly&&loadingMoreEnabled&&!showEmpty">
  376. <!-- 聊天记录模式加载更多loading(滚动到顶部加载更多或无更多数据时显示) -->
  377. <template v-if="useChatRecordMode&&realTotalData.length>=defaultPageSize&&(loadingStatus!==M.NoMore||zSlots.chatNoMore)&&realTotalData.length&&isChatRecordModeAndInversion">
  378. <view :style="[chatRecordRotateStyle]">
  379. <slot v-if="loadingStatus===M.NoMore&&zSlots.chatNoMore" name="chatNoMore" />
  380. <template v-else>
  381. <slot v-if="zSlots.chatLoading" :loadingMoreStatus="loadingStatus" name="chatLoading" />
  382. <z-paging-load-more v-else @doClick="_onLoadingMore('click')" :zConfig="zLoadMoreConfig" />
  383. </template>
  384. </view>
  385. </template>
  386. <view :style="nLoadingMoreFixedHeight?{height:loadingMoreCustomStyle&&loadingMoreCustomStyle.height?loadingMoreCustomStyle.height:loadingMoreFixedHeight}:{}">
  387. <slot v-if="showLoadingMoreDefault" name="loadingMoreDefault" />
  388. <slot v-else-if="showLoadingMoreLoading" name="loadingMoreLoading" />
  389. <slot v-else-if="showLoadingMoreNoMore" name="loadingMoreNoMore" />
  390. <slot v-else-if="showLoadingMoreFail" name="loadingMoreFail" />
  391. <z-paging-load-more @doClick="_onLoadingMore('click')" v-else-if="showLoadingMoreCustom" :zConfig="zLoadMoreConfig" />
  392. <!-- 底部安全区域useSafeAreaPlaceholder模式占位,此时占位不再固定在底部而是跟随页面一起滚动 -->
  393. <!-- 如果底部slot=bottom存在,占位区域会插入在slot=bottom下方,不再跟随页面滚动,因此这里就没必要显示了 -->
  394. <!-- 聊天记录模式因为列表倒置,此处不需要显示底部安全区域,另行处理 -->
  395. <view v-if="safeAreaInsetBottom&&finalUseSafeAreaPlaceholder&&!useChatRecordMode" class="zp-safe-area-placeholder" :style="[{height:safeAreaBottom+'px'}]" />
  396. </view>
  397. </component>
  398. <!-- 空数据图 -->
  399. <component :is="nViewIs" v-if="showEmpty" :class="{'z-paging-content-fixed':usePageScroll}" :style="[{flex:emptyViewCenter?1:0},emptyViewSuperStyle,chatRecordRotateStyle]">
  400. <view :class="{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}">
  401. <slot v-if="zSlots.empty" name="empty" :isLoadFailed="isLoadFailed" />
  402. <z-paging-empty-view v-else :emptyViewImg="finalEmptyViewImg" :emptyViewText="finalEmptyViewText" :showEmptyViewReload="finalShowEmptyViewReload"
  403. :emptyViewReloadText="finalEmptyViewReloadText" :isLoadFailed="isLoadFailed" :emptyViewStyle="emptyViewStyle" :emptyViewTitleStyle="emptyViewTitleStyle"
  404. :emptyViewImgStyle="emptyViewImgStyle" :emptyViewReloadStyle="emptyViewReloadStyle" :emptyViewZIndex="emptyViewZIndex" :emptyViewFixed="emptyViewFixed" :unit="unit"
  405. @reload="_emptyViewReload" @viewClick="_emptyViewClick" />
  406. </view>
  407. </component>
  408. <component :is="nViewIs" v-if="!hideNvueBottomTag" ref="zp-n-list-bottom-tag" class="zp-n-list-bottom-tag"></component>
  409. </waterfall>
  410. <view v-if="zSlots.right" class="zp-page-right">
  411. <slot name="right" />
  412. </view>
  413. </component>
  414. <!-- 底部固定的slot -->
  415. <view class="zp-page-bottom-container" :style="{'background': bottomBgColor}">
  416. <slot name="bottom" />
  417. <!-- 非页面滚动底部安全区域占位(无论slot=bottom是否存在)-->
  418. <!-- 如果useSafeAreaPlaceholder开启了并且slot=bottom不存在就不显示这个占位view了,因为此时useSafeAreaPlaceholder会是跟随滚动的状态 -->
  419. <!-- 聊天记录模式因为列表倒置,此处不需要显示底部安全区域,另行处理 -->
  420. <view v-if="safeAreaInsetBottom&&!usePageScroll&&!(finalUseSafeAreaPlaceholder)&&!useChatRecordMode" :style="[{height:safeAreaBottom+'px'}]" />
  421. <!-- 聊天记录模式底部占位 -->
  422. <template v-if="useChatRecordMode&&autoAdjustPositionWhenChat">
  423. <view :style="[{height:chatRecordModeSafeAreaBottom+'px'}]" />
  424. <view class="zp-page-bottom-keyboard-placeholder-animate" :style="[{height:keyboardHeight+'px'}]" />
  425. </template>
  426. </view>
  427. <!-- 点击返回顶部view -->
  428. <view v-if="showBackToTopClass" :class="finalBackToTopClass" :style="[finalBackToTopStyle]" @click.stop="_backToTopClick">
  429. <slot v-if="zSlots.backToTop" name="backToTop" />
  430. <image v-else class="zp-back-to-top-img" :class="{'zp-back-to-top-img-inversion': useChatRecordMode&&!backToTopImg.length}" :src="backToTopImg.length?backToTopImg:base64BackToTop" />
  431. </view>
  432. <!-- 全屏Loading(铺满z-paging并固定) -->
  433. <view v-if="showLoading&&zSlots.loading&&loadingFullFixed" class="zp-loading-fixed">
  434. <slot name="loading" />
  435. </view>
  436. </component>
  437. <!-- #endif -->
  438. </template>
  439. <script module="pagingRenderjs" lang="renderjs">
  440. import pagingRenderjs from './wxs/z-paging-renderjs.js';
  441. /**
  442. * z-paging 分页组件
  443. * @description z-paging 分页组件,高性能,全平台兼容。支持自定义下拉刷新、上拉加载更多、虚拟列表、下拉进入二楼、自动管理空数据图、全自动分页、无闪动聊天分页、本地分页等,也支持作为基本布局容器使用
  444. * @tutorial https://z-paging.zxlee.cn
  445. * @property {Array} value 父组件v-model所绑定的list的值,默认为[]
  446. * @property {Number|String} defaultPageNo 自定义初始的pageNo,默认为1
  447. * @property {Number|String} defaultPageSize 自定义pageSize(每页显示多少条),默认为10
  448. * @property {Boolean} fixed z-paging是否使用fixed布局,默认为true
  449. * @property {Boolean} safeAreaInsetBottom 是否开启底部安全区域适配,默认为false
  450. * @property {Boolean} useSafeAreaPlaceholder 开启底部安全区域适配后,是否使用placeholder形式实现,默认为false
  451. * @property {Boolean} usePageScroll 使用页面滚动,默认为false
  452. * @property {Boolean} autoFullHeight 使用页面滚动时,是否在不满屏时自动填充满屏幕,默认为true
  453. * @property {String} defaultThemeStyle loading(下拉刷新、上拉加载更多)的主题样式,支持black,white,默认为black
  454. * @property {Object} pagingStyle 设置z-paging的style,部分平台(如微信小程序)无法直接修改组件的style,可使用此属性代替
  455. * @property {String|Array|Object} pagingClass 设置z-paging的class,优先级低于pagingStyle和height、width、maxWidth、bgColor
  456. * @property {String} height z-paging的高度,优先级低于pagingStyle中设置的height,传字符串,如100px、100rpx、100%
  457. * @property {String} width z-paging的宽度,优先级低于pagingStyle中设置的width,传字符串,如100px、100rpx、100%
  458. * @property {String} maxWidth z-paging的最大宽度,优先级低于pagingStyle中设置的max-width,默认为空
  459. * @property {String} bgColor z-paging的背景色(为css中的background,因此也可以设置渐变,背景图片等),优先级低于pagingStyle中设置的background-color
  460. * @property {Boolean} watchTouchDirectionChange 是否监听列表触摸方向改变,默认为false
  461. * @property {Boolean} watchScrollDirectionChange 是否监听列表滚动方向改变,默认为false
  462. * @property {Boolean} layoutOnly 是否只使用基础布局,设置为true后将关闭mounted自动请求数据、关闭下拉刷新和滚动到底部加载更多,强制隐藏空数据图。默认为否
  463. * @property {Number|String} delay 调用complete后延迟处理的时间,单位为毫秒,优先级高于min-delay,默认为0
  464. * @property {Number|String} minDelay 触发@query后最小延迟处理的时间,单位为毫秒,优先级低于delay,默认为0
  465. * @property {Boolean} callNetworkReject 请求失败是否触发reject,默认为true
  466. * @property {String} unit z-paging中默认布局的单位,默认为rpx
  467. * @property {Boolean} concat 自动拼接complete中传过来的数组,默认为true
  468. * @property {Number|String|Object} dataKey 为保证数据一致,设置当前tab切换时的标识key,并在complete中传递相同key,若二者不一致,则complete将不会生效
  469. * @property {String} autowireListName 【极简写法】自动注入的list名,可自动修改父view(包含ref="paging")中对应name的list值
  470. * @property {String} autowireQueryName 【极简写法】自动注入的query名,可自动调用父view(包含ref="paging")中的query方法
  471. * @property {Function} fetch 【极简写法】获取分页数据Function,功能与@query类似。若设置了fetch则@query将不再触发
  472. * @property {Object} fetchParams fetch的附加参数,fetch配置后有效
  473. * @property {Boolean} auto [z-paging]mounted后是否自动调用reload方法(mounted后自动调用接口),默认为true
  474. * @property {Boolean} autoScrollToTopWhenReload reload时自动滚动到顶部,默认为true
  475. * @property {Boolean} autoCleanListWhenReload reload时立即自动清空原list,默认为true
  476. * @property {Boolean} showRefresherWhenReload 列表刷新时自动显示下拉刷新view,默认为false
  477. * @property {Boolean} showLoadingMoreWhenReload 列表刷新时自动显示加载更多view,且为加载中状态,默认为false
  478. * @property {Boolean} createdReload 组件created时立即触发reload,默认为false
  479. * @property {Boolean} refresherEnabled 是否开启下拉刷新,默认为true
  480. * @property {Number|String} refresherThreshold 设置自定义下拉刷新阈值,默认单位为px,默认为80rpx
  481. * @property {Boolean} useRefresherStatusBarPlaceholder 是否开启下拉刷新状态栏占位,默认为false
  482. * @property {Boolean} refresherOnly 是否只使用下拉刷新,默认为false
  483. * @property {Boolean} useCustomRefresher 是否使用自定义的下拉刷新,默认为true
  484. * @property {Boolean} reloadWhenRefresh 用户下拉刷新时是否触发reload方法,默认为true
  485. * @property {String} refresherThemeStyle 下拉刷新的主题样式,支持black,white,默认为black
  486. * @property {Object} refresherImgStyle 自定义下拉刷新中左侧图标的样式
  487. * @property {Object} refresherTitleStyle 自定义下拉刷新中右侧状态描述文字的样式
  488. * @property {Object} refresherUpdateTimeStyle 自定义下拉刷新中右侧最后更新时间文字的样式
  489. * @property {Boolean} watchRefresherTouchmove 是否实时监听下拉刷新中进度,并通过@refresherTouchmove传递给父组件,默认为false
  490. * @property {Boolean} showRefresherUpdateTime 是否显示最后更新时间,默认为false
  491. * @property {String|Object} refresherDefaultText 自定义下拉刷新默认状态下的文字
  492. * @property {String|Object} refresherPullingText 自定义下拉刷新松手立即刷新状态下的文字
  493. * @property {String|Object} refresherRefreshingText 自定义下拉刷新刷新中状态下的文字
  494. * @property {String|Object} refresherCompleteText 自定义下拉刷新刷新结束状态下的文字
  495. * @property {String} refresherDefaultImg 自定义下拉刷新默认状态下的图片
  496. * @property {String} refresherPullingImg 自定义下拉刷新松手立即刷新状态下的图片
  497. * @property {String} refresherRefreshingImg 自定义下拉刷新刷新中状态下的图片
  498. * @property {String} refresherCompleteImg 自定义下拉刷新刷新结束状态下的图片
  499. * @property {Boolean} refresherRefreshingAnimated 自定义下拉刷新刷新中状态下是否展示旋转动画,默认为true
  500. * @property {Boolean} refresherEndBounceEnabled 是否开启自定义下拉刷新刷新结束回弹动画效果,默认为true
  501. * @property {String} refresherDefaultStyle 设置系统下拉刷新默认样式,支持设置black,white,none,默认为black
  502. * @property {String} refresherBackground 设置自定义下拉刷新区域背景颜色,默认为#FFFFFF00
  503. * @property {String} refresherFixedBackground 设置固定的自定义下拉刷新区域背景颜色,默认为#FFFFFF00
  504. * @property {Number|String} refresherFixedBacHeight 设置固定的自定义下拉刷新区域高度,默认为0
  505. * @property {Number|String} refresherDefaultDuration 设置自定义下拉刷新默认状态下回弹动画时间,单位为毫秒,默认为100
  506. * @property {Number|String} refresherCompleteDelay 自定义下拉刷新结束以后延迟收回的时间,单位为毫秒,默认为0
  507. * @property {Number|String} refresherCompleteDuration 自定义下拉刷新结束收回动画时间,单位为毫秒,默认为300
  508. * @property {Boolean} refresherVibrate 下拉刷新时下拉到“松手立即刷新”状态时是否使手机短振动,默认为false
  509. * @property {Boolean} refresherRefreshingScrollable 自定义下拉刷新刷新中状态是否允许列表滚动,默认为true
  510. * @property {Boolean} refresherCompleteScrollable 自定义下拉刷新结束状态下是否允许列表滚动,默认为false
  511. * @property {Number} refresherOutRate 设置自定义下拉刷新下拉超出阈值后继续下拉位移衰减的比例,默认为0.65
  512. * @property {Boolean} refresherF2Enabled 是否开启下拉进入二楼功能,默认为false
  513. * @property {Number|String} refresherF2Threshold 下拉进入二楼阈值,默认为200rpx
  514. * @property {Number|String} refresherF2Duration 下拉进入二楼动画时间,单位为毫秒,默认为200
  515. * @property {Boolean} showRefresherF2 下拉进入二楼状态松手后是否弹出二楼,默认为true
  516. * @property {Number} refresherPullRate 设置自定义下拉刷新下拉时实际下拉位移与用户下拉距离的比值,默认为0.75
  517. * @property {Number|String} refresherFps 自定义下拉刷新下拉帧率,默认为40
  518. * @property {Number|String} refresherMaxAngle 自定义下拉刷新允许触发的最大下拉角度,默认为40度
  519. * @property {Boolean} refresherAngleEnableChangeContinued 自定义下拉刷新的角度由未达到最大角度变到达到最大角度时,是否继续下拉刷新手势,默认为false
  520. * @property {Boolean} refresherNoTransform 下拉刷新时是否禁止下拉刷新view跟随用户触摸竖直移动,默认为false
  521. * @property {Boolean} loadingMoreEnabled 是否启用加载更多数据(含滑动到底部加载更多数据和点击加载更多数据),默认为true
  522. * @property {Number|String} lowerThreshold 距底部/右边多远时,触发scrolltolower事件,默认单位为px,默认为100rpx
  523. * @property {Boolean} toBottomLoadingMoreEnabled 是否启用滑动到底部加载更多数据,默认为true
  524. * @property {String} loadingMoreThemeStyle 底部加载更多的主题样式,支持black,white,默认为black
  525. * @property {Object} loadingMoreCustomStyle 自定义底部加载更多样式
  526. * @property {Object} loadingMoreTitleCustomStyle 自定义底部加载更多文字样式
  527. * @property {Object} loadingMoreLoadingIconCustomStyle 自定义底部加载更多加载中动画样式
  528. * @property {String} loadingMoreLoadingIconType 自定义底部加载更多加载中动画图标类型,可选flower或circle,默认为flower
  529. * @property {String} loadingMoreLoadingIconCustomImage 自定义底部加载更多加载中动画图标图片
  530. * @property {Boolean} loadingMoreLoadingAnimated 底部加载更多加载中view是否展示旋转动画,默认为true
  531. * @property {String|Object} loadingMoreDefaultText 滑动到底部"默认"文字
  532. * @property {String|Object} loadingMoreLoadingText 滑动到底部"加载中"文字
  533. * @property {String|Object} loadingMoreNoMoreText 滑动到底部"没有更多"文字
  534. * @property {String|Object} loadingMoreFailText 滑动到底部"加载失败"文字
  535. * @property {Boolean} hideNoMoreInside 当没有更多数据且分页内容未超出z-paging时是否隐藏没有更多数据的view,默认为false
  536. * @property {Number} hideNoMoreByLimit 当没有更多数据且分页数组长度少于这个值时,隐藏没有更多数据的view,默认为0
  537. * @property {Boolean} insideMore 当分页未满一屏时,是否自动加载更多,默认为false
  538. * @property {Boolean} loadingMoreDefaultAsLoading 滑动到底部状态为默认状态时,以加载中的状态展示,默认为false
  539. * @property {Boolean} showLoadingMoreNoMoreView 是否显示没有更多数据的view,默认为true
  540. * @property {Boolean} showDefaultLoadingMoreText 是否显示默认的加载更多text,默认为true
  541. * @property {Boolean} showLoadingMoreNoMoreLine 是否显示没有更多数据的分割线,默认为true
  542. * @property {Object} loadingMoreNoMoreLineCustomStyle 自定义底部没有更多数据的分割线样式
  543. * @property {Boolean} hideEmptyView 是否强制隐藏空数据图,默认为false
  544. * @property {Boolean} emptyViewFixed 空数据图片是否铺满z-paging,默认为false
  545. * @property {Boolean} emptyViewCenter 空数据图片是否垂直居中,默认为true
  546. * @property {String|Object} emptyViewText 空数据图描述文字
  547. * @property {String} emptyViewImg 空数据图图片
  548. * @property {String} emptyViewErrorImg 空数据图“加载失败”图片
  549. * @property {String|Object} emptyViewReloadText 空数据图点击重新加载文字
  550. * @property {String|Object} emptyViewErrorText 空数据图“加载失败”描述文字
  551. * @property {Object} emptyViewSuperStyle 空数据图父view样式
  552. * @property {Object} emptyViewStyle 空数据图样式
  553. * @property {Object} emptyViewImgStyle 空数据图img样式
  554. * @property {Object} emptyViewTitleStyle 空数据图描述文字样式
  555. * @property {Object} emptyViewReloadStyle 空数据图重新加载按钮样式
  556. * @property {Boolean} showEmptyViewReload 是否显示空数据图重新加载按钮(无数据时),默认为false
  557. * @property {Boolean} showEmptyViewReloadWhenError 加载失败时是否显示空数据图重新加载按钮,默认为true
  558. * @property {Boolean} autoHideEmptyViewWhenLoading 加载中时是否自动隐藏空数据图,默认为true
  559. * @property {Boolean} autoHideEmptyViewWhenPull 用户下拉列表触发下拉刷新加载中时是否自动隐藏空数据图,默认为true
  560. * @property {Boolean} autoHideLoadingAfterFirstLoaded 第一次加载后自动隐藏loading slot,默认为true
  561. * @property {Boolean} loadingFullFixed loading slot的父view是否铺满屏幕并固定,默认为false
  562. * @property {Boolean} autoShowSystemLoading 是否自动显示系统Loading:即uni.showLoading,默认为false
  563. * @property {String|Object} systemLoadingText 显示系统Loading时显示的文字
  564. * @property {Boolean} systemLoadingMask 显示系统Loading时是否显示透明蒙层,防止触摸穿透,默认为true
  565. * @property {Boolean} autoShowBackToTop 自动显示点击返回顶部按钮,默认为false
  566. * @property {Number|String} backToTopThreshold 点击返回顶部按钮显示/隐藏的阈值(滚动距离),默认单位为px,默认为400rpx
  567. * @property {String} backToTopImg 点击返回顶部按钮的自定义图片地址
  568. * @property {Boolean} backToTopWithAnimate 点击返回顶部按钮返回到顶部时是否展示过渡动画,默认为true
  569. * @property {Number|String} backToTopBottom 点击返回顶部按钮与底部的距离,默认单位为px,默认为160rpx
  570. * @property {Object} backToTopStyle 点击返回顶部按钮的自定义样式
  571. * @property {Boolean} useVirtualList 是否使用虚拟列表,默认为false
  572. * @property {Boolean} useCompatibilityMode 在使用虚拟列表时,是否使用兼容模式,默认为false
  573. * @property {Object} extraData 使用兼容模式时传递的附加数据
  574. * @property {String} cellHeightMode 虚拟列表cell高度模式,默认为fixed
  575. * @property {Number|String} preloadPage 预加载的列表可视范围(列表高度)页数,默认为12
  576. * @property {Number|String} fixedCellHeight 固定的cell高度,`cell-height-mode=fixed`才有效,默认为空
  577. * @property {Number|String} virtualListCol 虚拟列表列数,默认为1
  578. * @property {Number|String} virtualScrollFps 虚拟列表scroll取样帧率,默认为80
  579. * @property {String} virtualCellIdPrefix 虚拟列表cell id的前缀
  580. * @property {Boolean} useInnerList 是否在z-paging内部循环渲染列表(使用内置列表),默认为false
  581. * @property {Boolean} forceCloseInnerList 强制关闭inner-list,默认为false
  582. * @property {Boolean} virtualInSwiperSlot 虚拟列表是否使用swiper-item或其他父组件包裹,默认为false
  583. * @property {Boolean} inSwiperSlot z-paging是否使用swiper-item或其他父组件包裹,默认为否
  584. * @property {String} cellKeyName 内置列表cell的key名称(仅nvue有效)
  585. * @property {Object} innerListStyle innerList样式
  586. * @property {Object} innerCellStyle innerCell样式
  587. * @property {Number|String} localPagingLoadingTime 本地分页时上拉加载更多延迟时间,单位为毫秒,默认为200
  588. * @property {Boolean} useChatRecordMode 使用聊天记录模式,默认为false
  589. * @property {Boolean} autoHideKeyboardWhenChat 使用聊天记录模式时是否自动隐藏键盘,默认为true
  590. * @property {Boolean} autoAdjustPositionWhenChat 使用聊天记录模式中键盘弹出时是否自动调整slot="bottom"高度,默认为true
  591. * @property {Boolean} autoToBottomWhenChat 使用聊天记录模式中键盘弹出时是否自动滚动到底部,默认为false
  592. * @property {String} chatAdjustPositionOffset 使用聊天记录模式中键盘弹出时占位高度偏移距离,默认为0px
  593. * @property {Boolean} showChatLoadingWhenReload 使用聊天记录模式中`reload`时是否显示`chatLoading`,默认为false
  594. * @property {String} bottomBgColor `bottom`的背景色,默认透明
  595. * @property {Boolean} chatLoadingMoreDefaultAsLoading 在聊天记录模式中滑动到顶部状态为默认状态时,是否以加载中的状态展示,默认为true
  596. * @property {Boolean} showScrollbar 控制是否出现滚动条,默认为true
  597. * @property {Boolean} scrollable 是否可以滚动,使用内置scroll-view和nvue时有效,默认为true
  598. * @property {Boolean} scrollX 是否允许横向滚动,默认为false
  599. * @property {Boolean} scrollToTopBounceEnabled iOS设备上滚动到顶部时是否允许回弹效果,默认为false
  600. * @property {Boolean} scrollToBottomBounceEnabled iOS设备上滚动到底部时是否允许回弹效果,默认为true
  601. * @property {Boolean} scrollWithAnimation 在设置滚动条位置时使用动画过渡,默认为false
  602. * @property {String} scrollIntoView 值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素
  603. * @property {Boolean} enableBackToTop iOS点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,默认为true
  604. * @property {String} nvueListIs nvue中修改列表类型,默认为list
  605. * @property {Object} nvueWaterfallConfig waterfall配置,仅在nvue中且nvueListIs=waterfall时有效
  606. * @property {Boolean} nvueBounce nvue控制是否回弹效果,iOS不支持动态修改,默认为true
  607. * @property {Boolean} nvueFastScroll nvue中通过代码滚动到顶部/底部时,是否加快动画效果,默认为false
  608. * @property {String} nvueListId nvue中list的id
  609. * @property {Boolean} hideNvueBottomTag 是否隐藏nvue列表底部的tagView,默认为false
  610. * @property {Boolean} nvuePagingEnabled 设置nvue中是否按分页模式(类似竖向swiper)显示List,默认为false
  611. * @property {Number} offsetAccuracy nvue中控制onscroll事件触发的频率,默认为空
  612. * @property {Boolean} useCache 是否使用缓存,默认为false
  613. * @property {String} cacheKey 使用缓存时缓存的key
  614. * @property {String} cacheMode 缓存模式,默认为default
  615. * @property {Number} topZIndex slot="top"的view的z-index,默认为99
  616. * @property {Number} superContentZIndex z-paging内容容器父view的z-index,默认为1
  617. * @property {Number} contentZIndex z-paging内容容器部分的z-index,默认为1
  618. * @property {Number} emptyViewZIndex 空数据view的z-index,默认为9
  619. * @property {Boolean} autoHeight z-paging是否自动高度,默认为false
  620. * @property {Number|String} autoHeightAddition z-paging自动高度时的附加高度,默认为0px
  621. * @event {Function} input 父组件v-model所绑定的list的值改变时触发此事件
  622. * @event {Function} query 下拉刷新或滚动到底部时会自动触发此方法。z-paging加载时也会触发(若要禁止,请设置:auto="false")。pageNo和pageSize会自动计算好,直接传给服务器即可。
  623. * @event {Function} listChange 分页渲染的数组改变时触发
  624. * @event {Function} refresherStatusChange 自定义下拉刷新状态改变
  625. * @event {Function} refresherTouchstart 自定义下拉刷新下拉开始
  626. * @event {Function} refresherTouchmove 自定义下拉刷新下拉拖动中
  627. * @event {Function} refresherTouchend 自定义下拉刷新下拉结束
  628. * @event {Function} refresherF2Change 下拉进入二楼状态改变
  629. * @event {Function} refresh 自定义下拉刷新被触发
  630. * @event {Function} restore 自定义下拉刷新被复位
  631. * @event {Function} loadingStatusChange 自定义下拉刷新状态改变
  632. * @event {Function} emptyViewReload 点击了空数据图中的重新加载按钮
  633. * @event {Function} emptyViewClick 点击了空数据图view
  634. * @event {Function} isLoadFailedChange z-paging请求失败状态改变
  635. * @event {Function} backToTopClick 点击了返回顶部按钮
  636. * @event {Function} virtualListChange 虚拟列表当前渲染的数组改变时触发
  637. * @event {Function} innerCellClick 使用虚拟列表或内置列表时点击了cell
  638. * @event {Function} virtualPlaceholderTopHeight 虚拟列表顶部占位高度改变
  639. * @event {Function} hidedKeyboard 在聊天记录模式下,触摸列表隐藏了键盘
  640. * @event {Function} keyboardHeightChange 键盘高度改变
  641. * @event {Function} scroll z-paging列表滚动时触发
  642. * @event {Function} scrollTopChange scrollTop改变时触发
  643. * @event {Function} scrolltolower z-paging内置的scroll-view/list-view/waterfall滚动底部时触发
  644. * @event {Function} scrolltoupper z-paging内置的scroll-view/list-view/waterfall滚动顶部时触发
  645. * @event {Function} scrollend z-paging内置的list滚动结束时触发
  646. * @event {Function} contentHeightChanged z-paging中内容高度改变时触发
  647. * @event {Function} touchDirectionChange 监听列表触摸方向改变(nvue无效)
  648. * @event {Function} scrollDirectionChange 监听列表滚动方向改变(页面滚动无效)
  649. * @example <z-paging ref="paging" v-model="dataList" @query="queryList"></z-paging>
  650. */
  651. export default {
  652. name:"z-paging",
  653. // #ifdef APP-VUE || H5
  654. mixins: [pagingRenderjs],
  655. // #endif
  656. }
  657. </script>
  658. <script src="./js/z-paging-main.js" />
  659. <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 -->
  660. <script src="./wxs/z-paging-wxs.wxs" module="pagingWxs" lang="wxs"></script>
  661. <!-- #endif -->
  662. <style scoped>
  663. @import "./css/z-paging-main.css";
  664. @import "./css/z-paging-static.css";
  665. </style>