| | |
| | | VITE_APP_PORT = 4096 |
| | | |
| | | # API åºç¡è·¯å¾ï¼å¼åç¯å¢ä¸ç请æ±åç¼ |
| | | VITE_APP_BASE_API = '/dev-api' |
| | | VITE_APP_BASE_API = '/mes' |
| | | |
| | | # API æå¡å¨ç URL |
| | | VITE_APP_API_URL = https://api.youlai.tech |
| | | VITE_APP_API_URL = 'http://114.132.189.42:7002' |
| | |
| | | login(data: LoginFormData): Promise<LoginResult> { |
| | | console.log("data", data); |
| | | return request<LoginResult>({ |
| | | url: "/api/v1/auth/login", |
| | | url: "/login", |
| | | method: "POST", |
| | | data: data, |
| | | header: { |
| | |
| | | <template> |
| | | <view class="flex items-center justify-between page"> |
| | | <view class="ml-3"> |
| | | <view :class="['flex', 'items-center', 'justify-between', 'page', full ? 'mx-3' : '']"> |
| | | <view> |
| | | <text class="title">{{ title }}</text> |
| | | </view> |
| | | <view v-if="hideAction" class="flex justify-center"> |
| | |
| | | </template> |
| | | <script setup lang="ts"> |
| | | defineProps({ |
| | | full: { |
| | | type: Boolean, |
| | | default: true, |
| | | }, |
| | | title: String, |
| | | hideAction: Boolean, |
| | | }); |
| | |
| | | <style lang="scss" scoped> |
| | | .page { |
| | | padding: 10px 0; |
| | | margin: 0 10px; |
| | | .title { |
| | | position: relative; |
| | | margin-left: 10px; |
| | |
| | | //æé©¬ TC20 |
| | | var banMaSacanInfo = intent.getStringExtra( |
| | | "com.motorolasolutions.emdk.datawedge.data_string" |
| | | ); // callback(intent.getStringExtra('com.motorolasolutions.emdk.datawedge.data_string')); |
| | | ); |
| | | // callback(intent.getStringExtra('com.motorolasolutions.emdk.datawedge.data_string')); |
| | | console.log("æé©¬æ«æç»æ", banMaSacanInfo); |
| | | // ä¼ å
¥æ¥æ¶å°çåæ° |
| | | that.queryCode(banMaSacanInfo); |
| | |
| | | }); |
| | | // #endif |
| | | }, |
| | | triggerScan() { |
| | | console.log("è§¦åæ«æ"); |
| | | // è·åAndroidæå¾ç±» |
| | | let Intent = plus.android.importClass("android.content.Intent"); |
| | | // å®ä¾åæå¾ |
| | | let intent = new Intent(); |
| | | // å®ä¹æå¾ï¼ç±ååæä¾(æ¤å¤è®¾ç½®ä¸ºä¸å¤§çï¼ å¼å§æ«æå¹¿æcom.scan.onStartScanï¼å¯¹åºçåæ¢æ«æå¹¿æä¸ºcom.scan.onEndScan) |
| | | intent.setAction("com.symbol.datawedge.api.ACTION"); |
| | | intent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING"); |
| | | // 广æè¿ä¸ªæå¾ |
| | | main.sendBroadcast(intent); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- z-paging --> |
| | | <!-- githubå°å:https://github.com/SmileZXLee/uni-z-paging --> |
| | | <!-- dcloudå°å:https://ext.dcloud.net.cn/plugin?id=3935 --> |
| | | <!-- åé¦QQ群ï¼790460711 --> |
| | | |
| | | <!-- z-paging-cellï¼ç¨äºå¨nvueä¸ä½¿ç¨cellå
裹ï¼vueä¸ä½¿ç¨viewå
裹 --> |
| | | <template> |
| | | <!-- #ifdef APP-NVUE --> |
| | | <cell :style="[cellStyle]" @touchstart="onTouchstart"> |
| | | <slot /> |
| | | </cell> |
| | | <!-- #endif --> |
| | | <!-- #ifndef APP-NVUE --> |
| | | <view :style="[cellStyle]" @touchstart="onTouchstart"> |
| | | <slot /> |
| | | </view> |
| | | <!-- #endif --> |
| | | </template> |
| | | |
| | | <script> |
| | | /** |
| | | * z-paging-cell ç»ä»¶ |
| | | * @description ç¨äºå
¼å®¹ nvue å vue ä¸ç cell 渲æãå ä¸ºå¨ nvue ä¸ z-paging å
ç½®çæ¯ listï¼å æ¤å表 item å¿
é¡»ä½¿ç¨ cell å
ä½ï¼å¨ vue ä¸ä¸è½ä½¿ç¨ cellï¼å¦å伿¥ç»ä»¶æ¾ä¸å°çéè¯¯ãæ¤åç»ä»¶ä¸ºäºå
¼å®¹è¿ä¸¤ç§æ
åµï¼å
é¨ä½äºæ¡ä»¶ç¼è¯å¤çã |
| | | * @tutorial https://z-paging.zxlee.cn/api/sub-components/main.html#z-paging-cellé
ç½® |
| | | * @notice 以ä¸ä¸º z-paging-cell çé
置项 |
| | | * @property {Object} cellStyle cell æ ·å¼ï¼é»è®¤ä¸º {} |
| | | * @example <z-paging-cell :cellStyle="{ backgroundColor: '#f0f0f0' }"></z-paging-cell> |
| | | */ |
| | | export default { |
| | | name: "z-paging-cell", |
| | | props: { |
| | | //cellStyle |
| | | cellStyle: { |
| | | type: Object, |
| | | default: function() { |
| | | return {} |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | onTouchstart(e) { |
| | | this.$emit('touchstart', e); |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- z-paging --> |
| | | <!-- githubå°å:https://github.com/SmileZXLee/uni-z-paging --> |
| | | <!-- dcloudå°å:https://ext.dcloud.net.cn/plugin?id=3935 --> |
| | | <!-- åé¦QQ群ï¼790460711 --> |
| | | |
| | | <!-- ç©ºæ°æ®å ä½viewï¼æ¤ç»ä»¶æ¯æeasycomè§èï¼å¯ä»¥å¨é¡¹ç®ä¸ç´æ¥å¼ç¨ --> |
| | | <template> |
| | | <view :class="{'zp-container':true,'zp-container-fixed':emptyViewFixed}" :style="[finalEmptyViewStyle]" @click="emptyViewClick"> |
| | | <view class="zp-main"> |
| | | <image v-if="!emptyViewImg.length" :class="{'zp-main-image-rpx':unit==='rpx','zp-main-image-px':unit==='px'}" :style="[emptyViewImgStyle]" :src="emptyImg" /> |
| | | <image v-else :class="{'zp-main-image-rpx':unit==='rpx','zp-main-image-px':unit==='px'}" mode="aspectFit" :style="[emptyViewImgStyle]" :src="emptyViewImg" /> |
| | | <text class="zp-main-title" :class="{'zp-main-title-rpx':unit==='rpx','zp-main-title-px':unit==='px'}" :style="[emptyViewTitleStyle]">{{emptyViewText}}</text> |
| | | <text v-if="showEmptyViewReload" :class="{'zp-main-error-btn':true,'zp-main-error-btn-rpx':unit==='rpx','zp-main-error-btn-px':unit==='px'}" :style="[emptyViewReloadStyle]" @click.stop="reloadClick">{{emptyViewReloadText}}</text> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import zStatic from '../z-paging/js/z-paging-static' |
| | | |
| | | /** |
| | | * z-paging-empty-view ç©ºæ°æ®ç»ä»¶ |
| | | * @description éç¨ç z-paging ç©ºæ°æ®ç»ä»¶ |
| | | * @tutorial https://z-paging.zxlee.cn/api/sub-components/main.html#z-paging-empty-viewé
ç½® |
| | | * @property {Boolean} emptyViewFixed ç©ºæ°æ®å¾çæ¯å¦éºæ»¡ z-pagingï¼é»è®¤ä¸º falseãè¥è®¾ç½®ä¸º trueï¼å为填å
满 z-paging çå©ä½é¨å |
| | | * @property {String} emptyViewText ç©ºæ°æ®å¾æè¿°æåï¼é»è®¤ä¸º 'æ²¡ææ°æ®å¦~' |
| | | * @property {String} emptyViewImg ç©ºæ°æ®å¾å¾çï¼é»è®¤ä½¿ç¨ z-paging å
ç½®çå¾ç (建议使ç¨ç»å¯¹è·¯å¾ï¼å¼å¤´ä¸è¦æ·»å "@"ï¼è¯·ä»¥ "/" å¼å¤´) |
| | | * @property {String} emptyViewReloadText ç©ºæ°æ®å¾ç¹å»éæ°å è½½æåï¼é»è®¤ä¸º 'éæ°å è½½' |
| | | * @property {Object} emptyViewStyle ç©ºæ°æ®å¾æ ·å¼ï¼å¯è®¾ç½®ç©ºæ°æ® view ç top çï¼å¦: empty-view-style="{'top':'100rpx'}" (å¦æç©ºæ°æ®å¾ä¸æ¯ fixed å¸å±ï¼åæ¤å¤æ¯ margin-top)ï¼é»è®¤ä¸º {} |
| | | * @property {Object} emptyViewImgStyle ç©ºæ°æ®å¾ img æ ·å¼ï¼é»è®¤ä¸º {} |
| | | * @property {Object} emptyViewTitleStyle ç©ºæ°æ®å¾æè¿°æåæ ·å¼ï¼é»è®¤ä¸º {} |
| | | * @property {Object} emptyViewReloadStyle ç©ºæ°æ®å¾éæ°å è½½æé®æ ·å¼ï¼é»è®¤ä¸º {} |
| | | * @property {Boolean} showEmptyViewReload æ¯å¦æ¾ç¤ºç©ºæ°æ®å¾éæ°å è½½æé®(æ æ°æ®æ¶)ï¼é»è®¤ä¸º false |
| | | * @property {Boolean} isLoadFailed æ¯å¦æ¯å 载失败ï¼é»è®¤ä¸º false |
| | | * @property {String} unit ç©ºæ°æ®å¾ä¸å¸å±çåä½ï¼é»è®¤ä¸º 'rpx' |
| | | * @event {Function} reload ç¹å»äºéæ°å è½½æé® |
| | | * @event {Function} viewClick ç¹å»äºç©ºæ°æ®å¾ view |
| | | * @example <z-paging-empty-view empty-view-text="ææ æ°æ®" /> |
| | | */ |
| | | export default { |
| | | name: "z-paging-empty-view", |
| | | data() { |
| | | return { |
| | | |
| | | }; |
| | | }, |
| | | props: { |
| | | // ç©ºæ°æ®æè¿°æå |
| | | emptyViewText: { |
| | | type: String, |
| | | default: 'æ²¡ææ°æ®å¦~' |
| | | }, |
| | | // ç©ºæ°æ®å¾ç |
| | | emptyViewImg: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºç©ºæ°æ®å¾éæ°å è½½æé® |
| | | showEmptyViewReload: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // ç©ºæ°æ®ç¹å»éæ°å è½½æå |
| | | emptyViewReloadText: { |
| | | type: String, |
| | | default: 'éæ°å è½½' |
| | | }, |
| | | // æ¯å¦æ¯å 载失败 |
| | | isLoadFailed: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // ç©ºæ°æ®å¾æ ·å¼ |
| | | emptyViewStyle: { |
| | | type: Object, |
| | | default: function() { |
| | | return {} |
| | | } |
| | | }, |
| | | // ç©ºæ°æ®å¾imgæ ·å¼ |
| | | emptyViewImgStyle: { |
| | | type: Object, |
| | | default: function() { |
| | | return {} |
| | | } |
| | | }, |
| | | // ç©ºæ°æ®å¾æè¿°æåæ ·å¼ |
| | | emptyViewTitleStyle: { |
| | | type: Object, |
| | | default: function() { |
| | | return {} |
| | | } |
| | | }, |
| | | // ç©ºæ°æ®å¾éæ°å è½½æé®æ ·å¼ |
| | | emptyViewReloadStyle: { |
| | | type: Object, |
| | | default: function() { |
| | | return {} |
| | | } |
| | | }, |
| | | // ç©ºæ°æ®å¾z-index |
| | | emptyViewZIndex: { |
| | | type: Number, |
| | | default: 9 |
| | | }, |
| | | // ç©ºæ°æ®å¾çæ¯å¦ä½¿ç¨fixedå¸å±å¹¶éºæ»¡z-paging |
| | | emptyViewFixed: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // ç©ºæ°æ®å¾ä¸å¸å±çåä½ï¼é»è®¤ä¸ºrpx |
| | | unit: { |
| | | type: String, |
| | | default: 'rpx' |
| | | } |
| | | }, |
| | | computed: { |
| | | emptyImg() { |
| | | return this.isLoadFailed ? zStatic.base64Error : zStatic.base64Empty; |
| | | }, |
| | | finalEmptyViewStyle(){ |
| | | this.emptyViewStyle['z-index'] = this.emptyViewZIndex; |
| | | return this.emptyViewStyle; |
| | | } |
| | | }, |
| | | methods: { |
| | | // ç¹å»äºreloadæé® |
| | | reloadClick() { |
| | | this.$emit('reload'); |
| | | }, |
| | | // ç¹å»äºç©ºæ°æ®view |
| | | emptyViewClick() { |
| | | this.$emit('viewClick'); |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .zp-container{ |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | .zp-container-fixed { |
| | | /* #ifndef APP-NVUE */ |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | /* #endif */ |
| | | /* #ifdef APP-NVUE */ |
| | | flex: 1; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-main{ |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: column; |
| | | align-items: center; |
| | | padding: 50rpx 0rpx; |
| | | } |
| | | |
| | | .zp-main-image-rpx { |
| | | width: 240rpx; |
| | | height: 240rpx; |
| | | } |
| | | .zp-main-image-px { |
| | | width: 120px; |
| | | height: 120px; |
| | | } |
| | | |
| | | .zp-main-title { |
| | | color: #aaaaaa; |
| | | text-align: center; |
| | | } |
| | | .zp-main-title-rpx { |
| | | font-size: 28rpx; |
| | | margin-top: 10rpx; |
| | | padding: 0rpx 20rpx; |
| | | } |
| | | .zp-main-title-px { |
| | | font-size: 14px; |
| | | margin-top: 5px; |
| | | padding: 0px 10px; |
| | | } |
| | | |
| | | .zp-main-error-btn { |
| | | border: solid 1px #dddddd; |
| | | color: #aaaaaa; |
| | | } |
| | | .zp-main-error-btn-rpx { |
| | | font-size: 28rpx; |
| | | padding: 8rpx 24rpx; |
| | | border-radius: 6rpx; |
| | | margin-top: 50rpx; |
| | | } |
| | | .zp-main-error-btn-px { |
| | | font-size: 14px; |
| | | padding: 4px 12px; |
| | | border-radius: 3px; |
| | | margin-top: 25px; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- z-paging --> |
| | | <!-- githubå°å:https://github.com/SmileZXLee/uni-z-paging --> |
| | | <!-- dcloudå°å:https://ext.dcloud.net.cn/plugin?id=3935 --> |
| | | <!-- åé¦QQ群ï¼790460711 --> |
| | | |
| | | <!-- æ»å¨åæ¢é项å¡swiper-itemï¼æ¤ç»ä»¶æ¯æeasycomè§èï¼å¯ä»¥å¨é¡¹ç®ä¸ç´æ¥å¼ç¨ --> |
| | | <template> |
| | | <view class="zp-swiper-item-container"> |
| | | <z-paging ref="paging" :fixed="false" |
| | | :auto="false" :useVirtualList="useVirtualList" :useInnerList="useInnerList" :cellKeyName="cellKeyName" :innerListStyle="innerListStyle" |
| | | :preloadPage="preloadPage" :cellHeightMode="cellHeightMode" :virtualScrollFps="virtualScrollFps" :virtualListCol="virtualListCol" |
| | | @query="_queryList" @listChange="_updateList"> |
| | | <slot /> |
| | | <template #header> |
| | | <slot name="header"/> |
| | | </template> |
| | | <template #cell="{item,index}"> |
| | | <slot name="cell" :item="item" :index="index"/> |
| | | </template> |
| | | <template #footer> |
| | | <slot name="footer"/> |
| | | </template> |
| | | </z-paging> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import zPaging from '../z-paging/z-paging' |
| | | /** |
| | | * z-paging-swiper-item ç»ä»¶ |
| | | * @description swiper+listæç®åæ³ä¸ä½¿ç¨å°ï¼å®é
ä¸å°±æ¯å¯¹æ®éçswiper+listä¸swiper-itemçå
è£
å°è£
ï¼ç¨ä»¥ç®ååæ³ï¼ä½ä¸ªæ§åé
ç½®å±éè¾å¤ |
| | | * @tutorial https://z-paging.zxlee.cn/api/sub-components/main.html#z-paging-swiper-itemé
ç½® |
| | | * @notice 以ä¸ä¸º z-paging-swiper-item çé
置项 |
| | | * @property {Number} tabIndex å½åç»ä»¶ç indexï¼ä¹å°±æ¯å½åç»ä»¶æ¯ swiper ä¸ç第å 个ï¼é»è®¤ä¸º 0 |
| | | * @property {Number} currentIndex å½å swiper 忢å°ç¬¬å 个 indexï¼é»è®¤ä¸º 0 |
| | | * @property {Boolean} useVirtualList æ¯å¦ä½¿ç¨èæå表ï¼é»è®¤ä¸º false |
| | | * @property {Boolean} useInnerList æ¯å¦å¨ z-paging å
é¨å¾ªç¯æ¸²æå表ï¼å
ç½®å表ï¼ï¼é»è®¤ä¸º falseãè¥ useVirtualList 为 trueï¼åæ¤é¡¹æä¸º true |
| | | * @property {String} cellKeyName å
ç½®å表 cell ç key åç§°ï¼ä»
nvue ææï¼å¨ nvue ä¸å¼å¯ useInnerList æ¶å¿
须填æ¤é¡¹ï¼é»è®¤ä¸º '' |
| | | * @property {Object} innerListStyle innerList æ ·å¼ï¼é»è®¤ä¸º {} |
| | | * @property {Number|String} preloadPage é¢å è½½çå表å¯è§èå´ï¼å表é«åº¦ï¼é¡µæ°ï¼é»è®¤ä¸º 12ãæ¤æ°å¼è¶å¤§ï¼åèæå表ä¸å è½½ç dom è¶å¤ï¼å
åæ¶èè¶å¤§ï¼ä¼ç»´æå¨ä¸ä¸ªç¨³å®å¼ï¼ï¼ä½å¢å é¢å è½½é¡µé¢æ°éå¯ç¼è§£å¿«éæ»å¨çæç½å±é®é¢ |
| | | * @property {String} cellHeightMode èæå表 cell é«åº¦æ¨¡å¼ï¼é»è®¤ä¸º 'fixed'ï¼ä¹å°±æ¯æ¯ä¸ª cell é«åº¦å®å
¨ç¸åï¼å°ä»¥ç¬¬ä¸ä¸ª cell é«åº¦ä¸ºåè¿è¡è®¡ç®ãå¯éå¼ãdynamicãï¼å³ä»£è¡¨é«åº¦æ¯å¨æéåºå®çï¼ãdynamicãæ§è½ä½äºãfixedã |
| | | * @property {Number|String} virtualListCol èæåè¡¨åæ°ï¼é»è®¤ä¸º 1ã常ç¨äºæ¯è¡æå¤åçæ
åµï¼ä¾å¦æ¯è¡æ 2 åæ°æ®ï¼éè¦å°æ¤å¼è®¾ç½®ä¸º 2 |
| | | * @property {Number|String} virtualScrollFps èæå表 scroll åæ ·å¸§çï¼é»è®¤ä¸º 60ï¼è¿é«å¯è½åºç°å¡é¡¿çé®é¢ |
| | | * @example <z-paging-swiper-item ref="swiperItem" :tabIndex="index" :currentIndex="current" @query="queryList" @updateList="updateList"></z-paging-swiper-item> |
| | | */ |
| | | export default { |
| | | name: "z-paging-swiper-item", |
| | | components: { zPaging }, |
| | | data() { |
| | | return { |
| | | firstLoaded: false |
| | | } |
| | | }, |
| | | props: { |
| | | // å½åç»ä»¶çindexï¼ä¹å°±æ¯å½åç»ä»¶æ¯swiperä¸ç第å 个 |
| | | tabIndex: { |
| | | type: Number, |
| | | default: function() { |
| | | return 0 |
| | | } |
| | | }, |
| | | // å½åswiper忢å°ç¬¬å 个index |
| | | currentIndex: { |
| | | type: Number, |
| | | default: function() { |
| | | return 0 |
| | | } |
| | | }, |
| | | // æ¯å¦ä½¿ç¨èæå表ï¼é»è®¤ä¸ºå¦ |
| | | useVirtualList: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // æ¯å¦å¨z-pagingå
é¨å¾ªç¯æ¸²æå表(å
ç½®å表)ï¼é»è®¤ä¸ºå¦ãè¥use-virtual-list为trueï¼åæ¤é¡¹æä¸ºtrue |
| | | useInnerList: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // å
ç½®å表cellçkeyåç§°ï¼ä»
nvueææï¼å¨nvueä¸å¼å¯use-inner-listæ¶å¿
须填æ¤é¡¹ |
| | | cellKeyName: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | // innerListæ ·å¼ |
| | | innerListStyle: { |
| | | type: Object, |
| | | default: function() { |
| | | return {}; |
| | | } |
| | | }, |
| | | // é¢å è½½çå表å¯è§èå´(å表é«åº¦)页æ°ï¼é»è®¤ä¸º12ï¼å³é¢å è½½å½å页åä¸ä¸å12页çcellãæ¤æ°å¼è¶å¤§ï¼åèæå表ä¸å è½½çdomè¶å¤ï¼å
åæ¶èè¶å¤§(ä¼ç»´æå¨ä¸ä¸ªç¨³å®å¼)ï¼ä½å¢å é¢å è½½é¡µé¢æ°éå¯ç¼è§£å¿«éæ»å¨çæç½å±é®é¢ |
| | | preloadPage: { |
| | | type: [Number, String], |
| | | default: 12 |
| | | }, |
| | | // èæå表cellé«åº¦æ¨¡å¼ï¼é»è®¤ä¸ºfixedï¼ä¹å°±æ¯æ¯ä¸ªcellé«åº¦å®å
¨ç¸åï¼å°ä»¥ç¬¬ä¸ä¸ªcellé«åº¦ä¸ºåè¿è¡è®¡ç®ãå¯éå¼ãdynamicãï¼å³ä»£è¡¨é«åº¦æ¯å¨æéåºå®çï¼ãdynamicãæ§è½ä½äºãfixedãã |
| | | cellHeightMode: { |
| | | type: String, |
| | | default: 'fixed' |
| | | }, |
| | | // èæåè¡¨åæ°ï¼é»è®¤ä¸º1ã常ç¨äºæ¯è¡æå¤åçæ
åµï¼ä¾å¦æ¯è¡æ2åæ°æ®ï¼éè¦å°æ¤å¼è®¾ç½®ä¸º2 |
| | | virtualListCol: { |
| | | type: [Number, String], |
| | | default: 1 |
| | | }, |
| | | // èæå表scrollåæ ·å¸§çï¼é»è®¤ä¸º60ï¼è¿é«å¯è½åºç°å¡é¡¿çé®é¢ |
| | | virtualScrollFps: { |
| | | type: [Number, String], |
| | | default: 60 |
| | | }, |
| | | }, |
| | | watch: { |
| | | currentIndex: { |
| | | handler(newVal, oldVal) { |
| | | if (newVal === this.tabIndex) { |
| | | // æå è½½ï¼å½æ»å¨å°å½åçitemæ¶ï¼æå»å è½½ |
| | | if (!this.firstLoaded) { |
| | | this.$nextTick(()=>{ |
| | | let delay = 5; |
| | | // #ifdef MP-TOUTIAO |
| | | delay = 100; |
| | | // #endif |
| | | setTimeout(() => { |
| | | this.$refs.paging.reload().catch(() => {}); |
| | | }, delay); |
| | | }) |
| | | } |
| | | } |
| | | }, |
| | | immediate: true |
| | | } |
| | | }, |
| | | methods: { |
| | | reload(data) { |
| | | return this.$refs.paging.reload(data); |
| | | }, |
| | | complete(data) { |
| | | this.firstLoaded = true; |
| | | return this.$refs.paging.complete(data); |
| | | }, |
| | | _queryList(pageNo, pageSize, from) { |
| | | this.$emit('query', pageNo, pageSize, from); |
| | | }, |
| | | _updateList(list) { |
| | | this.$emit('updateList', list); |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .zp-swiper-item-container { |
| | | /* #ifndef APP-NVUE */ |
| | | height: 100%; |
| | | /* #endif */ |
| | | /* #ifdef APP-NVUE */ |
| | | flex: 1; |
| | | /* #endif */ |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- z-paging --> |
| | | <!-- githubå°å:https://github.com/SmileZXLee/uni-z-paging --> |
| | | <!-- dcloudå°å:https://ext.dcloud.net.cn/plugin?id=3935 --> |
| | | <!-- åé¦QQ群ï¼790460711 --> |
| | | |
| | | <!-- æ»å¨åæ¢é项å¡swiper容å¨ï¼æ¤ç»ä»¶æ¯æeasycomè§èï¼å¯ä»¥å¨é¡¹ç®ä¸ç´æ¥å¼ç¨ --> |
| | | <template> |
| | | <view :class="fixed?'zp-swiper-container zp-swiper-container-fixed':'zp-swiper-container'" :style="[finalSwiperStyle]"> |
| | | <!-- #ifndef APP-PLUS --> |
| | | <view v-if="cssSafeAreaInsetBottom===-1" class="zp-safe-area-inset-bottom"></view> |
| | | <!-- #endif --> |
| | | <slot v-if="zSlots.top" name="top" /> |
| | | <view class="zp-swiper-super"> |
| | | <view v-if="zSlots.left" :class="{'zp-swiper-left':true,'zp-absoulte':isOldWebView}"> |
| | | <slot name="left" /> |
| | | </view> |
| | | <view :class="{'zp-swiper':true,'zp-absoulte':isOldWebView}" :style="[swiperContentStyle]"> |
| | | <slot /> |
| | | </view> |
| | | <view v-if="zSlots.right" :class="{'zp-swiper-right':true,'zp-absoulte zp-right':isOldWebView}"> |
| | | <slot name="right" /> |
| | | </view> |
| | | </view> |
| | | <slot v-if="zSlots.bottom" name="bottom" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script> |
| | | import commonLayoutModule from '../z-paging/js/modules/common-layout' |
| | | |
| | | /** |
| | | * z-paging-swiper ç»ä»¶ |
| | | * @description å¨ swiper ä¸ä½¿ç¨ z-paging æ¶ï¼å·¦å³æ»å¨åæ¢å表ï¼ï¼å¨æ ¹èç¹ä½¿ç¨ z-paging-swiperï¼å
¶ç¸å½äºä¸ä¸ª view 容å¨ï¼é»è®¤éºæ»¡å
¨å±ï¼å¯å
计ç®é«åº¦ç´æ¥æå
¥ swiper çè§å¾å®¹å¨ã |
| | | * @tutorial https://z-paging.zxlee.cn/api/sub-components/main.html#z-paging-swiperé
ç½® |
| | | * @property {Boolean} fixed æ¯å¦ä½¿ç¨ fixed å¸å±ï¼é»è®¤ä¸º true |
| | | * @property {Boolean} safeAreaInsetBottom æ¯å¦å¼å¯åºé¨å®å
¨åºåéé
ï¼é»è®¤ä¸º false |
| | | * @property {Object} swiperStyle z-paging-swiper æ ·å¼ï¼é»è®¤ä¸º {} |
| | | * @example <z-paging-swiper :safeAreaInsetBottom="true"></z-paging-swiper> |
| | | */ |
| | | export default { |
| | | name: "z-paging-swiper", |
| | | mixins: [commonLayoutModule], |
| | | data() { |
| | | return { |
| | | swiperContentStyle: {} |
| | | }; |
| | | }, |
| | | props: { |
| | | // æ¯å¦ä½¿ç¨fixedå¸å±ï¼é»è®¤ä¸ºæ¯ |
| | | fixed: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // æ¯å¦å¼å¯åºé¨å®å
¨åºåéé
|
| | | safeAreaInsetBottom: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | // z-paging-swiperæ ·å¼ |
| | | swiperStyle: { |
| | | type: Object, |
| | | default: function() { |
| | | return {}; |
| | | }, |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.$nextTick(() => { |
| | | this.systemInfo = this._getSystemInfoSync(); |
| | | setTimeout(this.updateFixedLayout, 100) |
| | | }) |
| | | // #ifndef APP-PLUS |
| | | this._getCssSafeAreaInsetBottom(); |
| | | // #endif |
| | | this.updateLeftAndRightWidth(); |
| | | |
| | | this.swiperContentStyle = { 'flex': '1' }; |
| | | // #ifndef APP-NVUE |
| | | this.swiperContentStyle = { width: '100%',height: '100%' }; |
| | | // #endif |
| | | }, |
| | | computed: { |
| | | finalSwiperStyle() { |
| | | const swiperStyle = { ...this.swiperStyle }; |
| | | if (!this.systemInfo) return swiperStyle; |
| | | const windowTop = this.windowTop; |
| | | const windowBottom = this.systemInfo.windowBottom; |
| | | if (this.fixed) { |
| | | if (windowTop && !swiperStyle.top) { |
| | | swiperStyle.top = windowTop + 'px'; |
| | | } |
| | | if (!swiperStyle.bottom) { |
| | | let bottom = windowBottom || 0; |
| | | bottom += this.safeAreaInsetBottom ? this.safeAreaBottom : 0; |
| | | if (bottom > 0) { |
| | | swiperStyle.bottom = bottom + 'px'; |
| | | } |
| | | } |
| | | } |
| | | return swiperStyle; |
| | | } |
| | | }, |
| | | methods: { |
| | | // æ´æ°slot="left"åslot="right"宽度ï¼å½slot="left"æslot="right"å®½åº¦å¨ææ¹åæ¶è°ç¨ |
| | | updateLeftAndRightWidth() { |
| | | if (!this.isOldWebView) return; |
| | | this.$nextTick(() => this._updateLeftAndRightWidth(this.swiperContentStyle, 'zp-swiper')); |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .zp-swiper-container { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: column; |
| | | flex: 1; |
| | | } |
| | | |
| | | .zp-swiper-container-fixed { |
| | | position: fixed; |
| | | /* #ifndef APP-NVUE */ |
| | | height: auto; |
| | | width: auto; |
| | | /* #endif */ |
| | | top: 0; |
| | | left: 0; |
| | | bottom: 0; |
| | | right: 0; |
| | | } |
| | | |
| | | .zp-safe-area-inset-bottom { |
| | | position: absolute; |
| | | /* #ifndef APP-PLUS */ |
| | | height: env(safe-area-inset-bottom); |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-swiper-super { |
| | | flex: 1; |
| | | overflow: hidden; |
| | | position: relative; |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: row; |
| | | } |
| | | |
| | | .zp-swiper-left,.zp-swiper-right{ |
| | | /* #ifndef APP-NVUE */ |
| | | height: 100%; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-swiper { |
| | | flex: 1; |
| | | /* #ifndef APP-NVUE */ |
| | | height: 100%; |
| | | width: 100%; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-absoulte { |
| | | /* #ifndef APP-NVUE */ |
| | | position: absolute; |
| | | top: 0; |
| | | width: auto; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-swiper-item { |
| | | height: 100%; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- [z-paging]䏿å è½½æ´å¤view --> |
| | | <template> |
| | | <view class="zp-l-container" :class="{'zp-l-container-rpx':c.unit==='rpx','zp-l-container-px':c.unit==='px'}" :style="[c.customStyle]" @click="doClick"> |
| | | <template v-if="!c.hideContent"> |
| | | <!-- åºé¨å è½½æ´å¤æ²¡ææ´å¤æ°æ®åå²çº¿ --> |
| | | <text v-if="c.showNoMoreLine&&finalStatus===M.NoMore" :class="{'zp-l-line-rpx':c.unit==='rpx','zp-l-line-px':c.unit==='px'}" :style="[{backgroundColor:zTheme.line[ts]},c.noMoreLineCustomStyle]" /> |
| | | <!-- åºé¨å è½½æ´å¤loading --> |
| | | <!-- #ifndef APP-NVUE --> |
| | | <image v-if="finalStatus===M.Loading&&!!c.loadingIconCustomImage" |
| | | :src="c.loadingIconCustomImage" :style="[c.iconCustomStyle]" :class="{'zp-l-line-loading-custom-image':true,'zp-l-line-loading-custom-image-animated':c.loadingAnimated,'zp-l-line-loading-custom-image-rpx':c.unit==='rpx','zp-l-line-loading-custom-image-px':c.unit==='px'}" /> |
| | | <image v-if="finalStatus===M.Loading&&finalLoadingIconType==='flower'&&!c.loadingIconCustomImage.length" |
| | | :class="{'zp-line-loading-image':true,'zp-line-loading-image-rpx':c.unit==='rpx','zp-line-loading-image-px':c.unit==='px'}" :style="[c.iconCustomStyle]" :src="zTheme.flower[ts]" /> |
| | | <!-- #endif --> |
| | | <!-- #ifdef APP-NVUE --> |
| | | <!-- å¨nvueä¸åºé¨å è½½æ´å¤loading使ç¨ç³»ç»èªå¸¦ç --> |
| | | <view> |
| | | <loading-indicator v-if="finalStatus===M.Loading&&finalLoadingIconType!=='circle'" :class="{'zp-line-loading-image-rpx':c.unit==='rpx','zp-line-loading-image-px':c.unit==='px'}" :style="[{color:zTheme.indicator[ts]}]" :animating="true" /> |
| | | </view> |
| | | <!-- #endif --> |
| | | <!-- åºé¨å è½½æ´å¤æå --> |
| | | <text v-if="finalStatus===M.Loading&&finalLoadingIconType==='circle'&&!c.loadingIconCustomImage.length" |
| | | class="zp-l-circle-loading-view" :class="{'zp-l-circle-loading-view-rpx':c.unit==='rpx','zp-l-circle-loading-view-px':c.unit==='px'}" :style="[{borderColor:zTheme.circleBorder[ts],borderTopColor:zTheme.circleBorderTop[ts]},c.iconCustomStyle]" /> |
| | | <text v-if="!c.isChat||(!c.chatDefaultAsLoading&&finalStatus===M.Default)||finalStatus===M.Fail" :class="{'zp-l-text-rpx':c.unit==='rpx','zp-l-text-px':c.unit==='px'}" :style="[{color:zTheme.title[ts]},c.titleCustomStyle]">{{ownLoadingMoreText}}</text> |
| | | <!-- åºé¨å è½½æ´å¤æ²¡ææ´å¤æ°æ®åå²çº¿ --> |
| | | <text v-if="c.showNoMoreLine&&finalStatus===M.NoMore" :class="{'zp-l-line-rpx':c.unit==='rpx','zp-l-line-px':c.unit==='px'}" :style="[{backgroundColor:zTheme.line[ts]},c.noMoreLineCustomStyle]" /> |
| | | </template> |
| | | </view> |
| | | </template> |
| | | <script> |
| | | import zStatic from '../js/z-paging-static' |
| | | import Enum from '../js/z-paging-enum' |
| | | export default { |
| | | name: 'z-paging-load-more', |
| | | data() { |
| | | return { |
| | | M: Enum.More, |
| | | zTheme: { |
| | | title: { white: '#efefef', black: '#a4a4a4' }, |
| | | line: { white: '#efefef', black: '#eeeeee' }, |
| | | circleBorder: { white: '#aaaaaa', black: '#c8c8c8' }, |
| | | circleBorderTop: { white: '#ffffff', black: '#444444' }, |
| | | flower: { white: zStatic.base64FlowerWhite, black: zStatic.base64Flower }, |
| | | indicator: { white: '#eeeeee', black: '#777777' } |
| | | } |
| | | }; |
| | | }, |
| | | props: ['zConfig'], |
| | | computed: { |
| | | ts() { |
| | | return this.c.defaultThemeStyle; |
| | | }, |
| | | // åºé¨å è½½æ´å¤é
ç½® |
| | | c() { |
| | | return this.zConfig || {}; |
| | | }, |
| | | // åºé¨å è½½æ´å¤æå |
| | | ownLoadingMoreText() { |
| | | return { |
| | | [this.M.Default]: this.c.defaultText, |
| | | [this.M.Loading]: this.c.loadingText, |
| | | [this.M.NoMore]: this.c.noMoreText, |
| | | [this.M.Fail]: this.c.failText, |
| | | }[this.finalStatus]; |
| | | }, |
| | | // åºé¨å è½½æ´å¤ç¶æ |
| | | finalStatus() { |
| | | if (this.c.defaultAsLoading && this.c.status === this.M.Default) return this.M.Loading; |
| | | return this.c.status; |
| | | }, |
| | | // å è½½æ´å¤iconç±»å |
| | | finalLoadingIconType() { |
| | | // #ifdef APP-NVUE |
| | | return 'flower'; |
| | | // #endif |
| | | return this.c.loadingIconType; |
| | | } |
| | | }, |
| | | methods: { |
| | | // ç¹å»äºå è½½æ´å¤ |
| | | doClick() { |
| | | this.$emit('doClick'); |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | @import "../css/z-paging-static.css"; |
| | | |
| | | .zp-l-container { |
| | | /* #ifndef APP-NVUE */ |
| | | clear: both; |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: row; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | .zp-l-container-rpx { |
| | | height: 80rpx; |
| | | font-size: 27rpx; |
| | | } |
| | | .zp-l-container-px { |
| | | height: 40px; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .zp-l-line-loading-custom-image { |
| | | color: #a4a4a4; |
| | | } |
| | | .zp-l-line-loading-custom-image-rpx { |
| | | margin-right: 8rpx; |
| | | width: 28rpx; |
| | | height: 28rpx; |
| | | } |
| | | .zp-l-line-loading-custom-image-px { |
| | | margin-right: 4px; |
| | | width: 14px; |
| | | height: 14px; |
| | | } |
| | | |
| | | .zp-l-line-loading-custom-image-animated{ |
| | | /* #ifndef APP-NVUE */ |
| | | animation: loading-circle 1s linear infinite; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-l-circle-loading-view { |
| | | border: 3rpx solid #dddddd; |
| | | border-radius: 50%; |
| | | /* #ifndef APP-NVUE */ |
| | | animation: loading-circle 1s linear infinite; |
| | | /* #endif */ |
| | | /* #ifdef APP-NVUE */ |
| | | width: 30rpx; |
| | | height: 30rpx; |
| | | /* #endif */ |
| | | } |
| | | .zp-l-circle-loading-view-rpx { |
| | | margin-right: 8rpx; |
| | | width: 23rpx; |
| | | height: 23rpx; |
| | | } |
| | | .zp-l-circle-loading-view-px { |
| | | margin-right: 4px; |
| | | width: 12px; |
| | | height: 12px; |
| | | } |
| | | |
| | | .zp-l-text-rpx { |
| | | font-size: 30rpx; |
| | | margin: 0rpx 6rpx; |
| | | } |
| | | .zp-l-text-px { |
| | | font-size: 15px; |
| | | margin: 0px 3px; |
| | | } |
| | | |
| | | .zp-l-line-rpx { |
| | | height: 1px; |
| | | width: 100rpx; |
| | | margin: 0rpx 10rpx; |
| | | } |
| | | .zp-l-line-px { |
| | | height: 1px; |
| | | width: 50px; |
| | | margin: 0rpx 5px; |
| | | } |
| | | |
| | | /* #ifndef APP-NVUE */ |
| | | @keyframes loading-circle { |
| | | 0% { |
| | | -webkit-transform: rotate(0deg); |
| | | transform: rotate(0deg); |
| | | } |
| | | 100% { |
| | | -webkit-transform: rotate(360deg); |
| | | transform: rotate(360deg); |
| | | } |
| | | } |
| | | /* #endif */ |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- [z-paging]䏿巿°view --> |
| | | <template> |
| | | <view style="height: 100%;"> |
| | | <view :class="showUpdateTime?'zp-r-container zp-r-container-padding':'zp-r-container'"> |
| | | <view class="zp-r-left"> |
| | | <!-- éå è½½ä¸(ç»§ç»ä¸æå·æ°ãæ¾æç«å³å·æ°ç¶æå¾ç) --> |
| | | <image v-if="status!==R.Loading" :class="leftImageClass" :style="[leftImageStyle,imgStyle]" :src="leftImageSrc" /> |
| | | <!-- å è½½ç¶æå¾ç --> |
| | | <!-- #ifndef APP-NVUE --> |
| | | <image v-else :class="{'zp-line-loading-image':refreshingAnimated,'zp-r-left-image':true,'zp-r-left-image-pre-size-rpx':unit==='rpx','zp-r-left-image-pre-size-px':unit==='px'}" :style="[leftImageStyle,imgStyle]" :src="leftImageSrc" /> |
| | | <!-- #endif --> |
| | | <!-- å¨nvueä¸ï¼å è½½ç¶æloading使ç¨ç³»ç»loading --> |
| | | <!-- #ifdef APP-NVUE --> |
| | | <view v-else :style="[{'margin-right':showUpdateTime?addUnit(18,unit):addUnit(12, unit)}]"> |
| | | <loading-indicator :class="isIos?{'zp-loading-image-ios-rpx':unit==='rpx','zp-loading-image-ios-px':unit==='px'}:{'zp-loading-image-android-rpx':unit==='rpx','zp-loading-image-android-px':unit==='px'}" |
| | | :style="[{color:zTheme.indicator[ts]},imgStyle]" :animating="true" /> |
| | | </view> |
| | | <!-- #endif --> |
| | | </view> |
| | | <!-- å³ä¾§æåå
容 --> |
| | | <view class="zp-r-right"> |
| | | <!-- å³ä¾§ä¸æå·æ°ç¶ææå --> |
| | | <text class="zp-r-right-text" :style="[rightTextStyle,titleStyle]">{{currentTitle}}</text> |
| | | <!-- å³ä¾§ä¸æå·æ°æ¶é´æå --> |
| | | <text v-if="showUpdateTime&&refresherTimeText.length" class="zp-r-right-text" :class="{'zp-r-right-time-text-rpx':unit==='rpx','zp-r-right-time-text-px':unit==='px'}" :style="[{color:zTheme.title[ts]},updateTimeStyle]"> |
| | | {{refresherTimeText}} |
| | | </text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | <script> |
| | | import zStatic from '../js/z-paging-static' |
| | | import u from '../js/z-paging-utils' |
| | | import Enum from '../js/z-paging-enum' |
| | | |
| | | export default { |
| | | name: 'z-paging-refresh', |
| | | data() { |
| | | return { |
| | | R: Enum.Refresher, |
| | | refresherTimeText: '', |
| | | zTheme: { |
| | | title: { white: '#efefef', black: '#555555' }, |
| | | arrow: { white: zStatic.base64ArrowWhite, black: zStatic.base64Arrow }, |
| | | flower: { white: zStatic.base64FlowerWhite, black: zStatic.base64Flower }, |
| | | success: { white: zStatic.base64SuccessWhite, black: zStatic.base64Success }, |
| | | indicator: { white: '#eeeeee', black: '#777777' } |
| | | } |
| | | }; |
| | | }, |
| | | props: ['status', 'defaultThemeStyle', 'defaultText', 'pullingText', 'refreshingText', 'completeText', 'goF2Text', 'defaultImg', 'pullingImg', |
| | | 'refreshingImg', 'completeImg', 'refreshingAnimated', 'showUpdateTime', 'updateTimeKey', 'imgStyle', 'titleStyle', 'updateTimeStyle', 'updateTimeTextMap', 'unit', 'isIos' |
| | | ], |
| | | computed: { |
| | | ts() { |
| | | return this.defaultThemeStyle; |
| | | }, |
| | | // å½åç¶æMap |
| | | statusTextMap() { |
| | | this.updateTime(); |
| | | const { R, defaultText, pullingText, refreshingText, completeText, goF2Text } = this; |
| | | return { |
| | | [R.Default]: defaultText, |
| | | [R.ReleaseToRefresh]: pullingText, |
| | | [R.Loading]: refreshingText, |
| | | [R.Complete]: completeText, |
| | | [R.GoF2]: goF2Text, |
| | | }; |
| | | }, |
| | | // å½åç¶ææå |
| | | currentTitle() { |
| | | return this.statusTextMap[this.status] || this.defaultText; |
| | | }, |
| | | // 左侧å¾çclass |
| | | leftImageClass() { |
| | | const preSizeClass = `zp-r-left-image-pre-size-${this.unit}`; |
| | | if (this.status === this.R.Complete) return preSizeClass; |
| | | return `zp-r-left-image ${preSizeClass} ${this.status === this.R.Default ? 'zp-r-arrow-down' : 'zp-r-arrow-top'}`; |
| | | }, |
| | | // 左侧å¾çstyle |
| | | leftImageStyle() { |
| | | const showUpdateTime = this.showUpdateTime; |
| | | const size = showUpdateTime ? u.addUnit(36, this.unit) : u.addUnit(34, this.unit); |
| | | return {width: size,height: size,'margin-right': showUpdateTime ? u.addUnit(20, this.unit) : u.addUnit(9, this.unit)}; |
| | | }, |
| | | // 左侧å¾çsrc |
| | | leftImageSrc() { |
| | | const R = this.R; |
| | | const status = this.status; |
| | | if (status === R.Default) { |
| | | if (!!this.defaultImg) return this.defaultImg; |
| | | return this.zTheme.arrow[this.ts]; |
| | | } else if (status === R.ReleaseToRefresh) { |
| | | if (!!this.pullingImg) return this.pullingImg; |
| | | if (!!this.defaultImg) return this.defaultImg; |
| | | return this.zTheme.arrow[this.ts]; |
| | | } else if (status === R.Loading) { |
| | | if (!!this.refreshingImg) return this.refreshingImg; |
| | | return this.zTheme.flower[this.ts];; |
| | | } else if (status === R.Complete) { |
| | | if (!!this.completeImg) return this.completeImg; |
| | | return this.zTheme.success[this.ts];; |
| | | } else if (status === R.GoF2) { |
| | | return this.zTheme.arrow[this.ts]; |
| | | } |
| | | return ''; |
| | | }, |
| | | // å³ä¾§æåstyle |
| | | rightTextStyle() { |
| | | let stl = {}; |
| | | // #ifdef APP-NVUE |
| | | const textHeight = this.showUpdateTime ? u.addUnit(40, this.unit) : u.addUnit(80, this.unit); |
| | | stl = {'height': textHeight, 'line-height': textHeight} |
| | | // #endif |
| | | stl['color'] = this.zTheme.title[this.ts]; |
| | | stl['font-size'] = u.addUnit(30, this.unit); |
| | | return stl; |
| | | } |
| | | }, |
| | | methods: { |
| | | // æ·»å åä½ |
| | | addUnit(value, unit) { |
| | | return u.addUnit(value, unit); |
| | | }, |
| | | // æ´æ°ä¸æå·æ°æ¶é´ |
| | | updateTime() { |
| | | if (this.showUpdateTime) { |
| | | this.refresherTimeText = u.getRefesrherFormatTimeByKey(this.updateTimeKey, this.updateTimeTextMap); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | @import "../css/z-paging-static.css"; |
| | | |
| | | .zp-r-container { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | height: 100%; |
| | | /* #endif */ |
| | | flex-direction: row; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | |
| | | .zp-r-container-padding { |
| | | /* #ifdef APP-NVUE */ |
| | | padding: 7px 0rpx; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-r-left { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: row; |
| | | align-items: center; |
| | | overflow: hidden; |
| | | /* #ifdef MP-ALIPAY */ |
| | | margin-top: -4rpx; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-r-left-image { |
| | | transition-duration: .2s; |
| | | transition-property: transform; |
| | | color: #666666; |
| | | } |
| | | |
| | | .zp-r-left-image-pre-size-rpx { |
| | | /* #ifndef APP-NVUE */ |
| | | width: 34rpx; |
| | | height: 34rpx; |
| | | overflow: hidden; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-r-left-image-pre-size-px { |
| | | /* #ifndef APP-NVUE */ |
| | | width: 17px; |
| | | height: 17px; |
| | | overflow: hidden; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-r-arrow-top { |
| | | transform: rotate(0deg); |
| | | } |
| | | |
| | | .zp-r-arrow-down { |
| | | transform: rotate(180deg); |
| | | } |
| | | |
| | | .zp-r-right { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .zp-r-right-time-text-rpx { |
| | | margin-top: 10rpx; |
| | | font-size: 26rpx; |
| | | } |
| | | .zp-r-right-time-text-px { |
| | | margin-top: 5px; |
| | | font-size: 13px; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // z-pagingå
¨å±é
ç½®æä»¶ï¼æ³¨æé¿å
æ´æ°æ¶æ¤æä»¶è¢«è¦çï¼è¥è¢«è¦çï¼å¯å¨æ¤æä»¶ä¸å³é®->ç¹å»æ¬å°åå²è®°å½ï¼æ¾åè¦çåçé
ç½® |
| | | |
| | | export default {} |
¶Ô±ÈÐÂÎļþ |
| | |
| | | /* [z-paging]å
Œ
±css*/ |
| | | |
| | | .z-paging-content { |
| | | position: relative; |
| | | flex-direction: column; |
| | | /* #ifndef APP-NVUE */ |
| | | overflow: hidden; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .z-paging-content-full { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | width: 100%; |
| | | height: 100%; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .z-paging-content-fixed, .zp-loading-fixed { |
| | | position: fixed; |
| | | /* #ifndef APP-NVUE */ |
| | | height: auto; |
| | | width: auto; |
| | | /* #endif */ |
| | | top: 0; |
| | | left: 0; |
| | | bottom: 0; |
| | | right: 0; |
| | | } |
| | | |
| | | .zp-f2-content { |
| | | width: 100%; |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | background-color: white; |
| | | } |
| | | |
| | | .zp-page-top, .zp-page-bottom { |
| | | /* #ifndef APP-NVUE */ |
| | | width: auto; |
| | | /* #endif */ |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | z-index: 999; |
| | | } |
| | | |
| | | .zp-page-left, .zp-page-right { |
| | | /* #ifndef APP-NVUE */ |
| | | height: 100%; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-scroll-view-super { |
| | | flex: 1; |
| | | overflow: hidden; |
| | | position: relative; |
| | | } |
| | | |
| | | .zp-view-super { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: row; |
| | | } |
| | | |
| | | .zp-scroll-view-container, .zp-scroll-view { |
| | | position: relative; |
| | | /* #ifndef APP-NVUE */ |
| | | height: 100%; |
| | | width: 100%; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-absoulte { |
| | | /* #ifndef APP-NVUE */ |
| | | position: absolute; |
| | | top: 0; |
| | | width: auto; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-scroll-view-absolute { |
| | | position: absolute; |
| | | top: 0; |
| | | left: 0; |
| | | } |
| | | |
| | | /* #ifndef APP-NVUE */ |
| | | .zp-scroll-view-hide-scrollbar ::-webkit-scrollbar { |
| | | display: none; |
| | | -webkit-appearance: none; |
| | | width: 0 !important; |
| | | height: 0 !important; |
| | | background: transparent; |
| | | } |
| | | /* #endif */ |
| | | |
| | | .zp-paging-touch-view { |
| | | width: 100%; |
| | | height: 100%; |
| | | position: relative; |
| | | } |
| | | |
| | | .zp-fixed-bac-view { |
| | | position: absolute; |
| | | width: 100%; |
| | | top: 0; |
| | | left: 0; |
| | | height: 200px; |
| | | } |
| | | |
| | | .zp-paging-main { |
| | | height: 100%; |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .zp-paging-container { |
| | | flex: 1; |
| | | position: relative; |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .zp-chat-record-loading-custom-image { |
| | | width: 35rpx; |
| | | height: 35rpx; |
| | | /* #ifndef APP-NVUE */ |
| | | animation: loading-flower 1s linear infinite; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-page-bottom-keyboard-placeholder-animate { |
| | | transition-property: height; |
| | | transition-duration: 0.15s; |
| | | /* #ifndef APP-NVUE */ |
| | | will-change: height; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-custom-refresher-container { |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .zp-custom-refresher-refresh { |
| | | /* #ifndef APP-NVUE */ |
| | | display: block; |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-back-to-top { |
| | | z-index: 999; |
| | | position: absolute; |
| | | bottom: 0rpx; |
| | | transition-duration: .3s; |
| | | transition-property: opacity; |
| | | } |
| | | .zp-back-to-top-rpx { |
| | | width: 76rpx; |
| | | height: 76rpx; |
| | | bottom: 0rpx; |
| | | right: 25rpx; |
| | | } |
| | | .zp-back-to-top-px { |
| | | width: 38px; |
| | | height: 38px; |
| | | bottom: 0px; |
| | | right: 13px; |
| | | } |
| | | |
| | | .zp-back-to-top-show { |
| | | opacity: 1; |
| | | } |
| | | |
| | | .zp-back-to-top-hide { |
| | | opacity: 0; |
| | | } |
| | | |
| | | .zp-back-to-top-img { |
| | | /* #ifndef APP-NVUE */ |
| | | width: 100%; |
| | | height: 100%; |
| | | /* #endif */ |
| | | /* #ifdef APP-NVUE */ |
| | | flex: 1; |
| | | /* #endif */ |
| | | z-index: 999; |
| | | } |
| | | |
| | | .zp-back-to-top-img-inversion { |
| | | transform: rotate(180deg); |
| | | } |
| | | |
| | | .zp-empty-view { |
| | | /* #ifdef APP-NVUE */ |
| | | height: 100%; |
| | | /* #endif */ |
| | | flex: 1; |
| | | } |
| | | |
| | | .zp-empty-view-center { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .zp-loading-fixed { |
| | | z-index: 9999; |
| | | } |
| | | |
| | | .zp-safe-area-inset-bottom { |
| | | position: absolute; |
| | | /* #ifndef APP-PLUS */ |
| | | height: env(safe-area-inset-bottom); |
| | | /* #endif */ |
| | | } |
| | | |
| | | .zp-n-refresh-container { |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | justify-content: center; |
| | | width: 750rpx; |
| | | } |
| | | |
| | | .zp-n-list-container{ |
| | | /* #ifndef APP-NVUE */ |
| | | display: flex; |
| | | /* #endif */ |
| | | flex-direction: row; |
| | | flex: 1; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | /* [z-paging]å
¬ç¨çéæcssèµæº */ |
| | | |
| | | .zp-line-loading-image { |
| | | /* #ifndef APP-NVUE */ |
| | | animation: loading-flower 1s steps(12) infinite; |
| | | /* #endif */ |
| | | color: #666666; |
| | | } |
| | | .zp-line-loading-image-rpx { |
| | | margin-right: 8rpx; |
| | | width: 34rpx; |
| | | height: 34rpx; |
| | | } |
| | | .zp-line-loading-image-px { |
| | | margin-right: 4px; |
| | | width: 17px; |
| | | height: 17px; |
| | | } |
| | | |
| | | .zp-loading-image-ios-rpx { |
| | | width: 40rpx; |
| | | height: 40rpx; |
| | | } |
| | | .zp-loading-image-ios-px { |
| | | width: 20px; |
| | | height: 20px; |
| | | } |
| | | |
| | | .zp-loading-image-android-rpx { |
| | | width: 34rpx; |
| | | height: 34rpx; |
| | | } |
| | | .zp-loading-image-android-px { |
| | | width: 17px; |
| | | height: 17px; |
| | | } |
| | | |
| | | /* #ifndef APP-NVUE */ |
| | | @keyframes loading-flower { |
| | | 0% { |
| | | -webkit-transform: rotate(0deg); |
| | | transform: rotate(0deg); |
| | | } |
| | | to { |
| | | -webkit-transform: rotate(1turn); |
| | | transform: rotate(1turn); |
| | | } |
| | | } |
| | | /* #endif */ |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "zp.refresher.default": "Pull down to refresh", |
| | | "zp.refresher.pulling": "Release to refresh", |
| | | "zp.refresher.refreshing": "Refreshing...", |
| | | "zp.refresher.complete": "Refresh succeeded", |
| | | "zp.refresher.f2": "Refresh to enter 2f", |
| | | |
| | | "zp.loadingMore.default": "Click to load more", |
| | | "zp.loadingMore.loading": "Loading...", |
| | | "zp.loadingMore.noMore": "No more data", |
| | | "zp.loadingMore.fail": "Load failed,click to reload", |
| | | |
| | | "zp.emptyView.title": "No data", |
| | | "zp.emptyView.reload": "Reload", |
| | | "zp.emptyView.error": "Sorry,load failed", |
| | | |
| | | "zp.refresherUpdateTime.title": "Last update: ", |
| | | "zp.refresherUpdateTime.none": "None", |
| | | "zp.refresherUpdateTime.today": "Today", |
| | | "zp.refresherUpdateTime.yesterday": "Yesterday", |
| | | |
| | | "zp.systemLoading.title": "Loading..." |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import en from './en.json' |
| | | import zhHans from './zh-Hans.json' |
| | | import zhHant from './zh-Hant.json' |
| | | export default { |
| | | en, |
| | | 'zh-Hans': zhHans, |
| | | 'zh-Hant': zhHant |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "zp.refresher.default": "ç»§ç»ä¸æå·æ°", |
| | | "zp.refresher.pulling": "æ¾å¼ç«å³å·æ°", |
| | | "zp.refresher.refreshing": "æ£å¨å·æ°...", |
| | | "zp.refresher.complete": "å·æ°æå", |
| | | "zp.refresher.f2": "æ¾æè¿å
¥äºæ¥¼", |
| | | |
| | | "zp.loadingMore.default": "ç¹å»å è½½æ´å¤", |
| | | "zp.loadingMore.loading": "æ£å¨å è½½...", |
| | | "zp.loadingMore.noMore": "æ²¡ææ´å¤äº", |
| | | "zp.loadingMore.fail": "å 载失败ï¼ç¹å»éæ°å è½½", |
| | | |
| | | "zp.emptyView.title": "æ²¡ææ°æ®å¦~", |
| | | "zp.emptyView.reload": "éæ°å è½½", |
| | | "zp.emptyView.error": "徿±æï¼å 载失败", |
| | | |
| | | "zp.refresherUpdateTime.title": "æåæ´æ°ï¼", |
| | | "zp.refresherUpdateTime.none": "æ ", |
| | | "zp.refresherUpdateTime.today": "ä»å¤©", |
| | | "zp.refresherUpdateTime.yesterday": "æ¨å¤©", |
| | | |
| | | "zp.systemLoading.title": "å è½½ä¸..." |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | { |
| | | "zp.refresher.default": "ç¹¼çºä¸æé繪", |
| | | "zp.refresher.pulling": "é¬éç«å³é繪", |
| | | "zp.refresher.refreshing": "æ£å¨é繪...", |
| | | "zp.refresher.complete": "é繪æå", |
| | | "zp.refresher.f2": "鬿é²å
¥äºæ¨", |
| | | |
| | | "zp.loadingMore.default": "黿å è¼æ´å¤", |
| | | "zp.loadingMore.loading": "æ£å¨å è¼...", |
| | | "zp.loadingMore.noMore": "æ²ææ´å¤äº", |
| | | "zp.loadingMore.fail": "å è¼å¤±æï¼é»æéæ°å è¼", |
| | | |
| | | "zp.emptyView.title": "æ²ææ¸æå¦~", |
| | | "zp.emptyView.reload": "éæ°å è¼", |
| | | "zp.emptyView.error": "徿±æï¼å è¼å¤±æ", |
| | | |
| | | "zp.refresherUpdateTime.title": "æå¾æ´æ°ï¼", |
| | | "zp.refresherUpdateTime.none": "ç¡", |
| | | "zp.refresherUpdateTime.today": "ä»å¤©", |
| | | "zp.refresherUpdateTime.yesterday": "æ¨å¤©", |
| | | |
| | | "zp.systemLoading.title": "å è¼ä¸..." |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]useZPaging hooks |
| | | |
| | | import { onPageScroll, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app'; |
| | | |
| | | function useZPaging(paging) { |
| | | const cPaging = !!paging ? paging.value || paging : null; |
| | | |
| | | onPullDownRefresh(() => { |
| | | if (!cPaging || !cPaging.value) return; |
| | | cPaging.value.reload().catch(() => {}); |
| | | }) |
| | | |
| | | onPageScroll(e => { |
| | | if (!cPaging || !cPaging.value) return; |
| | | cPaging.value.updatePageScrollTop(e.scrollTop); |
| | | e.scrollTop < 10 && cPaging.value.doChatRecordLoadMore(); |
| | | }) |
| | | |
| | | onReachBottom(() => { |
| | | if (!cPaging || !cPaging.value) return; |
| | | cPaging.value.pageReachBottom(); |
| | | }) |
| | | } |
| | | |
| | | export default useZPaging |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]useZPagingComp hooks |
| | | |
| | | function useZPagingComp(paging) { |
| | | const cPaging = !!paging ? paging.value || paging : null; |
| | | |
| | | const reload = () => { |
| | | if (!cPaging || !cPaging.value) return; |
| | | cPaging.value.reload().catch(() => {}); |
| | | } |
| | | const updatePageScrollTop = scrollTop => { |
| | | if (!cPaging || !cPaging.value) return; |
| | | cPaging.value.updatePageScrollTop(scrollTop); |
| | | } |
| | | const doChatRecordLoadMore = () => { |
| | | if (!cPaging || !cPaging.value) return; |
| | | cPaging.value.doChatRecordLoadMore(); |
| | | } |
| | | const pageReachBottom = () => { |
| | | if (!cPaging || !cPaging.value) return; |
| | | cPaging.value.pageReachBottom(); |
| | | } |
| | | return { reload, updatePageScrollTop, doChatRecordLoadMore, pageReachBottom }; |
| | | } |
| | | |
| | | export default useZPagingComp |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]ç¹å»è¿åé¡¶é¨view模å |
| | | import u from '.././z-paging-utils' |
| | | |
| | | export default { |
| | | props: { |
| | | // èªå¨æ¾ç¤ºç¹å»è¿å顶鍿é®ï¼é»è®¤ä¸ºå¦ |
| | | autoShowBackToTop: { |
| | | type: Boolean, |
| | | default: u.gc('autoShowBackToTop', false) |
| | | }, |
| | | // ç¹å»è¿å顶鍿鮿¾ç¤º/éèçéå¼(æ»å¨è·ç¦»)ï¼åä½ä¸ºpxï¼é»è®¤ä¸º400rpx |
| | | backToTopThreshold: { |
| | | type: [Number, String], |
| | | default: u.gc('backToTopThreshold', '400rpx') |
| | | }, |
| | | // ç¹å»è¿å顶鍿é®çèªå®ä¹å¾çå°åï¼é»è®¤ä½¿ç¨z-pagingå
ç½®çå¾ç |
| | | backToTopImg: { |
| | | type: String, |
| | | default: u.gc('backToTopImg', '') |
| | | }, |
| | | // ç¹å»è¿å顶鍿é®è¿åå°é¡¶é¨æ¶æ¯å¦å±ç¤ºè¿æ¸¡å¨ç»ï¼é»è®¤ä¸ºæ¯ |
| | | backToTopWithAnimate: { |
| | | type: Boolean, |
| | | default: u.gc('backToTopWithAnimate', true) |
| | | }, |
| | | // ç¹å»è¿å顶鍿é®ä¸åºé¨çè·ç¦»ï¼æ³¨ææ·»å åä½pxærpxï¼é»è®¤ä¸º160rpx |
| | | backToTopBottom: { |
| | | type: [Number, String], |
| | | default: u.gc('backToTopBottom', '160rpx') |
| | | }, |
| | | // ç¹å»è¿å顶鍿é®çèªå®ä¹æ ·å¼ |
| | | backToTopStyle: { |
| | | type: Object, |
| | | default: u.gc('backToTopStyle', {}), |
| | | }, |
| | | // iOSç¹å»é¡¶é¨ç¶ææ ãå®åå廿 颿 æ¶ï¼æ»å¨æ¡è¿åé¡¶é¨ï¼åªæ¯æç«åï¼é»è®¤ä¸ºæ¯ |
| | | enableBackToTop: { |
| | | type: Boolean, |
| | | default: u.gc('enableBackToTop', true) |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | // ç¹å»è¿åé¡¶é¨çclass |
| | | backToTopClass: 'zp-back-to-top zp-back-to-top-hide', |
| | | // 䏿¬¡ç¹å»è¿åé¡¶é¨çæ¶é´ |
| | | lastBackToTopShowTime: 0, |
| | | // ç¹å»è¿å顶鍿¾ç¤ºçclassæ¯å¦å¨å±ç¤ºä¸ï¼ä½¿å¾æé®å±ç¤º/éèè¿åº¦æææ´èªç¶ |
| | | showBackToTopClass: false, |
| | | } |
| | | }, |
| | | computed: { |
| | | backToTopThresholdUnitConverted() { |
| | | return u.addUnit(this.backToTopThreshold, this.unit); |
| | | }, |
| | | backToTopBottomUnitConverted() { |
| | | return u.addUnit(this.backToTopBottom, this.unit); |
| | | }, |
| | | finalEnableBackToTop() { |
| | | return this.usePageScroll ? false : this.enableBackToTop; |
| | | }, |
| | | finalBackToTopThreshold() { |
| | | return u.convertToPx(this.backToTopThresholdUnitConverted); |
| | | }, |
| | | finalBackToTopStyle() { |
| | | const backToTopStyle = this.backToTopStyle; |
| | | if (!backToTopStyle.bottom) { |
| | | backToTopStyle.bottom = this.windowBottom + u.convertToPx(this.backToTopBottomUnitConverted) + 'px'; |
| | | } |
| | | if(!backToTopStyle.position){ |
| | | backToTopStyle.position = this.usePageScroll ? 'fixed': 'absolute'; |
| | | } |
| | | return backToTopStyle; |
| | | }, |
| | | finalBackToTopClass() { |
| | | return `${this.backToTopClass} zp-back-to-top-${this.unit}`; |
| | | } |
| | | }, |
| | | methods: { |
| | | // ç¹å»äºè¿åé¡¶é¨ |
| | | _backToTopClick() { |
| | | let callbacked = false; |
| | | this.$emit('backToTopClick', toTop => { |
| | | (toTop === undefined || toTop === true) && this._handleToTop(); |
| | | callbacked = true; |
| | | }); |
| | | // å¦æç¨æ·æ²¡æç¦æ¢é»è®¤çè¿åé¡¶é¨äºä»¶ï¼åè§¦åæ»å¨å°é¡¶é¨ |
| | | this.$nextTick(() => { |
| | | !callbacked && this._handleToTop(); |
| | | }) |
| | | }, |
| | | // å¤çæ»å¨å°é¡¶é¨ï¼èå¤©è®°å½æ¨¡å¼ä¸ä¸ºæ»å¨å°åºé¨ï¼ |
| | | _handleToTop() { |
| | | !this.backToTopWithAnimate && this._checkShouldShowBackToTop(0); |
| | | !this.useChatRecordMode ? this.scrollToTop(this.backToTopWithAnimate) : this.scrollToBottom(this.backToTopWithAnimate); |
| | | }, |
| | | // 夿æ¯å¦è¦æ¾ç¤ºè¿åé¡¶é¨æé® |
| | | _checkShouldShowBackToTop(scrollTop) { |
| | | if (!this.autoShowBackToTop) { |
| | | this.showBackToTopClass = false; |
| | | return; |
| | | } |
| | | if (scrollTop > this.finalBackToTopThreshold) { |
| | | if (!this.showBackToTopClass) { |
| | | // è®°å½å½åç¹å»è¿å顶鍿鮿¾ç¤ºçclassçæäº |
| | | this.showBackToTopClass = true; |
| | | this.lastBackToTopShowTime = new Date().getTime(); |
| | | // 彿»å¨å°éè¦å±ç¤ºè¿åé¡¶é¨çéå¼å
ï¼åå»¶è¿300毫ç§å±ç¤ºè¿åå°é¡¶é¨æé® |
| | | u.delay(() => { |
| | | this.backToTopClass = 'zp-back-to-top zp-back-to-top-show'; |
| | | }, 300) |
| | | } |
| | | } else { |
| | | // 妿å½åç¹å»è¿å顶鍿鮿¾ç¤ºçclassæ¯çæç¶æå¹¶ä¸æ»å¨å°äºè§¦åéå¼ï¼åéèè¿åé¡¶é¨æé® |
| | | if (this.showBackToTopClass) { |
| | | this.backToTopClass = 'zp-back-to-top zp-back-to-top-hide'; |
| | | u.delay(() => { |
| | | this.showBackToTopClass = false; |
| | | }, new Date().getTime() - this.lastBackToTopShowTime < 500 ? 0 : 300) |
| | | } |
| | | } |
| | | }, |
| | | } |
| | | } |
| | | |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]èå¤©è®°å½æ¨¡å¼æ¨¡å |
| | | import u from '.././z-paging-utils' |
| | | |
| | | export default { |
| | | props: { |
| | | // 使ç¨èå¤©è®°å½æ¨¡å¼ï¼é»è®¤ä¸ºå¦ |
| | | useChatRecordMode: { |
| | | type: Boolean, |
| | | default: u.gc('useChatRecordMode', false) |
| | | }, |
| | | // 使ç¨èå¤©è®°å½æ¨¡å¼æ¶æ»å¨å°é¡¶é¨åï¼å表åç´ç§»å¨åç§»è·ç¦»ãé»è®¤0rpxãåä½pxï¼ææ¶æ æï¼ |
| | | chatRecordMoreOffset: { |
| | | type: [Number, String], |
| | | default: u.gc('chatRecordMoreOffset', '0rpx') |
| | | }, |
| | | // 使ç¨èå¤©è®°å½æ¨¡å¼æ¶æ¯å¦èªå¨éèé®çï¼å¨ç¨æ·è§¦æ¸å表æ¶åèªå¨éèé®çï¼é»è®¤ä¸ºæ¯ |
| | | autoHideKeyboardWhenChat: { |
| | | type: Boolean, |
| | | default: u.gc('autoHideKeyboardWhenChat', true) |
| | | }, |
| | | // 使ç¨èå¤©è®°å½æ¨¡å¼ä¸é®çå¼¹åºæ¶æ¯å¦èªå¨è°æ´slot="bottom"é«åº¦ï¼é»è®¤ä¸ºæ¯ |
| | | autoAdjustPositionWhenChat: { |
| | | type: Boolean, |
| | | default: u.gc('autoAdjustPositionWhenChat', true) |
| | | }, |
| | | // 使ç¨èå¤©è®°å½æ¨¡å¼ä¸é®çå¼¹åºæ¶å ä½é«åº¦åç§»è·ç¦»ãé»è®¤0rpxãåä½px |
| | | chatAdjustPositionOffset: { |
| | | type: [Number, String], |
| | | default: u.gc('chatAdjustPositionOffset', '0rpx') |
| | | }, |
| | | // 使ç¨èå¤©è®°å½æ¨¡å¼ä¸é®çå¼¹åºæ¶æ¯å¦èªå¨æ»å¨å°åºé¨ï¼é»è®¤ä¸ºå¦ |
| | | autoToBottomWhenChat: { |
| | | type: Boolean, |
| | | default: u.gc('autoToBottomWhenChat', false) |
| | | }, |
| | | // 使ç¨èå¤©è®°å½æ¨¡å¼ä¸reloadæ¶æ¯å¦æ¾ç¤ºchatLoadingï¼é»è®¤ä¸ºå¦ |
| | | showChatLoadingWhenReload: { |
| | | type: Boolean, |
| | | default: u.gc('showChatLoadingWhenReload', false) |
| | | }, |
| | | // å¨èå¤©è®°å½æ¨¡å¼ä¸æ»å¨å°é¡¶é¨ç¶æä¸ºé»è®¤ç¶ææ¶ï¼ä»¥å è½½ä¸çç¶æå±ç¤ºï¼é»è®¤ä¸ºæ¯ãè¥è®¾ç½®ä¸ºå¦ï¼åé»è®¤ä¼æ¾ç¤ºãç¹å»å è½½æ´å¤ãï¼ç¶åæä¼æ¾ç¤ºloading |
| | | chatLoadingMoreDefaultAsLoading: { |
| | | type: Boolean, |
| | | default: u.gc('chatLoadingMoreDefaultAsLoading', true) |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | // é®çé«åº¦ |
| | | keyboardHeight: 0, |
| | | // é®çé«åº¦æ¯å¦æªæ¹åï¼æ¤æ¶å ä½é«åº¦ååä¸éè¦å¨ç»ææ |
| | | isKeyboardHeightChanged: false, |
| | | } |
| | | }, |
| | | computed: { |
| | | finalChatRecordMoreOffset() { |
| | | return u.convertToPx(this.chatRecordMoreOffset); |
| | | }, |
| | | finalChatAdjustPositionOffset() { |
| | | return u.convertToPx(this.chatAdjustPositionOffset); |
| | | }, |
| | | // èå¤©è®°å½æ¨¡å¼æè½¬180度style |
| | | chatRecordRotateStyle() { |
| | | let cellStyle; |
| | | // å¨vueä¸ï¼ç´æ¥å°å表åç½®ï¼å æ¤å¨vueçcellä¸ï¼ä¹ç´æ¥åstyle="transform: scaleY(-1)"è½¬åæ¥å³å¯ã |
| | | // #ifndef APP-NVUE |
| | | cellStyle = this.useChatRecordMode ? { transform: 'scaleY(-1)' } : {}; |
| | | // #endif |
| | | |
| | | // å¨nvueä¸ï¼éè¦èèæ°æ®é䏿»¡ä¸é¡µçæ
åµï¼å 为nvueä¸çlistæ æ³éè¿flex-endä¿®æ¹ä¸æ»¡ä¸é¡µçèµ·å§ä½ç½®ï¼ä¼å¯¼è´ä¸æ»¡ä¸é¡µæ¶åè¡¨æ°æ®ä»åºé¨å¼å§ï¼å æ¤éè¦ç¹å«å¤æ |
| | | // 彿°æ®ä¸æ»¡ä¸å±çæ¶åï¼ä¸è¿è¡å表åç½® |
| | | // #ifdef APP-NVUE |
| | | cellStyle = this.useChatRecordMode ? { transform: this.isFirstPageAndNoMore ? 'scaleY(1)' : 'scaleY(-1)' } : {}; |
| | | // #endif |
| | | |
| | | this.$emit('update:cellStyle', cellStyle); |
| | | this.$emit('cellStyleChange', cellStyle); |
| | | |
| | | // å¨èå¤©è®°å½æ¨¡å¼ä¸ï¼å¦æå表没æå置并ä¸å½åæ¯ç¬¬ä¸é¡µï¼åéè¦èªå¨æ»å¨å°æåºé¨ |
| | | this.$nextTick(() => { |
| | | if (this.isFirstPage && this.isChatRecordModeAndNotInversion) { |
| | | this.$nextTick(() => { |
| | | // è¿é夿¬¡è§¦åæ»å¨å°åºé¨æ¯ä¸ºäºé¿å
å¨æäºæ
åµä¸ï¼å³ä½¿æ¯å¨nextTick使¯cellæªæ¸²æå®æ¯å¯¼è´æ»å¨å°åºé¨ä½ç½®ä¸æ£ç¡®çé®é¢ |
| | | this._scrollToBottom(false); |
| | | u.delay(() => { |
| | | this._scrollToBottom(false); |
| | | u.delay(() => { |
| | | this._scrollToBottom(false); |
| | | }, 50) |
| | | }, 50) |
| | | }) |
| | | } |
| | | }) |
| | | return cellStyle; |
| | | }, |
| | | // æ¯å¦æ¯è天记å½åè¡¨å¹¶ä¸æé
ç½®transform |
| | | isChatRecordModeHasTransform() { |
| | | return this.useChatRecordMode && this.chatRecordRotateStyle && this.chatRecordRotateStyle.transform; |
| | | }, |
| | | // æ¯å¦æ¯è天记å½å表并ä¸å表æªåç½® |
| | | isChatRecordModeAndNotInversion() { |
| | | return this.isChatRecordModeHasTransform && this.chatRecordRotateStyle.transform === 'scaleY(1)'; |
| | | }, |
| | | // æ¯å¦æ¯è天记å½å表并ä¸å表åç½® |
| | | isChatRecordModeAndInversion() { |
| | | return this.isChatRecordModeHasTransform && this.chatRecordRotateStyle.transform === 'scaleY(-1)'; |
| | | }, |
| | | // æç»çèå¤©è®°å½æ¨¡å¼ä¸åºé¨å®å
¨åºåçé«åº¦ï¼å¦æå¼å¯äºåºé¨å®å
¨åºåå¹¶ä¸é®çæªå¼¹åºï¼åæ·»å åºé¨åºåé«åº¦ |
| | | chatRecordModeSafeAreaBottom() { |
| | | return this.safeAreaInsetBottom && !this.keyboardHeight ? this.safeAreaBottom : 0; |
| | | } |
| | | }, |
| | | mounted() { |
| | | // çå¬é®çé«åº¦ååï¼H5ãç¾åº¦å°ç¨åºãæé³å°ç¨åºãé£ä¹¦å°ç¨åºä¸æ¯æï¼ |
| | | // #ifndef H5 || MP-BAIDU || MP-TOUTIAO |
| | | if (this.useChatRecordMode) { |
| | | uni.onKeyboardHeightChange(this._handleKeyboardHeightChange); |
| | | } |
| | | // #endif |
| | | }, |
| | | methods: { |
| | | // æ·»å èå¤©è®°å½ |
| | | addChatRecordData(data, toBottom = true, toBottomWithAnimate = true) { |
| | | if (!this.useChatRecordMode) return; |
| | | this.isTotalChangeFromAddData = true; |
| | | this.addDataFromTop(data, toBottom, toBottomWithAnimate); |
| | | }, |
| | | // æå¨è§¦åæ»å¨å°é¡¶é¨å è½½æ´å¤ï¼èå¤©è®°å½æ¨¡å¼æ¶ææ |
| | | doChatRecordLoadMore() { |
| | | this.useChatRecordMode && this._onLoadingMore('click'); |
| | | }, |
| | | // å¤çé®çé«åº¦åå |
| | | _handleKeyboardHeightChange(res) { |
| | | this.$emit('keyboardHeightChange', res); |
| | | if (this.autoAdjustPositionWhenChat) { |
| | | this.isKeyboardHeightChanged = true; |
| | | this.keyboardHeight = res.height > 0 ? res.height + this.finalChatAdjustPositionOffset : res.height; |
| | | } |
| | | if (this.autoToBottomWhenChat && this.keyboardHeight > 0) { |
| | | u.delay(() => { |
| | | this.scrollToBottom(false); |
| | | u.delay(() => { |
| | | this.scrollToBottom(false); |
| | | }) |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]éç¨å¸å±ç¸å
³æ¨¡å |
| | | import u from '.././z-paging-utils' |
| | | |
| | | // #ifdef APP-NVUE |
| | | const weexDom = weex.requireModule('dom'); |
| | | // #endif |
| | | |
| | | export default { |
| | | data() { |
| | | return { |
| | | systemInfo: null, |
| | | cssSafeAreaInsetBottom: -1, |
| | | isReadyDestroy: false, |
| | | } |
| | | }, |
| | | computed: { |
| | | // é¡¶é¨å¯ç¨è·ç¦» |
| | | windowTop() { |
| | | if (!this.systemInfo) return 0; |
| | | // ææ¶ä¿®å¤vue3ä¸éèç³»ç»å¯¼èªæ åwindowTopè·å䏿£ç¡®çé®é¢ï¼å
·ä½bug详è§https://ask.dcloud.net.cn/question/141634 |
| | | // æè°¢litangyuï¼ï¼https://github.com/SmileZXLee/uni-z-paging/issues/25 |
| | | // #ifdef VUE3 && H5 |
| | | const pageHeadNode = document.getElementsByTagName("uni-page-head"); |
| | | if (!pageHeadNode.length) return 0; |
| | | // #endif |
| | | return this.systemInfo.windowTop || 0; |
| | | }, |
| | | // åºé¨å®å
¨åºåé«åº¦ |
| | | safeAreaBottom() { |
| | | if (!this.systemInfo) return 0; |
| | | let safeAreaBottom = 0; |
| | | // #ifdef APP-PLUS |
| | | safeAreaBottom = this.systemInfo.safeAreaInsets.bottom || 0 ; |
| | | // #endif |
| | | // #ifndef APP-PLUS |
| | | safeAreaBottom = Math.max(this.cssSafeAreaInsetBottom, 0); |
| | | // #endif |
| | | return safeAreaBottom; |
| | | }, |
| | | // æ¯å¦æ¯æ¯è¾èçwebviewï¼å¨ä¸äºèçwebviewä¸ï¼éè¦è¿è¡ä¸äºç¹æ®å¤ç |
| | | isOldWebView() { |
| | | // #ifndef APP-NVUE || MP-KUAISHOU |
| | | try { |
| | | const systemInfos = u.getSystemInfoSync(true).system.split(' '); |
| | | const deviceType = systemInfos[0]; |
| | | const version = parseInt(systemInfos[1]); |
| | | if ((deviceType === 'iOS' && version <= 10) || (deviceType === 'Android' && version <= 6)) { |
| | | return true; |
| | | } |
| | | } catch(e) { |
| | | return false; |
| | | } |
| | | // #endif |
| | | return false; |
| | | }, |
| | | // å½åç»ä»¶ç$slotsï¼å
¼å®¹ä¸åå¹³å° |
| | | zSlots() { |
| | | // #ifdef VUE2 |
| | | |
| | | // #ifdef MP-ALIPAY |
| | | return this.$slots; |
| | | // #endif |
| | | |
| | | return this.$scopedSlots || this.$slots; |
| | | // #endif |
| | | |
| | | return this.$slots; |
| | | }, |
| | | }, |
| | | beforeDestroy() { |
| | | this.isReadyDestroy = true; |
| | | }, |
| | | // #ifdef VUE3 |
| | | unmounted() { |
| | | this.isReadyDestroy = true; |
| | | }, |
| | | // #endif |
| | | methods: { |
| | | // æ´æ°fixed模å¼ä¸z-pagingçå¸å± |
| | | updateFixedLayout() { |
| | | this.fixed && this.$nextTick(() => { |
| | | this.systemInfo = u.getSystemInfoSync(); |
| | | }) |
| | | }, |
| | | // è·åèç¹å°ºå¯¸ |
| | | _getNodeClientRect(select, inDom = true, scrollOffset = false) { |
| | | if (this.isReadyDestroy) { |
| | | return Promise.resolve(false); |
| | | }; |
| | | // nvueä¸è·åèç¹ä¿¡æ¯ |
| | | // #ifdef APP-NVUE |
| | | select = select.replace(/[.|#]/g, ''); |
| | | const ref = this.$refs[select]; |
| | | return new Promise((resolve, reject) => { |
| | | if (ref) { |
| | | weexDom.getComponentRect(ref, option => { |
| | | resolve(option && option.result ? [option.size] : false); |
| | | }) |
| | | } else { |
| | | resolve(false); |
| | | } |
| | | }); |
| | | return; |
| | | // #endif |
| | | |
| | | // vueä¸è·åèç¹ä¿¡æ¯ |
| | | //#ifdef MP-ALIPAY |
| | | inDom = false; |
| | | //#endif |
| | | |
| | | /* |
| | | inDomå¯è½æ¯trueãfalseï¼ä¹å¯è½æ¯å
·ä½çdomèç¹ |
| | | 妿inDomä¸ä¸ºfalseï¼å使ç¨uni.createSelectorQuery().in()è¿è¡æ¥è¯¢ï¼å¦æinDom为trueï¼åinä¸çæ¯thisï¼å¦åinä¸ç为å
·ä½çdom |
| | | 妿inDom为falseï¼å使ç¨uni.createSelectorQuery()è¿è¡æ¥è¯¢ |
| | | */ |
| | | let res = !!inDom ? uni.createSelectorQuery().in(inDom === true ? this : inDom) : uni.createSelectorQuery(); |
| | | scrollOffset ? res.select(select).scrollOffset() : res.select(select).boundingClientRect(); |
| | | return new Promise((resolve, reject) => { |
| | | res.exec(data => { |
| | | resolve((data && data != '' && data != undefined && data.length) ? data : false); |
| | | }); |
| | | }); |
| | | }, |
| | | // è·åslot="left"åslot="right"å®½åº¦å¹¶ä¸æ´æ°å¸å± |
| | | _updateLeftAndRightWidth(targetStyle, parentNodePrefix) { |
| | | this.$nextTick(() => { |
| | | let delayTime = 0; |
| | | // #ifdef MP-BAIDU |
| | | delayTime = 10; |
| | | // #endif |
| | | setTimeout(() => { |
| | | ['left','right'].map(position => { |
| | | this._getNodeClientRect(`.${parentNodePrefix}-${position}`).then(res => { |
| | | this.$set(targetStyle, position, res ? res[0].width + 'px' : '0px'); |
| | | }); |
| | | }) |
| | | }, delayTime) |
| | | }) |
| | | }, |
| | | // éè¿è·åcss设置çåºé¨å®å
¨åºåå ä½viewé«åº¦è®¾ç½®bottomè·ç¦»ï¼ç´æ¥éè¿systemInfoå¨é¨åå¹³å°ä¸æ æ³è·åå°åºé¨å®å
¨åºåï¼ |
| | | _getCssSafeAreaInsetBottom(success) { |
| | | this._getNodeClientRect('.zp-safe-area-inset-bottom').then(res => { |
| | | this.cssSafeAreaInsetBottom = res ? res[0].height : -1; |
| | | res && success && success(); |
| | | }); |
| | | }, |
| | | // 忥è·åç³»ç»ä¿¡æ¯ï¼å
¼å®¹ä¸åå¹³å°ï¼ä¾z-paging-swiper使ç¨ï¼ |
| | | _getSystemInfoSync(useCache = false) { |
| | | return u.getSystemInfoSync(useCache); |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]æ°æ®å¤ç模å |
| | | import u from '.././z-paging-utils' |
| | | import c from '.././z-paging-constant' |
| | | import Enum from '.././z-paging-enum' |
| | | import interceptor from '../z-paging-interceptor' |
| | | |
| | | export default { |
| | | props: { |
| | | // èªå®ä¹åå§çpageNoï¼é»è®¤ä¸º1 |
| | | defaultPageNo: { |
| | | type: Number, |
| | | default: u.gc('defaultPageNo', 1), |
| | | observer: function(newVal) { |
| | | this.pageNo = newVal; |
| | | }, |
| | | }, |
| | | // èªå®ä¹pageSizeï¼é»è®¤ä¸º10 |
| | | defaultPageSize: { |
| | | type: Number, |
| | | default: u.gc('defaultPageSize', 10), |
| | | validator: (value) => { |
| | | if (value <= 0) u.consoleErr('default-page-sizeå¿
须大äº0ï¼'); |
| | | return value > 0; |
| | | } |
| | | }, |
| | | // 为ä¿è¯æ°æ®ä¸è´ï¼è®¾ç½®å½åtab忢æ¶çæ è¯keyï¼å¹¶å¨completeä¸ä¼ éç¸åkeyï¼è¥äºè
ä¸ä¸è´ï¼åcompleteå°ä¸ä¼çæ |
| | | dataKey: { |
| | | type: [Number, String, Object], |
| | | default: u.gc('dataKey', null), |
| | | }, |
| | | // 使ç¨ç¼åï¼è¥å¼å¯å°èªå¨ç¼å第ä¸é¡µçæ°æ®ï¼é»è®¤ä¸ºå¦ã请注æï¼å èèå°åæ¢tabæ¶ä¸åtabæ°æ®ä¸åçæ
åµï¼é»è®¤ä»
ä¼ç¼åç»ä»¶é¦æ¬¡å è½½æ¶ç¬¬ä¸æ¬¡è¯·æ±å°çæ°æ®ï¼åç»ç䏿巿°æä½ä¸ä¼æ´æ°ç¼åã |
| | | useCache: { |
| | | type: Boolean, |
| | | default: u.gc('useCache', false) |
| | | }, |
| | | // 使ç¨ç¼åæ¶ç¼åçkeyï¼ç¨äºåºåä¸åå表çç¼åæ°æ®ï¼useCache为trueæ¶å¿
须设置ï¼å¦åç¼åæ æ |
| | | cacheKey: { |
| | | type: String, |
| | | default: u.gc('cacheKey', null) |
| | | }, |
| | | // ç¼å模å¼ï¼é»è®¤ä»
ä¼ç¼åç»ä»¶é¦æ¬¡å è½½æ¶ç¬¬ä¸æ¬¡è¯·æ±å°çæ°æ®ï¼å¯è®¾ç½®ä¸ºalwaysï¼å³ä»£è¡¨æ»æ¯ç¼åï¼æ¯æ¬¡åè¡¨å·æ°(䏿巿°ãè°ç¨reloadç)é½ä¼æ´æ°ç¼å |
| | | cacheMode: { |
| | | type: String, |
| | | default: u.gc('cacheMode', Enum.CacheMode.Default) |
| | | }, |
| | | // èªå¨æ³¨å
¥çliståï¼å¯èªå¨ä¿®æ¹ç¶view(å
å«ref="paging")ä¸å¯¹åºnameçlistå¼ |
| | | autowireListName: { |
| | | type: String, |
| | | default: u.gc('autowireListName', '') |
| | | }, |
| | | // èªå¨æ³¨å
¥çqueryåï¼å¯èªå¨è°ç¨ç¶view(å
å«ref="paging")ä¸çqueryæ¹æ³ |
| | | autowireQueryName: { |
| | | type: String, |
| | | default: u.gc('autowireQueryName', '') |
| | | }, |
| | | // è·ååé¡µæ°æ®Functionï¼åè½ä¸@query类似ãè¥è®¾ç½®äºfetchå@queryå°ä¸å触å |
| | | fetch: { |
| | | type: Function, |
| | | default: null |
| | | }, |
| | | // fetchçéå åæ°ï¼fetché
ç½®åææ |
| | | fetchParams: { |
| | | type: Object, |
| | | default: u.gc('fetchParams', null) |
| | | }, |
| | | // z-paging mountedåèªå¨è°ç¨reloadæ¹æ³(mountedåèªå¨è°ç¨æ¥å£)ï¼é»è®¤ä¸ºæ¯ |
| | | auto: { |
| | | type: Boolean, |
| | | default: u.gc('auto', true) |
| | | }, |
| | | // ç¨æ·ä¸æå·æ°æ¶æ¯å¦è§¦åreloadæ¹æ³ï¼é»è®¤ä¸ºæ¯ |
| | | reloadWhenRefresh: { |
| | | type: Boolean, |
| | | default: u.gc('reloadWhenRefresh', true) |
| | | }, |
| | | // reloadæ¶èªå¨æ»å¨å°é¡¶é¨ï¼é»è®¤ä¸ºæ¯ |
| | | autoScrollToTopWhenReload: { |
| | | type: Boolean, |
| | | default: u.gc('autoScrollToTopWhenReload', true) |
| | | }, |
| | | // reloadæ¶ç«å³èªå¨æ¸
空ålistï¼é»è®¤ä¸ºæ¯ï¼è¥ç«å³èªå¨æ¸
空ï¼åå¨reloadä¹åã请æ±åè°ä¹å页颿¯ç©ºç½ç |
| | | autoCleanListWhenReload: { |
| | | type: Boolean, |
| | | default: u.gc('autoCleanListWhenReload', true) |
| | | }, |
| | | // åè¡¨å·æ°æ¶èªå¨æ¾ç¤ºä¸æå·æ°viewï¼é»è®¤ä¸ºå¦ |
| | | showRefresherWhenReload: { |
| | | type: Boolean, |
| | | default: u.gc('showRefresherWhenReload', false) |
| | | }, |
| | | // åè¡¨å·æ°æ¶èªå¨æ¾ç¤ºå è½½æ´å¤viewï¼ä¸ä¸ºå è½½ä¸ç¶æï¼é»è®¤ä¸ºå¦ |
| | | showLoadingMoreWhenReload: { |
| | | type: Boolean, |
| | | default: u.gc('showLoadingMoreWhenReload', false) |
| | | }, |
| | | // ç»ä»¶createdæ¶ç«å³è§¦åreload(å¯è§£å³ä¸äºæ
åµä¸å
çå°é¡µé¢åçå°loadingçé®é¢)ï¼auto为trueæ¶ææãä¸ºå¦æ¶å°å¨mounted+nextTickå触åreloadï¼é»è®¤ä¸ºå¦ |
| | | createdReload: { |
| | | type: Boolean, |
| | | default: u.gc('createdReload', false) |
| | | }, |
| | | // æ¬å°å页æ¶ä¸æå è½½æ´å¤å»¶è¿æ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤200æ¯«ç§ |
| | | localPagingLoadingTime: { |
| | | type: [Number, String], |
| | | default: u.gc('localPagingLoadingTime', 200) |
| | | }, |
| | | // èªå¨æ¼æ¥completeä¸ä¼ è¿æ¥çæ°ç»(使ç¨èå¤©è®°å½æ¨¡å¼æ¶æ æ) |
| | | concat: { |
| | | type: Boolean, |
| | | default: u.gc('concat', true) |
| | | }, |
| | | // 请æ±å¤±è´¥æ¯å¦è§¦årejectï¼é»è®¤ä¸ºæ¯ |
| | | callNetworkReject: { |
| | | type: Boolean, |
| | | default: u.gc('callNetworkReject', true) |
| | | }, |
| | | // ç¶ç»ä»¶v-modelæç»å®çlistçå¼ |
| | | value: { |
| | | type: Array, |
| | | default: function() { |
| | | return []; |
| | | } |
| | | }, |
| | | // #ifdef VUE3 |
| | | modelValue: { |
| | | type: Array, |
| | | default: function() { |
| | | return []; |
| | | } |
| | | } |
| | | // #endif |
| | | }, |
| | | data (){ |
| | | return { |
| | | currentData: [], |
| | | totalData: [], |
| | | realTotalData: [], |
| | | totalLocalPagingList: [], |
| | | dataPromiseResultMap: { |
| | | reload: null, |
| | | complete: null, |
| | | localPaging: null |
| | | }, |
| | | isSettingCacheList: false, |
| | | pageNo: 1, |
| | | currentRefreshPageSize: 0, |
| | | isLocalPaging: false, |
| | | isAddedData: false, |
| | | isTotalChangeFromAddData: false, |
| | | privateConcat: true, |
| | | myParentQuery: -1, |
| | | firstPageLoaded: false, |
| | | pagingLoaded: false, |
| | | loaded: false, |
| | | isUserReload: true, |
| | | fromEmptyViewReload: false, |
| | | queryFrom: '', |
| | | listRendering: false, |
| | | isHandlingRefreshToPage: false, |
| | | isFirstPageAndNoMore: false, |
| | | totalDataChangeThrow: true |
| | | } |
| | | }, |
| | | computed: { |
| | | pageSize() { |
| | | return this.defaultPageSize; |
| | | }, |
| | | finalConcat() { |
| | | return this.concat && this.privateConcat; |
| | | }, |
| | | finalUseCache() { |
| | | if (this.useCache && !this.cacheKey) { |
| | | u.consoleErr('use-cache为trueæ¶ï¼å¿
须设置cache-keyï¼å¦åç¼åæ æï¼'); |
| | | } |
| | | return this.useCache && !!this.cacheKey; |
| | | }, |
| | | finalCacheKey() { |
| | | return this.cacheKey ? `${c.cachePrefixKey}-${this.cacheKey}` : null; |
| | | }, |
| | | isFirstPage() { |
| | | return this.pageNo === this.defaultPageNo; |
| | | } |
| | | }, |
| | | watch: { |
| | | totalData(newVal, oldVal) { |
| | | this._totalDataChange(newVal, oldVal, this.totalDataChangeThrow); |
| | | this.totalDataChangeThrow = true; |
| | | }, |
| | | currentData(newVal, oldVal) { |
| | | this._currentDataChange(newVal, oldVal); |
| | | }, |
| | | useChatRecordMode(newVal, oldVal) { |
| | | if (newVal) { |
| | | this.nLoadingMoreFixedHeight = false; |
| | | } |
| | | }, |
| | | value: { |
| | | handler(newVal) { |
| | | // å½v-modelç»å®çæ°æ®æºè¢«æ´æ¹æ¶ï¼æ¤æ¶æ°æ®æºæ¹åä¸emit inputäºä»¶ï¼é¿å
循ç¯è°ç¨ |
| | | if (newVal !== this.totalData) { |
| | | this.totalDataChangeThrow = false; |
| | | this.totalData = newVal; |
| | | } |
| | | }, |
| | | immediate: true |
| | | }, |
| | | // #ifdef VUE3 |
| | | modelValue: { |
| | | handler(newVal) { |
| | | // å½v-modelç»å®çæ°æ®æºè¢«æ´æ¹æ¶ï¼æ¤æ¶æ°æ®æºæ¹åä¸emit inputäºä»¶ï¼é¿å
循ç¯è°ç¨ |
| | | if (newVal !== this.totalData) { |
| | | this.totalDataChangeThrow = false; |
| | | this.totalData = newVal; |
| | | } |
| | | }, |
| | | immediate: true |
| | | } |
| | | // #endif |
| | | }, |
| | | methods: { |
| | | // 请æ±ç»æ(æåæè
失败)è°ç¨æ¤æ¹æ³ï¼å°è¯·æ±çç»æä¼ éç»z-pagingå¤çï¼ç¬¬ä¸ä¸ªåæ°ä¸ºè¯·æ±ç»ææ°ç»ï¼ç¬¬äºä¸ªåæ°ä¸ºæ¯å¦æå(é»è®¤ä¸ºæ¯ï¼ |
| | | complete(data, success = true) { |
| | | this.customNoMore = -1; |
| | | return this.addData(data, success); |
| | | }, |
| | | //ãä¿è¯æ°æ®ä¸è´ã请æ±ç»æ(æåæè
失败)è°ç¨æ¤æ¹æ³ï¼å°è¯·æ±çç»æä¼ éç»z-pagingå¤çï¼ç¬¬ä¸ä¸ªåæ°ä¸ºè¯·æ±ç»ææ°ç»ï¼ç¬¬äºä¸ªåæ°ä¸ºdataKeyï¼éä¸:data-keyç»å®çä¸è´ï¼ç¬¬ä¸ä¸ªåæ°ä¸ºæ¯å¦æå(é»è®¤ä¸ºæ¯ï¼ |
| | | completeByKey(data, dataKey = null, success = true) { |
| | | if (dataKey !== null && this.dataKey !== null && dataKey !== this.dataKey) { |
| | | this.isFirstPage && this.endRefresh(); |
| | | return new Promise(resolve => resolve()); |
| | | } |
| | | this.customNoMore = -1; |
| | | return this.addData(data, success); |
| | | }, |
| | | //ãéè¿total夿æ¯å¦ææ´å¤æ°æ®ã请æ±ç»æ(æåæè
失败)è°ç¨æ¤æ¹æ³ï¼å°è¯·æ±çç»æä¼ éç»z-pagingå¤çï¼ç¬¬ä¸ä¸ªåæ°ä¸ºè¯·æ±ç»ææ°ç»ï¼ç¬¬äºä¸ªåæ°ä¸ºtotal(åè¡¨æ»æ°)ï¼ç¬¬ä¸ä¸ªåæ°ä¸ºæ¯å¦æå(é»è®¤ä¸ºæ¯ï¼ |
| | | completeByTotal(data, total, success = true) { |
| | | if (total == 'undefined') { |
| | | this.customNoMore = -1; |
| | | } else { |
| | | const dataTypeRes = this._checkDataType(data, success, false); |
| | | data = dataTypeRes.data; |
| | | success = dataTypeRes.success; |
| | | if (total >= 0 && success) { |
| | | return new Promise((resolve, reject) => { |
| | | this.$nextTick(() => { |
| | | let nomore = false; |
| | | const realTotalDataCount = this.pageNo == this.defaultPageNo ? 0 : this.realTotalData.length; |
| | | const dataLength = this.privateConcat ? data.length : 0; |
| | | let exceedCount = realTotalDataCount + dataLength - total; |
| | | // æ²¡ææ´å¤æ°æ®äº |
| | | if (exceedCount >= 0) { |
| | | nomore = true; |
| | | // ä»
æªåtotalå
é¨åçæ°æ® |
| | | exceedCount = this.defaultPageSize - exceedCount; |
| | | if (this.privateConcat && exceedCount > 0 && exceedCount < data.length) { |
| | | data = data.splice(0, exceedCount); |
| | | } |
| | | } |
| | | this.completeByNoMore(data, nomore, success).then(res => resolve(res)).catch(() => reject()); |
| | | }) |
| | | }); |
| | | } |
| | | } |
| | | return this.addData(data, success); |
| | | }, |
| | | //ãèªè¡å¤ææ¯å¦ææ´å¤æ°æ®ã请æ±ç»æ(æåæè
失败)è°ç¨æ¤æ¹æ³ï¼å°è¯·æ±çç»æä¼ éç»z-pagingå¤çï¼ç¬¬ä¸ä¸ªåæ°ä¸ºè¯·æ±ç»ææ°ç»ï¼ç¬¬äºä¸ªåæ°ä¸ºæ¯å¦æ²¡ææ´å¤æ°æ®ï¼ç¬¬ä¸ä¸ªåæ°ä¸ºæ¯å¦æå(é»è®¤æ¯æ¯ï¼ |
| | | completeByNoMore(data, nomore, success = true) { |
| | | if (nomore != 'undefined') { |
| | | this.customNoMore = nomore == true ? 1 : 0; |
| | | } |
| | | return this.addData(data, success); |
| | | }, |
| | | // 请æ±ç»æä¸è¯·æ±å¤±è´¥æ¶è°ç¨ï¼æ¯æä¼ å
¥è¯·æ±å¤±è´¥åå |
| | | completeByError(errorMsg) { |
| | | this.customerEmptyViewErrorText = errorMsg; |
| | | return this.complete(false); |
| | | }, |
| | | // ä¸ä¸æ¹completeæ¹æ³åè½ä¸è´ï¼æ°çæ¬ä¸è®¾ç½®æå¡ç«¯åè°æ°ç»è¯·ä½¿ç¨completeæ¹æ³ |
| | | addData(data, success = true) { |
| | | if (!this.fromCompleteEmit) { |
| | | this.disabledCompleteEmit = true; |
| | | this.fromCompleteEmit = false; |
| | | } |
| | | const currentTimeStamp = u.getTime(); |
| | | const disTime = currentTimeStamp - this.requestTimeStamp; |
| | | let minDelay = this.minDelay; |
| | | if (this.isFirstPage && this.finalShowRefresherWhenReload) { |
| | | minDelay = Math.max(400, minDelay); |
| | | } |
| | | const addDataDalay = (this.requestTimeStamp > 0 && disTime < minDelay) ? minDelay - disTime : 0; |
| | | this.$nextTick(() => { |
| | | u.delay(() => { |
| | | this._addData(data, success, false); |
| | | }, this.delay > 0 ? this.delay : addDataDalay) |
| | | }) |
| | | |
| | | return new Promise((resolve, reject) => { |
| | | this.dataPromiseResultMap.complete = { resolve, reject }; |
| | | }); |
| | | }, |
| | | // ä»é¡¶é¨æ·»å æ°æ®ï¼ä¸ä¼å½±åå页çpageNoåpageSize |
| | | addDataFromTop(data, toTop = true, toTopWithAnimate = true) { |
| | | // æ°æ®æ¯å¦æ¼æ¥å°é¡¶é¨ï¼å¦ææ¯èå¤©è®°å½æ¨¡å¼å¹¶ä¸å表没æåç½®ï¼ååºè¯¥æ¼æ¥å¨åºé¨ |
| | | let addFromTop = !this.isChatRecordModeAndNotInversion; |
| | | data = Object.prototype.toString.call(data) !== '[object Array]' ? [data] : (addFromTop ? data.reverse() : data); |
| | | // #ifndef APP-NVUE |
| | | this.finalUseVirtualList && this._setCellIndex(data, 'top') |
| | | // #endif |
| | | |
| | | this.totalData = addFromTop ? [...data, ...this.totalData] : [...this.totalData, ...data]; |
| | | if (toTop) { |
| | | u.delay(() => this.useChatRecordMode ? this.scrollToBottom(toTopWithAnimate) : this.scrollToTop(toTopWithAnimate)); |
| | | } |
| | | }, |
| | | // éæ°è®¾ç½®åè¡¨æ°æ®ï¼è°ç¨æ¤æ¹æ³ä¸ä¼å½±åpageNoåpageSizeï¼ä¹ä¸ä¼è§¦å请æ±ãéç¨åºæ¯ï¼å½éè¦å é¤åè¡¨ä¸æä¸é¡¹æ¶ï¼å°å é¤å¯¹åºé¡¹åçæ°ç»éè¿æ¤æ¹æ³ä¼ éç»z-pagingã(å½åºç°ç±»ä¼¼çéè¦ä¿®æ¹å表æ°ç»çåºæ¯æ¶ï¼è¯·ä½¿ç¨æ¤æ¹æ³ï¼è¯·å¿ç´æ¥ä¿®æ¹pageä¸:list.syncç»å®çæ°ç») |
| | | resetTotalData(data) { |
| | | this.isTotalChangeFromAddData = true; |
| | | data = Object.prototype.toString.call(data) !== '[object Array]' ? [data] : data; |
| | | this.totalData = data; |
| | | }, |
| | | // 设置æ¬å°åé¡µæ°æ®ï¼è¯·æ±ç»æ(æåæè
失败)è°ç¨æ¤æ¹æ³ï¼å°è¯·æ±çç»æä¼ éç»z-pagingä½å页å¤çï¼è¥è°ç¨äºæ¤æ¹æ³ï¼å䏿å è½½æ´å¤æ¶å
é¨ä¼èªå¨å页ï¼ä¸ä¼è§¦å@queryæç»å®çäºä»¶ï¼ |
| | | setLocalPaging(data, success = true) { |
| | | this.isLocalPaging = true; |
| | | this.$nextTick(() => { |
| | | this._addData(data, success, true); |
| | | }) |
| | | return new Promise((resolve, reject) => { |
| | | this.dataPromiseResultMap.localPaging = { resolve, reject }; |
| | | }); |
| | | }, |
| | | // éæ°å è½½åé¡µæ°æ®ï¼pageNo伿¢å¤ä¸ºé»è®¤å¼ï¼ç¸å½äºä¸æå·æ°çææ(animate为trueæ¶ä¼å±ç¤ºä¸æå·æ°å¨ç»ï¼é»è®¤ä¸ºfalse) |
| | | reload(animate = this.showRefresherWhenReload) { |
| | | if (animate) { |
| | | this.privateShowRefresherWhenReload = animate; |
| | | this.isUserPullDown = true; |
| | | } |
| | | if (!this.showLoadingMoreWhenReload) { |
| | | this.listRendering = true; |
| | | } |
| | | this.$nextTick(() => { |
| | | this._preReload(animate, false); |
| | | }) |
| | | return new Promise((resolve, reject) => { |
| | | this.dataPromiseResultMap.reload = { resolve, reject }; |
| | | }); |
| | | }, |
| | | // å·æ°åè¡¨æ°æ®ï¼pageNoåpageSizeä¸ä¼éç½®ï¼åè¡¨æ°æ®ä¼éæ°ä»æå¡ç«¯è·åãå¿
é¡»ä¿è¯@queryç»å®çæ¹æ³ä¸çpageNoåpageSizeåä¼ ç»æå¡ç«¯çä¸è´ |
| | | refresh() { |
| | | return this._handleRefreshWithDisPageNo(this.pageNo - this.defaultPageNo + 1); |
| | | }, |
| | | // å·æ°åè¡¨æ°æ®è³æå®é¡µï¼ä¾å¦pageNo=5æ¶åä»£è¡¨å·æ°å表è³ç¬¬5é¡µï¼æ¤æ¶pageNoä¼å为5ï¼å表ä¼å±ç¤ºå5é¡µçæ°æ®ãå¿
é¡»ä¿è¯@queryç»å®çæ¹æ³ä¸çpageNoåpageSizeåä¼ ç»æå¡ç«¯çä¸è´ |
| | | refreshToPage(pageNo) { |
| | | this.isHandlingRefreshToPage = true; |
| | | return this._handleRefreshWithDisPageNo(pageNo + this.defaultPageNo - 1); |
| | | }, |
| | | // æå¨æ´æ°å表ç¼åæ°æ®ï¼å°èªå¨æªåv-modelç»å®çlistä¸çåpageSizeæ¡è¦çç¼åï¼è¯·ç¡®ä¿å¨listæ°æ®æ´æ°å°é¢æç»æååè°ç¨æ¤æ¹æ³ |
| | | updateCache() { |
| | | if (this.finalUseCache && this.totalData.length) { |
| | | this._saveLocalCache(this.totalData.slice(0, Math.min(this.totalData.length, this.pageSize))); |
| | | } |
| | | }, |
| | | // æ¸
空åé¡µæ°æ® |
| | | clean() { |
| | | this._reload(true); |
| | | this._addData([], true, false); |
| | | }, |
| | | // æ¸
空åé¡µæ°æ® |
| | | clear() { |
| | | this.clean(); |
| | | }, |
| | | // reloadä¹åçä¸äºå¤ç |
| | | _preReload(animate = this.showRefresherWhenReload, isFromMounted = true, retryCount = 0) { |
| | | const showRefresher = this.finalRefresherEnabled && this.useCustomRefresher; |
| | | // #ifndef APP-NVUE |
| | | // 妿è·åslot="refresher"é«åº¦å¤±è´¥ï¼åä¸è§¦åreloadï¼ç´å°è·åslot="refresher"é«åº¦æå |
| | | if (this.customRefresherHeight === -1 && showRefresher) { |
| | | u.delay(() => { |
| | | retryCount ++; |
| | | // 妿éè¯æ¬¡æ°æ¯10çåæ°(ä¹å°±æ¯æ¯500毫ç§)ï¼å°è¯éæ°è·åä¸ä¸slot="refresher"é«åº¦ |
| | | // æ¤ä¸¾æ¯ä¸ºäºè§£å³å¨æäºç¹æ®æ
åµä¸ï¼z-pagingç»ä»¶mountedäºï¼ä½æ¯æªå±ç¤ºå¨ç¨æ·é¢åï¼ï¼æ¯å¦å¨tabbar页é¢ä¸ï¼æªåæ¢å°å¯¹åºtabbar使¯éè¿ä»£ç 让z-pagingå±ç¤ºäºï¼æ¤æ¶æ§å¶å°ä¼æ¥Error: Not Foundï¼Pageï¼å ä¸ºè¿æ¶åå»è·ådomèç¹ä¿¡æ¯è·åä¸å°ï¼ |
| | | // å½ç¨æ·å¨æä¸ªæ¶å»è®©æ¤z-pagingå±ç¤ºå¨é¢åæ¶ï¼å³å¯é¡ºå©è·åå°slot="refresher"é«åº¦ï¼éå½åæ¢ |
| | | if (retryCount % 10 === 0) { |
| | | this._updateCustomRefresherHeight(); |
| | | } |
| | | this._preReload(animate, isFromMounted, retryCount); |
| | | }, c.delayTime / 2); |
| | | return; |
| | | } |
| | | // #endif |
| | | this.isUserReload = true; |
| | | this.loadingType = Enum.LoadingType.Refresher; |
| | | if (animate) { |
| | | this.privateShowRefresherWhenReload = animate; |
| | | // #ifndef APP-NVUE |
| | | if (this.useCustomRefresher) { |
| | | this._doRefresherRefreshAnimate(); |
| | | } else { |
| | | this.refresherTriggered = true; |
| | | } |
| | | // #endif |
| | | // #ifdef APP-NVUE |
| | | this.refresherStatus = Enum.Refresher.Loading; |
| | | this.refresherRevealStackCount ++; |
| | | u.delay(() => { |
| | | this._getNodeClientRect('zp-n-refresh-container', false).then((node) => { |
| | | if (node) { |
| | | let nodeHeight = node[0].height; |
| | | this.nShowRefresherReveal = true; |
| | | this.nShowRefresherRevealHeight = nodeHeight; |
| | | u.delay(() => { |
| | | this._nDoRefresherEndAnimation(0, -nodeHeight, false, false); |
| | | u.delay(() => { |
| | | this._nDoRefresherEndAnimation(nodeHeight, 0); |
| | | }, 10) |
| | | }, 10) |
| | | } |
| | | this._reload(false, isFromMounted); |
| | | this._doRefresherLoad(false); |
| | | }); |
| | | }, this.pagingLoaded ? 10 : 100) |
| | | return; |
| | | // #endif |
| | | } else { |
| | | this._refresherEnd(false, false, false, false); |
| | | } |
| | | this._reload(false, isFromMounted); |
| | | }, |
| | | // éæ°å è½½åé¡µæ°æ® |
| | | _reload(isClean = false, isFromMounted = false, isUserPullDown = false) { |
| | | this.isAddedData = false; |
| | | this.insideOfPaging = -1; |
| | | this.cacheScrollNodeHeight = -1; |
| | | this.pageNo = this.defaultPageNo; |
| | | this._cleanRefresherEndTimeout(); |
| | | !this.privateShowRefresherWhenReload && !isClean && this._startLoading(true); |
| | | this.firstPageLoaded = true; |
| | | this.isTotalChangeFromAddData = false; |
| | | if (!this.isSettingCacheList) { |
| | | this.totalData = []; |
| | | } |
| | | if (!isClean) { |
| | | this._emitQuery(this.pageNo, this.defaultPageSize, isUserPullDown ? Enum.QueryFrom.UserPullDown : Enum.QueryFrom.Reload); |
| | | let delay = 0; |
| | | // #ifdef MP-TOUTIAO |
| | | delay = 5; |
| | | // #endif |
| | | u.delay(this._callMyParentQuery, delay); |
| | | if (!isFromMounted && this.autoScrollToTopWhenReload) { |
| | | let checkedNRefresherLoading = true; |
| | | // #ifdef APP-NVUE |
| | | checkedNRefresherLoading = !this.nRefresherLoading; |
| | | // #endif |
| | | checkedNRefresherLoading && this._scrollToTop(false); |
| | | } |
| | | } |
| | | // #ifdef APP-NVUE |
| | | this.$nextTick(() => { |
| | | this.nShowBottom = this.realTotalData.length > 0; |
| | | }) |
| | | // #endif |
| | | }, |
| | | // å¤çæå¡ç«¯è¿åçæ°ç» |
| | | _addData(data, success, isLocal) { |
| | | this.isAddedData = true; |
| | | this.fromEmptyViewReload = false; |
| | | this.isTotalChangeFromAddData = true; |
| | | this.refresherTriggered = false; |
| | | this._endSystemLoadingAndRefresh(); |
| | | const tempIsUserPullDown = this.isUserPullDown; |
| | | if (this.showRefresherUpdateTime && this.isFirstPage) { |
| | | u.setRefesrherTime(u.getTime(), this.refresherUpdateTimeKey); |
| | | this.$refs.refresh && this.$refs.refresh.updateTime(); |
| | | } |
| | | if (!isLocal && tempIsUserPullDown && this.isFirstPage) { |
| | | this.isUserPullDown = false; |
| | | } |
| | | this.listRendering = true; |
| | | this.$nextTick(() => { |
| | | u.delay(() => this.listRendering = false); |
| | | }) |
| | | let dataTypeRes = this._checkDataType(data, success, isLocal); |
| | | data = dataTypeRes.data; |
| | | success = dataTypeRes.success; |
| | | let delayTime = c.delayTime; |
| | | if (this.useChatRecordMode) delayTime = 0; |
| | | this.loadingForNow = false; |
| | | u.delay(() => { |
| | | this.pagingLoaded = true; |
| | | this.$nextTick(()=>{ |
| | | !isLocal && this._refresherEnd(delayTime > 0, true, tempIsUserPullDown); |
| | | }) |
| | | }) |
| | | if (this.isFirstPage) { |
| | | this.isLoadFailed = !success; |
| | | this.$emit('isLoadFailedChange', this.isLoadFailed); |
| | | if (this.finalUseCache && success && (this.cacheMode === Enum.CacheMode.Always ? true : this.isSettingCacheList)) { |
| | | this._saveLocalCache(data); |
| | | } |
| | | } |
| | | this.isSettingCacheList = false; |
| | | if (success) { |
| | | if (!(this.privateConcat === false && !this.isHandlingRefreshToPage && this.loadingStatus === Enum.More.NoMore)) { |
| | | this.loadingStatus = Enum.More.Default; |
| | | } |
| | | if (isLocal) { |
| | | // 妿å½åæ¯æ¬å°å页ï¼åå¿
ç¶æ¯ç±setLocalPagingæ¹æ³è§¦åï¼æ¤æ¶ç´æ¥æ¬å°å 载第ä¸é¡µæ°æ®å³å¯ãåç»æ¬å°å页å è½½æ´å¤æ¹æ³ç±æ»å¨å°åºé¨å è½½æ´å¤äºä»¶å¤ç |
| | | this.totalLocalPagingList = data; |
| | | const localPageNo = this.defaultPageNo; |
| | | const localPageSize = this.queryFrom !== Enum.QueryFrom.Refresh ? this.defaultPageSize : this.currentRefreshPageSize; |
| | | this._localPagingQueryList(localPageNo, localPageSize, 0, res => { |
| | | u.delay(() => { |
| | | this.completeByTotal(res, this.totalLocalPagingList.length);; |
| | | }, 0) |
| | | }) |
| | | } else { |
| | | // 妿å½å䏿¯æ¬å°å页ï¼åæç
§æ£å¸¸å页é»è¾è¿è¡æ°æ®å¤ç&emitæ°æ® |
| | | let dataChangeDelayTime = 0; |
| | | // #ifdef APP-NVUE |
| | | if (this.privateShowRefresherWhenReload && this.finalNvueListIs === 'waterfall') { |
| | | dataChangeDelayTime = 150; |
| | | } |
| | | // #endif |
| | | u.delay(() => { |
| | | this._currentDataChange(data, this.currentData); |
| | | this._callDataPromise(true, this.totalData); |
| | | }, dataChangeDelayTime) |
| | | } |
| | | if (this.isHandlingRefreshToPage) { |
| | | this.isHandlingRefreshToPage = false; |
| | | this.pageNo = this.defaultPageNo + Math.ceil(data.length / this.pageSize) - 1; |
| | | if (data.length % this.pageSize !== 0) { |
| | | this.customNoMore = 1; |
| | | } |
| | | } |
| | | } else { |
| | | this._currentDataChange(data, this.currentData); |
| | | this._callDataPromise(false); |
| | | this.loadingStatus = Enum.More.Fail; |
| | | this.isHandlingRefreshToPage = false; |
| | | if (this.loadingType === Enum.LoadingType.LoadMore) { |
| | | this.pageNo --; |
| | | } |
| | | } |
| | | }, |
| | | // æææ°æ®æ¹åæ¶è°ç¨ |
| | | _totalDataChange(newVal, oldVal, eventThrow=true) { |
| | | if ((!this.isUserReload || !this.autoCleanListWhenReload) && this.firstPageLoaded && !newVal.length && oldVal.length) { |
| | | return; |
| | | } |
| | | this._doCheckScrollViewShouldFullHeight(newVal); |
| | | if(!this.realTotalData.length && !newVal.length){ |
| | | eventThrow = false; |
| | | } |
| | | this.realTotalData = newVal; |
| | | // emitåè¡¨æ´æ°äºä»¶ |
| | | if (eventThrow) { |
| | | this.$emit('input', newVal); |
| | | // #ifdef VUE3 |
| | | this.$emit('update:modelValue', newVal); |
| | | // #endif |
| | | this.$emit('update:list', newVal); |
| | | this.$emit('listChange', newVal); |
| | | this._callMyParentList(newVal); |
| | | } |
| | | this.firstPageLoaded = false; |
| | | this.isTotalChangeFromAddData = false; |
| | | this.$nextTick(() => { |
| | | u.delay(()=>{ |
| | | // emit z-pagingå
容åºåé«åº¦æ¹åäºä»¶ |
| | | this._getNodeClientRect('.zp-paging-container-content').then(res => { |
| | | res && this.$emit('contentHeightChanged', res[0].height); |
| | | }); |
| | | }, c.delayTime * (this.isIos ? 1 : 3)) |
| | | // #ifdef APP-NVUE |
| | | // å¨nvueä¸å»¶æ¶600毫ç§å±ç¤ºåºé¨å è½½æ´å¤ï¼é¿å
åºé¨å è½½æ´å¤å¤ªæ©å è½½éªä¸ä¸çé®é¢ |
| | | u.delay(() => { |
| | | this.nShowBottom = true; |
| | | }, c.delayTime * 6, 'nShowBottomDelay'); |
| | | // #endif |
| | | }) |
| | | }, |
| | | // å½åæ°æ®æ¹åæ¶è°ç¨ |
| | | _currentDataChange(newVal, oldVal) { |
| | | newVal = [...newVal]; |
| | | // #ifndef APP-NVUE |
| | | this.finalUseVirtualList && this._setCellIndex(newVal, 'bottom'); |
| | | // #endif |
| | | if (this.isFirstPage && this.finalConcat) { |
| | | this.totalData = []; |
| | | } |
| | | // customNoMoreï¼-1代表交ç±z-pagingèªè¡å¤æï¼1ä»£è¡¨æ²¡ææ´å¤äºï¼0ä»£è¡¨è¿ææ´å¤æ°æ® |
| | | if (this.customNoMore !== -1) { |
| | | // 妿customNoMoreçäº1 æè
customNoMore䏿¯0并䏿°å¢æ°ç»é¿åº¦ä¸º0(ä¹å°±æ¯ä¸æ¯æç¡®çè¿ææ´å¤æ°æ®å¹¶ä¸æ°å¢çæ°ç»é¿åº¦ä¸º0)ï¼åæ²¡ææ´å¤æ°æ®äº |
| | | if (this.customNoMore === 1 || (this.customNoMore !== 0 && !newVal.length)) { |
| | | this.loadingStatus = Enum.More.NoMore; |
| | | } |
| | | } else { |
| | | // 妿æ°å¢çæ°æ®æ°ç»é¿åº¦ä¸º0 æè
æ°å¢çæ°ç»é¿åº¦å°äºé»è®¤çpageSizeï¼åæ²¡ææ´å¤æ°æ®äº |
| | | if (!newVal.length || (newVal.length && newVal.length < this.defaultPageSize)) { |
| | | this.loadingStatus = Enum.More.NoMore; |
| | | } |
| | | } |
| | | if (!this.totalData.length) { |
| | | // #ifdef APP-NVUE |
| | | // 妿å¨èå¤©è®°å½æ¨¡å¼+nvueä¸ï¼å¹¶ä¸æ°æ®ä¸æ»¡ä¸é¡µæ¶éè¦å°å表ååºï¼å ä¸ºæ¤æ¶æ²¡æå°å表æè½¬180åº¦ï¼æ°ç»ä¸ç¬¬0æ¡æ°æ®åºå½å¨æåºä¸æ¾ç¤º |
| | | if (this.useChatRecordMode && this.finalConcat && this.isFirstPage && this.loadingStatus === Enum.More.NoMore) { |
| | | newVal.reverse(); |
| | | } |
| | | // #endif |
| | | this.totalData = newVal; |
| | | } else { |
| | | if (this.finalConcat) { |
| | | const currentScrollTop = this.oldScrollTop; |
| | | this.totalData = [...this.totalData, ...newVal]; |
| | | // æ¤å¤æ¯ä¸ºäºè§£å³å¨å¾®ä¿¡å°ç¨åºä¸ï¼å¨æäºæ
åµä¸æ»å¨å°åºé¨å è½½æ´å¤åæ»å¨ä½ç½®ç´æ¥å为æåºé¨çé®é¢ï¼å æ¤éè¦éè¿ä»£ç å¼ºå¶æ»å¨åå è½½æ´å¤åçä½ç½® |
| | | // #ifdef MP-WEIXIN |
| | | if (!this.isIos && !this.refresherOnly && !this.usePageScroll && newVal.length) { |
| | | this.loadingMoreTimeStamp = u.getTime(); |
| | | this.$nextTick(() => { |
| | | this.scrollToY(currentScrollTop); |
| | | }) |
| | | } |
| | | // #endif |
| | | } else { |
| | | this.totalData = newVal; |
| | | } |
| | | } |
| | | this.privateConcat = true; |
| | | }, |
| | | // æ ¹æ®pageNoå¤çrefreshæä½ |
| | | _handleRefreshWithDisPageNo(pageNo) { |
| | | if (!this.isHandlingRefreshToPage && !this.realTotalData.length) return this.reload(); |
| | | if (pageNo >= 1) { |
| | | this.loading = true; |
| | | this.privateConcat = false; |
| | | const totalPageSize = pageNo * this.pageSize; |
| | | this.currentRefreshPageSize = totalPageSize; |
| | | // 妿è°ç¨refreshæ¶æ¯æ¬å°å页ï¼åå¨ç»ä»¶å
é¨èªå·±å¤çå页é»è¾ï¼ä¸emit queryç¸å
³äºä»¶ |
| | | if (this.isLocalPaging && this.isHandlingRefreshToPage) { |
| | | this._localPagingQueryList(this.defaultPageNo, totalPageSize, 0, res => { |
| | | this.complete(res); |
| | | }) |
| | | } else { |
| | | // emit queryç¸å
³äºä»¶ |
| | | this._emitQuery(this.defaultPageNo, totalPageSize, Enum.QueryFrom.Refresh); |
| | | this._callMyParentQuery(this.defaultPageNo, totalPageSize); |
| | | } |
| | | } |
| | | return new Promise((resolve, reject) => { |
| | | this.dataPromiseResultMap.reload = { resolve, reject }; |
| | | }); |
| | | }, |
| | | // æ¬å°åé¡µè¯·æ± |
| | | _localPagingQueryList(pageNo, pageSize, localPagingLoadingTime, callback) { |
| | | pageNo = Math.max(1, pageNo); |
| | | pageSize = Math.max(1, pageSize); |
| | | const totalPagingList = [...this.totalLocalPagingList]; |
| | | const pageNoIndex = (pageNo - 1) * pageSize; |
| | | const finalPageNoIndex = Math.min(totalPagingList.length, pageNoIndex + pageSize); |
| | | const resultPagingList = totalPagingList.splice(pageNoIndex, finalPageNoIndex - pageNoIndex); |
| | | u.delay(() => callback(resultPagingList), localPagingLoadingTime) |
| | | }, |
| | | // åå¨å表ç¼åæ°æ® |
| | | _saveLocalCache(data) { |
| | | uni.setStorageSync(this.finalCacheKey, data); |
| | | }, |
| | | // éè¿ç¼åæ°æ®å¡«å
åè¡¨æ°æ® |
| | | _setListByLocalCache() { |
| | | this.totalData = uni.getStorageSync(this.finalCacheKey) || []; |
| | | this.isSettingCacheList = true; |
| | | }, |
| | | // ä¿®æ¹ç¶viewçlist |
| | | _callMyParentList(newVal) { |
| | | if (this.autowireListName.length) { |
| | | const myParent = u.getParent(this.$parent); |
| | | if (myParent && myParent[this.autowireListName]) { |
| | | myParent[this.autowireListName] = newVal; |
| | | } |
| | | } |
| | | }, |
| | | // è°ç¨ç¶viewçquery |
| | | _callMyParentQuery(customPageNo = 0, customPageSize = 0) { |
| | | if (this.autowireQueryName) { |
| | | if (this.myParentQuery === -1) { |
| | | const myParent = u.getParent(this.$parent); |
| | | if (myParent && myParent[this.autowireQueryName]) { |
| | | this.myParentQuery = myParent[this.autowireQueryName]; |
| | | } |
| | | } |
| | | if (this.myParentQuery !== -1) { |
| | | customPageSize > 0 ? this.myParentQuery(customPageNo, customPageSize) : this.myParentQuery(this.pageNo, this.defaultPageSize); |
| | | } |
| | | } |
| | | }, |
| | | // emit queryäºä»¶ |
| | | _emitQuery(pageNo, pageSize, from){ |
| | | this.queryFrom = from; |
| | | this.requestTimeStamp = u.getTime(); |
| | | const [lastItem] = this.realTotalData.slice(-1); |
| | | if (this.fetch) { |
| | | const fetchParams = interceptor._handleFetchParams({pageNo, pageSize, from, lastItem: lastItem || null}, this.fetchParams); |
| | | const fetchResult = this.fetch(fetchParams); |
| | | if (!interceptor._handleFetchResult(fetchResult, this, fetchParams)) { |
| | | u.isPromise(fetchResult) ? fetchResult.then(res => { |
| | | this.complete(res); |
| | | }).catch(err => { |
| | | this.complete(false); |
| | | }) : this.complete(fetchResult) |
| | | } |
| | | } else { |
| | | this.$emit('query', ...interceptor._handleQuery(pageNo, pageSize, from, lastItem || null)); |
| | | } |
| | | }, |
| | | // è§¦åæ°æ®æ¹åpromise |
| | | _callDataPromise(success, totalList) { |
| | | for (const key in this.dataPromiseResultMap) { |
| | | const obj = this.dataPromiseResultMap[key]; |
| | | if (!obj) continue; |
| | | success ? obj.resolve({ totalList, noMore: this.loadingStatus === Enum.More.NoMore }) : this.callNetworkReject && obj.reject(`z-paging-${key}-error`); |
| | | } |
| | | }, |
| | | // æ£æ¥complete dataçç±»å |
| | | _checkDataType(data, success, isLocal) { |
| | | const dataType = Object.prototype.toString.call(data); |
| | | if (dataType === '[object Boolean]') { |
| | | success = data; |
| | | data = []; |
| | | } else if (dataType !== '[object Array]') { |
| | | data = []; |
| | | if (dataType !== '[object Undefined]' && dataType !== '[object Null]') { |
| | | u.consoleErr(`${isLocal ? 'setLocalPaging' : 'complete'}åæ°ç±»å䏿£ç¡®ï¼ç¬¬ä¸ä¸ªåæ°ç±»åå¿
须为Array!`); |
| | | } |
| | | } |
| | | return { data, success }; |
| | | }, |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]ç©ºæ°æ®å¾view模å |
| | | import u from '.././z-paging-utils' |
| | | |
| | | export default { |
| | | props: { |
| | | // æ¯å¦å¼ºå¶éèç©ºæ°æ®å¾ï¼é»è®¤ä¸ºå¦ |
| | | hideEmptyView: { |
| | | type: Boolean, |
| | | default: u.gc('hideEmptyView', false) |
| | | }, |
| | | // ç©ºæ°æ®å¾æè¿°æåï¼é»è®¤ä¸ºâæ²¡ææ°æ®å¦~â |
| | | emptyViewText: { |
| | | type: [String, Object], |
| | | default: u.gc('emptyViewText', null) |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºç©ºæ°æ®å¾éæ°å è½½æé®(æ æ°æ®æ¶)ï¼é»è®¤ä¸ºå¦ |
| | | showEmptyViewReload: { |
| | | type: Boolean, |
| | | default: u.gc('showEmptyViewReload', false) |
| | | }, |
| | | // å è½½å¤±è´¥æ¶æ¯å¦æ¾ç¤ºç©ºæ°æ®å¾éæ°å è½½æé®ï¼é»è®¤ä¸ºæ¯ |
| | | showEmptyViewReloadWhenError: { |
| | | type: Boolean, |
| | | default: u.gc('showEmptyViewReloadWhenError', true) |
| | | }, |
| | | // ç©ºæ°æ®å¾ç¹å»éæ°å è½½æåï¼é»è®¤ä¸ºâéæ°å è½½â |
| | | emptyViewReloadText: { |
| | | type: [String, Object], |
| | | default: u.gc('emptyViewReloadText', null) |
| | | }, |
| | | // ç©ºæ°æ®å¾å¾çï¼é»è®¤ä½¿ç¨z-pagingå
ç½®çå¾ç |
| | | emptyViewImg: { |
| | | type: String, |
| | | default: u.gc('emptyViewImg', '') |
| | | }, |
| | | // ç©ºæ°æ®å¾âå 载失败âæè¿°æåï¼é»è®¤ä¸ºâ徿±æï¼å 载失败â |
| | | emptyViewErrorText: { |
| | | type: [String, Object], |
| | | default: u.gc('emptyViewErrorText', null) |
| | | }, |
| | | // ç©ºæ°æ®å¾âå 载失败âå¾çï¼é»è®¤ä½¿ç¨z-pagingå
ç½®çå¾ç |
| | | emptyViewErrorImg: { |
| | | type: String, |
| | | default: u.gc('emptyViewErrorImg', '') |
| | | }, |
| | | // ç©ºæ°æ®å¾æ ·å¼ |
| | | emptyViewStyle: { |
| | | type: Object, |
| | | default: u.gc('emptyViewStyle', {}) |
| | | }, |
| | | // ç©ºæ°æ®å¾å®¹å¨æ ·å¼ |
| | | emptyViewSuperStyle: { |
| | | type: Object, |
| | | default: u.gc('emptyViewSuperStyle', {}) |
| | | }, |
| | | // ç©ºæ°æ®å¾imgæ ·å¼ |
| | | emptyViewImgStyle: { |
| | | type: Object, |
| | | default: u.gc('emptyViewImgStyle', {}) |
| | | }, |
| | | // ç©ºæ°æ®å¾æè¿°æåæ ·å¼ |
| | | emptyViewTitleStyle: { |
| | | type: Object, |
| | | default: u.gc('emptyViewTitleStyle', {}) |
| | | }, |
| | | // ç©ºæ°æ®å¾éæ°å è½½æé®æ ·å¼ |
| | | emptyViewReloadStyle: { |
| | | type: Object, |
| | | default: u.gc('emptyViewReloadStyle', {}) |
| | | }, |
| | | // ç©ºæ°æ®å¾çæ¯å¦éºæ»¡z-pagingï¼é»è®¤ä¸ºå¦ï¼å³å¡«å
满z-pagingå
å表(æ»å¨åºå)é¨åãè¥è®¾ç½®ä¸ºå¦ï¼åä¸ºå¡«éºæ»¡æ´ä¸ªz-paging |
| | | emptyViewFixed: { |
| | | type: Boolean, |
| | | default: u.gc('emptyViewFixed', false) |
| | | }, |
| | | // ç©ºæ°æ®å¾çæ¯å¦åç´å±
ä¸ï¼é»è®¤ä¸ºæ¯ï¼è¥è®¾ç½®ä¸ºå¦å³ä¸ºä»ç©ºæ°æ®å®¹å¨é¡¶é¨å¼å§æ¾ç¤ºãemptyViewFixed为falseæ¶ææ |
| | | emptyViewCenter: { |
| | | type: Boolean, |
| | | default: u.gc('emptyViewCenter', true) |
| | | }, |
| | | // å è½½ä¸æ¶æ¯å¦èªå¨éèç©ºæ°æ®å¾ï¼é»è®¤ä¸ºæ¯ |
| | | autoHideEmptyViewWhenLoading: { |
| | | type: Boolean, |
| | | default: u.gc('autoHideEmptyViewWhenLoading', true) |
| | | }, |
| | | // ç¨æ·ä¸æå表触å䏿巿°å è½½ä¸æ¶æ¯å¦èªå¨éèç©ºæ°æ®å¾ï¼é»è®¤ä¸ºæ¯ |
| | | autoHideEmptyViewWhenPull: { |
| | | type: Boolean, |
| | | default: u.gc('autoHideEmptyViewWhenPull', true) |
| | | }, |
| | | // ç©ºæ°æ®viewçz-indexï¼é»è®¤ä¸º9 |
| | | emptyViewZIndex: { |
| | | type: Number, |
| | | default: u.gc('emptyViewZIndex', 9) |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | customerEmptyViewErrorText: '' |
| | | } |
| | | }, |
| | | computed: { |
| | | finalEmptyViewImg() { |
| | | return this.isLoadFailed ? this.emptyViewErrorImg : this.emptyViewImg; |
| | | }, |
| | | finalShowEmptyViewReload() { |
| | | return this.isLoadFailed ? this.showEmptyViewReloadWhenError : this.showEmptyViewReload; |
| | | }, |
| | | // æ¯å¦å±ç¤ºç©ºæ°æ®å¾ |
| | | showEmpty() { |
| | | if (this.refresherOnly || this.hideEmptyView || this.realTotalData.length) return false; |
| | | if (this.autoHideEmptyViewWhenLoading) { |
| | | if (this.isAddedData && !this.firstPageLoaded && !this.loading) return true; |
| | | } else { |
| | | return true; |
| | | } |
| | | return !this.autoHideEmptyViewWhenPull && !this.isUserReload; |
| | | }, |
| | | }, |
| | | methods: { |
| | | // ç¹å»äºç©ºæ°æ®viewéæ°å è½½æé® |
| | | _emptyViewReload() { |
| | | let callbacked = false; |
| | | this.$emit('emptyViewReload', reload => { |
| | | if (reload === undefined || reload === true) { |
| | | this.fromEmptyViewReload = true; |
| | | this.reload().catch(() => {}); |
| | | } |
| | | callbacked = true; |
| | | }); |
| | | // å¦æç¨æ·æ²¡æç¦æ¢é»è®¤çç¹å»éæ°å è½½å·æ°å表äºä»¶ï¼å触ååè¡¨éæ°å·æ° |
| | | this.$nextTick(() => { |
| | | if (!callbacked) { |
| | | this.fromEmptyViewReload = true; |
| | | this.reload().catch(() => {}); |
| | | } |
| | | }) |
| | | }, |
| | | // ç¹å»äºç©ºæ°æ®view |
| | | _emptyViewClick() { |
| | | this.$emit('emptyViewClick'); |
| | | }, |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]i18n模å |
| | | import { initVueI18n } from '@dcloudio/uni-i18n' |
| | | import messages from '../../i18n/index.js' |
| | | const { t } = initVueI18n(messages) |
| | | |
| | | import u from '.././z-paging-utils' |
| | | import c from '.././z-paging-constant' |
| | | import interceptor from '../z-paging-interceptor' |
| | | |
| | | export default { |
| | | computed: { |
| | | finalLanguage() { |
| | | try { |
| | | const local = uni.getLocale(); |
| | | const language = this.systemInfo.appLanguage; |
| | | return local === 'auto' ? interceptor._handleLanguage2Local(language, this._language2Local(language)) : local; |
| | | } catch (e) { |
| | | // 妿è·åç³»ç»æ¬å°è¯è¨å¼å¸¸ï¼åé»è®¤è¿å䏿ï¼uni.getLocaleå¨é¨åä½çæ¬HXæè
cliä¸å¯è½æ¥æ¾ä¸å°çé®é¢ |
| | | return 'zh-Hans'; |
| | | } |
| | | }, |
| | | // æç»ç䏿巿°é»è®¤ç¶æçæå |
| | | finalRefresherDefaultText() { |
| | | return this._getI18nText('zp.refresher.default', this.refresherDefaultText); |
| | | }, |
| | | // æç»ç䏿巿°ä¸æä¸çæå |
| | | finalRefresherPullingText() { |
| | | return this._getI18nText('zp.refresher.pulling', this.refresherPullingText); |
| | | }, |
| | | // æç»ç䏿巿°ä¸æå |
| | | finalRefresherRefreshingText() { |
| | | return this._getI18nText('zp.refresher.refreshing', this.refresherRefreshingText); |
| | | }, |
| | | // æç»ç䏿巿°å®ææå |
| | | finalRefresherCompleteText() { |
| | | return this._getI18nText('zp.refresher.complete', this.refresherCompleteText); |
| | | }, |
| | | // æç»ç䏿巿°ä¸æ¬¡æ´æ°æ¶é´æå |
| | | finalRefresherUpdateTimeTextMap() { |
| | | return { |
| | | title: t('zp.refresherUpdateTime.title'), |
| | | none: t('zp.refresherUpdateTime.none'), |
| | | today: t('zp.refresherUpdateTime.today'), |
| | | yesterday: t('zp.refresherUpdateTime.yesterday') |
| | | }; |
| | | }, |
| | | // æç»çç»§ç»ä¸æè¿å
¥äºæ¥¼æå |
| | | finalRefresherGoF2Text() { |
| | | return this._getI18nText('zp.refresher.f2', this.refresherGoF2Text); |
| | | }, |
| | | // æç»çåºé¨å è½½æ´å¤é»è®¤ç¶ææå |
| | | finalLoadingMoreDefaultText() { |
| | | return this._getI18nText('zp.loadingMore.default', this.loadingMoreDefaultText); |
| | | }, |
| | | // æç»çåºé¨å è½½æ´å¤å è½½ä¸æå |
| | | finalLoadingMoreLoadingText() { |
| | | return this._getI18nText('zp.loadingMore.loading', this.loadingMoreLoadingText); |
| | | }, |
| | | // æç»çåºé¨å è½½æ´å¤æ²¡ææ´å¤æ°æ®æå |
| | | finalLoadingMoreNoMoreText() { |
| | | return this._getI18nText('zp.loadingMore.noMore', this.loadingMoreNoMoreText); |
| | | }, |
| | | // æç»çåºé¨å è½½æ´å¤å 载失败æå |
| | | finalLoadingMoreFailText() { |
| | | return this._getI18nText('zp.loadingMore.fail', this.loadingMoreFailText); |
| | | }, |
| | | // æç»çç©ºæ°æ®å¾title |
| | | finalEmptyViewText() { |
| | | return this.isLoadFailed ? this.finalEmptyViewErrorText : this._getI18nText('zp.emptyView.title', this.emptyViewText); |
| | | }, |
| | | // æç»çç©ºæ°æ®å¾reload title |
| | | finalEmptyViewReloadText() { |
| | | return this._getI18nText('zp.emptyView.reload', this.emptyViewReloadText); |
| | | }, |
| | | // æç»çç©ºæ°æ®å¾å 载失败æå |
| | | finalEmptyViewErrorText() { |
| | | return this.customerEmptyViewErrorText || this._getI18nText('zp.emptyView.error', this.emptyViewErrorText); |
| | | }, |
| | | // æç»çç³»ç»loading title |
| | | finalSystemLoadingText() { |
| | | return this._getI18nText('zp.systemLoading.title', this.systemLoadingText); |
| | | }, |
| | | }, |
| | | methods: { |
| | | // è·åå½åz-pagingçè¯è¨ |
| | | getLanguage() { |
| | | return this.finalLanguage; |
| | | }, |
| | | // è·åå½é
å转æ¢åçææ¬ |
| | | _getI18nText(key, value) { |
| | | const dataType = Object.prototype.toString.call(value); |
| | | if (dataType === '[object Object]') { |
| | | const nextValue = value[this.finalLanguage]; |
| | | if (nextValue) return nextValue; |
| | | } else if (dataType === '[object String]') { |
| | | return value; |
| | | } |
| | | return t(key); |
| | | }, |
| | | // ç³»ç»language转i18n local |
| | | _language2Local(language) { |
| | | const formatedLanguage = language.toLowerCase().replace(new RegExp('_', ''), '-'); |
| | | if (formatedLanguage.indexOf('zh') !== -1) { |
| | | if (formatedLanguage === 'zh' || formatedLanguage === 'zh-cn' || formatedLanguage.indexOf('zh-hans') !== -1) { |
| | | return 'zh-Hans'; |
| | | } |
| | | return 'zh-Hant'; |
| | | } |
| | | if (formatedLanguage.indexOf('en') !== -1) return 'en'; |
| | | return language; |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]æ»å¨å°åºé¨å è½½æ´å¤æ¨¡å |
| | | import u from '.././z-paging-utils' |
| | | import Enum from '.././z-paging-enum' |
| | | |
| | | export default { |
| | | props: { |
| | | // èªå®ä¹åºé¨å è½½æ´å¤æ ·å¼ |
| | | loadingMoreCustomStyle: { |
| | | type: Object, |
| | | default: u.gc('loadingMoreCustomStyle', {}) |
| | | }, |
| | | // èªå®ä¹åºé¨å è½½æ´å¤æåæ ·å¼ |
| | | loadingMoreTitleCustomStyle: { |
| | | type: Object, |
| | | default: u.gc('loadingMoreTitleCustomStyle', {}) |
| | | }, |
| | | // èªå®ä¹åºé¨å è½½æ´å¤å è½½ä¸å¨ç»æ ·å¼ |
| | | loadingMoreLoadingIconCustomStyle: { |
| | | type: Object, |
| | | default: u.gc('loadingMoreLoadingIconCustomStyle', {}) |
| | | }, |
| | | // èªå®ä¹åºé¨å è½½æ´å¤å è½½ä¸å¨ç»å¾æ ç±»åï¼å¯éfloweræcircleï¼é»è®¤ä¸ºflower |
| | | loadingMoreLoadingIconType: { |
| | | type: String, |
| | | default: u.gc('loadingMoreLoadingIconType', 'flower') |
| | | }, |
| | | // èªå®ä¹åºé¨å è½½æ´å¤å è½½ä¸å¨ç»å¾æ å¾ç |
| | | loadingMoreLoadingIconCustomImage: { |
| | | type: String, |
| | | default: u.gc('loadingMoreLoadingIconCustomImage', '') |
| | | }, |
| | | // åºé¨å è½½æ´å¤å è½½ä¸viewæ¯å¦å±ç¤ºæè½¬å¨ç»ï¼é»è®¤ä¸ºæ¯ |
| | | loadingMoreLoadingAnimated: { |
| | | type: Boolean, |
| | | default: u.gc('loadingMoreLoadingAnimated', true) |
| | | }, |
| | | // æ¯å¦å¯ç¨å è½½æ´å¤æ°æ®(嫿»å¨å°åºé¨å è½½æ´å¤æ°æ®åç¹å»å è½½æ´å¤æ°æ®)ï¼é»è®¤ä¸ºæ¯ |
| | | loadingMoreEnabled: { |
| | | type: Boolean, |
| | | default: u.gc('loadingMoreEnabled', true) |
| | | }, |
| | | // æ¯å¦å¯ç¨æ»å¨å°åºé¨å è½½æ´å¤æ°æ®ï¼é»è®¤ä¸ºæ¯ |
| | | toBottomLoadingMoreEnabled: { |
| | | type: Boolean, |
| | | default: u.gc('toBottomLoadingMoreEnabled', true) |
| | | }, |
| | | // æ»å¨å°åºé¨ç¶æä¸ºé»è®¤ç¶ææ¶ï¼ä»¥å è½½ä¸çç¶æå±ç¤ºï¼é»è®¤ä¸ºå¦ãè¥è®¾ç½®ä¸ºæ¯ï¼å¯é¿å
æ»å¨å°åºé¨çå°é»è®¤ç¶æç¶åç«å»å为å è½½ä¸ç¶æçé®é¢ï¼ä½å页æ°éæªè¶
è¿ä¸å±æ¶ï¼ä¸ä¼æ¾ç¤ºãç¹å»å è½½æ´å¤ã |
| | | loadingMoreDefaultAsLoading: { |
| | | type: Boolean, |
| | | default: u.gc('loadingMoreDefaultAsLoading', false) |
| | | }, |
| | | // æ»å¨å°åºé¨"é»è®¤"æåï¼é»è®¤ä¸ºãç¹å»å è½½æ´å¤ã |
| | | loadingMoreDefaultText: { |
| | | type: [String, Object], |
| | | default: u.gc('loadingMoreDefaultText', null) |
| | | }, |
| | | // æ»å¨å°åºé¨"å è½½ä¸"æåï¼é»è®¤ä¸ºãæ£å¨å è½½...ã |
| | | loadingMoreLoadingText: { |
| | | type: [String, Object], |
| | | default: u.gc('loadingMoreLoadingText', null) |
| | | }, |
| | | // æ»å¨å°åºé¨"æ²¡ææ´å¤"æåï¼é»è®¤ä¸ºãæ²¡ææ´å¤äºã |
| | | loadingMoreNoMoreText: { |
| | | type: [String, Object], |
| | | default: u.gc('loadingMoreNoMoreText', null) |
| | | }, |
| | | // æ»å¨å°åºé¨"å 载失败"æåï¼é»è®¤ä¸ºãå 载失败ï¼ç¹å»éæ°å è½½ã |
| | | loadingMoreFailText: { |
| | | type: [String, Object], |
| | | default: u.gc('loadingMoreFailText', null) |
| | | }, |
| | | // 彿²¡ææ´å¤æ°æ®ä¸å页å
容æªè¶
åºz-pagingæ¶æ¯å¦éèæ²¡ææ´å¤æ°æ®çviewï¼é»è®¤ä¸ºå¦ |
| | | hideNoMoreInside: { |
| | | type: Boolean, |
| | | default: u.gc('hideNoMoreInside', false) |
| | | }, |
| | | // 彿²¡ææ´å¤æ°æ®ä¸å页æ°ç»é¿åº¦å°äºè¿ä¸ªå¼æ¶ï¼éèæ²¡ææ´å¤æ°æ®çviewï¼é»è®¤ä¸º0ï¼ä»£è¡¨ä¸éå¶ã |
| | | hideNoMoreByLimit: { |
| | | type: Number, |
| | | default: u.gc('hideNoMoreByLimit', 0) |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºé»è®¤çå è½½æ´å¤textï¼é»è®¤ä¸ºæ¯ |
| | | showDefaultLoadingMoreText: { |
| | | type: Boolean, |
| | | default: u.gc('showDefaultLoadingMoreText', true) |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºæ²¡ææ´å¤æ°æ®çview |
| | | showLoadingMoreNoMoreView: { |
| | | type: Boolean, |
| | | default: u.gc('showLoadingMoreNoMoreView', true) |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºæ²¡ææ´å¤æ°æ®çåå²çº¿ï¼é»è®¤ä¸ºæ¯ |
| | | showLoadingMoreNoMoreLine: { |
| | | type: Boolean, |
| | | default: u.gc('showLoadingMoreNoMoreLine', true) |
| | | }, |
| | | // èªå®ä¹åºé¨æ²¡ææ´å¤æ°æ®çåå²çº¿æ ·å¼ |
| | | loadingMoreNoMoreLineCustomStyle: { |
| | | type: Object, |
| | | default: u.gc('loadingMoreNoMoreLineCustomStyle', {}) |
| | | }, |
| | | // å½åé¡µæªæ»¡ä¸å±æ¶ï¼æ¯å¦èªå¨å è½½æ´å¤ï¼é»è®¤ä¸ºå¦(nvueæ æ) |
| | | insideMore: { |
| | | type: Boolean, |
| | | default: u.gc('insideMore', false) |
| | | }, |
| | | // è·åºé¨/å³è¾¹å¤è¿æ¶ï¼åä½pxï¼ï¼è§¦å scrolltolower äºä»¶ï¼é»è®¤ä¸º100rpx |
| | | lowerThreshold: { |
| | | type: [Number, String], |
| | | default: u.gc('lowerThreshold', '100rpx') |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | M: Enum.More, |
| | | // åºé¨å è½½æ´å¤ç¶æ |
| | | loadingStatus: Enum.More.Default, |
| | | // 卿¸²æä¹åçåºé¨å è½½æ´å¤ç¶æ |
| | | loadingStatusAfterRender: Enum.More.Default, |
| | | // åºé¨å è½½æ´å¤æ¶é´æ³ |
| | | loadingMoreTimeStamp: 0, |
| | | // åºé¨å è½½æ´å¤slot |
| | | loadingMoreDefaultSlot: null, |
| | | // æ¯å¦å±ç¤ºåºé¨å è½½æ´å¤ |
| | | showLoadingMore: false, |
| | | // æ¯å¦æ¯å¼åè
èªå®ä¹çå è½½æ´å¤ï¼-1代表交ç±z-pagingèªè¡å¤æï¼1ä»£è¡¨æ²¡ææ´å¤äºï¼0ä»£è¡¨è¿ææ´å¤æ°æ® |
| | | customNoMore: -1, |
| | | } |
| | | }, |
| | | computed: { |
| | | // åºé¨å è½½æ´å¤é
ç½® |
| | | zLoadMoreConfig() { |
| | | return { |
| | | status: this.loadingStatusAfterRender, |
| | | defaultAsLoading: this.loadingMoreDefaultAsLoading || (this.useChatRecordMode && this.chatLoadingMoreDefaultAsLoading), |
| | | defaultThemeStyle: this.finalLoadingMoreThemeStyle, |
| | | customStyle: this.loadingMoreCustomStyle, |
| | | titleCustomStyle: this.loadingMoreTitleCustomStyle, |
| | | iconCustomStyle: this.loadingMoreLoadingIconCustomStyle, |
| | | loadingIconType: this.loadingMoreLoadingIconType, |
| | | loadingIconCustomImage: this.loadingMoreLoadingIconCustomImage, |
| | | loadingAnimated: this.loadingMoreLoadingAnimated, |
| | | showNoMoreLine: this.showLoadingMoreNoMoreLine, |
| | | noMoreLineCustomStyle: this.loadingMoreNoMoreLineCustomStyle, |
| | | defaultText: this.finalLoadingMoreDefaultText, |
| | | loadingText: this.finalLoadingMoreLoadingText, |
| | | noMoreText: this.finalLoadingMoreNoMoreText, |
| | | failText: this.finalLoadingMoreFailText, |
| | | hideContent: !this.loadingMoreDefaultAsLoading && this.listRendering, |
| | | unit: this.unit, |
| | | isChat: this.useChatRecordMode, |
| | | chatDefaultAsLoading: this.chatLoadingMoreDefaultAsLoading |
| | | }; |
| | | }, |
| | | // æç»çåºé¨å è½½æ´å¤ä¸»é¢ |
| | | finalLoadingMoreThemeStyle() { |
| | | return this.loadingMoreThemeStyle.length ? this.loadingMoreThemeStyle : this.defaultThemeStyle; |
| | | }, |
| | | // æç»çåºé¨å è½½æ´å¤è§¦åéå¼ |
| | | finalLowerThreshold() { |
| | | return u.convertToPx(this.lowerThreshold); |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºé»è®¤ç¶æä¸çåºé¨å è½½æ´å¤ |
| | | showLoadingMoreDefault() { |
| | | return this._showLoadingMore('Default'); |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºå è½½ä¸ç¶æä¸çåºé¨å è½½æ´å¤ |
| | | showLoadingMoreLoading() { |
| | | return this._showLoadingMore('Loading'); |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºæ²¡ææ´å¤äºç¶æä¸çåºé¨å è½½æ´å¤ |
| | | showLoadingMoreNoMore() { |
| | | return this._showLoadingMore('NoMore'); |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºå è½½å¤±è´¥ç¶æä¸çåºé¨å è½½æ´å¤ |
| | | showLoadingMoreFail() { |
| | | return this._showLoadingMore('Fail'); |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºèªå®ä¹ç¶æä¸çåºé¨å è½½æ´å¤ |
| | | showLoadingMoreCustom() { |
| | | return this._showLoadingMore('Custom'); |
| | | }, |
| | | // åºé¨å è½½æ´å¤åºå®é«åº¦ |
| | | loadingMoreFixedHeight() { |
| | | return u.addUnit('80rpx', this.unit); |
| | | }, |
| | | }, |
| | | methods: { |
| | | // 页颿»å¨å°åºé¨æ¶éç¥z-pagingè¿è¡è¿ä¸æ¥å¤ç |
| | | pageReachBottom() { |
| | | !this.useChatRecordMode && this.toBottomLoadingMoreEnabled && this._onLoadingMore('toBottom'); |
| | | }, |
| | | // æå¨è§¦å䏿å è½½æ´å¤(éå¿
é¡»ï¼å¯ä¾æ®å
·ä½éæ±ä½¿ç¨) |
| | | doLoadMore(type) { |
| | | this._onLoadingMore(type); |
| | | }, |
| | | // éè¿@scrolläºä»¶æ£æµæ¯å¦æ»å¨å°äºåºé¨(é¡ºå¸¦æ£æµä¸æ¯å¦æ»å¨å°äºé¡¶é¨) |
| | | _checkScrolledToBottom(scrollDiff, checked = false) { |
| | | // 妿å½åscroll-viewé«åº¦æªè·åï¼åè·åå
¶é«åº¦ |
| | | if (this.cacheScrollNodeHeight === -1) { |
| | | // è·åå½åscroll-viewé«åº¦ |
| | | this._getNodeClientRect('.zp-scroll-view').then((res) => { |
| | | if (res) { |
| | | const scrollNodeHeight = res[0].height; |
| | | // ç¼åå½åscroll-viewé«åº¦ï¼å¦æè·åè¿äºä¸åè·å |
| | | this.cacheScrollNodeHeight = scrollNodeHeight; |
| | | // // scrollDiff - this.cacheScrollNodeHeight = å½åæ»å¨åºåçé¡¶é¨ä¸å
容åºé¨çè·ç¦» - scroll-viewé«åº¦ = å½åæ»å¨åºåçåºé¨ä¸å
容åºé¨çè·ç¦»(ä¹å°±æ¯æç»çä¸åºé¨çè·ç¦») |
| | | if (scrollDiff - scrollNodeHeight <= this.finalLowerThreshold) { |
| | | // 妿ä¸åºé¨çè·ç¦»å°äºéå¼ï¼åå¤æä¸ºæ»å¨å°äºåºé¨ï¼è§¦åæ»å¨å°åºé¨äºä»¶ |
| | | this._onLoadingMore('toBottom'); |
| | | } |
| | | } |
| | | }); |
| | | } else { |
| | | // scrollDiff - this.cacheScrollNodeHeight = å½åæ»å¨åºåçé¡¶é¨ä¸å
容åºé¨çè·ç¦» - scroll-viewé«åº¦ = å½åæ»å¨åºåçåºé¨ä¸å
容åºé¨çè·ç¦»(ä¹å°±æ¯æç»çä¸åºé¨çè·ç¦») |
| | | if (scrollDiff - this.cacheScrollNodeHeight <= this.finalLowerThreshold) { |
| | | // 妿ä¸åºé¨çè·ç¦»å°äºéå¼ï¼åå¤æä¸ºæ»å¨å°äºåºé¨ï¼è§¦åæ»å¨å°åºé¨äºä»¶ |
| | | this._onLoadingMore('toBottom'); |
| | | } else if (scrollDiff - this.cacheScrollNodeHeight <= 500 && !checked) { |
| | | // 妿ä¸åºé¨çè·ç¦»å°äº500pxï¼åè·åå½åæ»å¨çä½ç½®ï¼å»¶è¿150毫ç§éå¤ä¸è¿°æ¥éª¤åæ¬¡æ£æµ(é¿å
@scrollè§¦åæ¶è·åçscrollTop䏿£ç¡®å¯¼è´çå
¶ä»é®é¢ï¼æ¤æ¶è·åçscrollTopä¸ä¸å®å¯ä¿¡)ã鲿¢å 为é¨åæ§è½è¾å·®å®å设å¤@scrolléæ ·çè¿ä½å¯¼è´çæ»å¨å°åºé¨ä½æ¯ä¾ç¶æ²¡æè§¦åçé®é¢ |
| | | u.delay(() => { |
| | | this._getNodeClientRect('.zp-scroll-view', true, true).then((res) => { |
| | | if (res) { |
| | | this.oldScrollTop = res[0].scrollTop; |
| | | const newScrollDiff = res[0].scrollHeight - this.oldScrollTop; |
| | | this._checkScrolledToBottom(newScrollDiff, true); |
| | | } |
| | | }) |
| | | }, 150, 'checkScrolledToBottomDelay') |
| | | } |
| | | // æ£æµä¸ä¸æ¯å¦å·²ç»æ»å¨å°äºé¡¶é¨äºï¼å 为å¨å®å䏿»å¨å°é¡¶é¨æ¶scrollTopä¸ä¸å®ä¸º0(åæ»å¨å°åºé¨ä¸æ ·çåå )ï¼æä»¥éè¦å¨scrollTopå°äº150pxæ¶ï¼éè¿è·å.zp-scroll-viewçscrollTopå夿ä¸ä¸ |
| | | if (this.oldScrollTop <= 150 && this.oldScrollTop !== 0) { |
| | | u.delay(() => { |
| | | // è¿éå夿ä¸ä¸æ¯å¦ç¡®å®å·²ç»æ»å¨å°é¡¶é¨äºï¼å¦æå·²ç»æ»å¨å°é¡¶é¨äºï¼åä¸ç¨å夿äºï¼åæ¬¡å¤æçåå æ¯å¯è½150毫ç§ä¹åoldScrollTopææ¯0 |
| | | if (this.oldScrollTop !== 0) { |
| | | this._getNodeClientRect('.zp-scroll-view', true, true).then((res) => { |
| | | // 妿150毫ç§å.zp-scroll-viewçscrollTop为0ï¼åè®¤ä¸ºå·²ç»æ»å¨å°äºé¡¶é¨äº |
| | | if (res && res[0].scrollTop === 0 && this.oldScrollTop !== 0) { |
| | | this._onScrollToUpper(); |
| | | } |
| | | }) |
| | | } |
| | | }, 150, 'checkScrolledToTopDelay') |
| | | } |
| | | } |
| | | }, |
| | | // 触åå è½½æ´å¤æ¶è°ç¨,from:toBottom-æ»å¨å°åºé¨è§¦åï¼click-ç¹å»å è½½æ´å¤è§¦å |
| | | _onLoadingMore(from = 'click') { |
| | | // 妿æ¯ios并䏿¯æ»å¨å°åºé¨çï¼å卿»å¨å°åºé¨æ¶åå°è¯å°åè¡¨è®¾ç½®ä¸ºç¦æ¢æ»å¨ç¶å设置为å
许æ»å¨ï¼ä»¥ç¦æ¢åºé¨bounceçææ |
| | | if (this.isIos && from === 'toBottom' && !this.scrollToBottomBounceEnabled && this.scrollEnable) { |
| | | this.scrollEnable = false; |
| | | this.$nextTick(() => { |
| | | this.scrollEnable = true; |
| | | }) |
| | | } |
| | | // emit scrolltolower |
| | | this._emitScrollEvent('scrolltolower'); |
| | | // 妿æ¯åªä½¿ç¨ä¸æå·æ° æè
ç¦ç¨åºé¨å è½½æ´å¤ æè
åºé¨å è½½æ´å¤ä¸æ¯é»è®¤ç¶ææå è½½å¤±è´¥ç¶æ æè
æ¯å è½½ä¸ç¶æ æè
ç©ºæ°æ®å¾å·²ç»å±ç¤ºäºï¼åreturnï¼ä¸è§¦åå
é¨å è½½æ´å¤é»è¾ |
| | | if (this.refresherOnly || !this.loadingMoreEnabled || !(this.loadingStatus === Enum.More.Default || this.loadingStatus === Enum.More.Fail) || this.loading || this.showEmpty) return; |
| | | // #ifdef MP-WEIXIN |
| | | if (!this.isIos && !this.refresherOnly && !this.usePageScroll) { |
| | | const currentTimestamp = u.getTime(); |
| | | // å¨éioså¹³å°+scroll-viewä¸èæµå¤ç |
| | | if (this.loadingMoreTimeStamp > 0 && currentTimestamp - this.loadingMoreTimeStamp < 100) { |
| | | this.loadingMoreTimeStamp = 0; |
| | | return; |
| | | } |
| | | } |
| | | // #endif |
| | | // å¤çå è½½æ´å¤æ°æ® |
| | | this._doLoadingMore(); |
| | | }, |
| | | // å¤çå¼å§å è½½æ´å¤ |
| | | _doLoadingMore() { |
| | | if (this.pageNo >= this.defaultPageNo && this.loadingStatus !== Enum.More.NoMore) { |
| | | this.pageNo ++; |
| | | this._startLoading(false); |
| | | if (this.isLocalPaging) { |
| | | // å¦ææ¯æ¬å°å页ï¼åå¨ç»ä»¶å
é¨å¯¹æ°æ®è¿è¡å页å¤çï¼ä¸è§¦å@queryäºä»¶ |
| | | this._localPagingQueryList(this.pageNo, this.defaultPageSize, this.localPagingLoadingTime, res => { |
| | | this.completeByTotal(res, this.totalLocalPagingList.length); |
| | | this.queryFrom = Enum.QueryFrom.LoadMore; |
| | | }) |
| | | } else { |
| | | // emit @queryç¸å
³å è½½æ´å¤äºä»¶ |
| | | this._emitQuery(this.pageNo, this.defaultPageSize, Enum.QueryFrom.LoadMore); |
| | | this._callMyParentQuery(); |
| | | } |
| | | // 设置å½åå è½½ç¶æä¸ºåºé¨å è½½æ´å¤ç¶æ |
| | | this.loadingType = Enum.LoadingType.LoadMore; |
| | | } |
| | | }, |
| | | // (é¢å¤ç)夿彿²¡ææ´å¤æ°æ®ä¸å页å
容æªè¶
åºz-pagingæ¶æ¯å¦æ¾ç¤ºæ²¡ææ´å¤æ°æ®çview |
| | | _preCheckShowNoMoreInside(newVal, scrollViewNode, pagingContainerNode) { |
| | | if (this.loadingStatus === Enum.More.NoMore && this.hideNoMoreByLimit > 0 && newVal.length) { |
| | | this.showLoadingMore = newVal.length > this.hideNoMoreByLimit; |
| | | } else if ((this.loadingStatus === Enum.More.NoMore && this.hideNoMoreInside && newVal.length) || (this.insideMore && this.insideOfPaging !== false && newVal.length)) { |
| | | this.$nextTick(() => { |
| | | this._checkShowNoMoreInside(newVal, scrollViewNode, pagingContainerNode); |
| | | }) |
| | | if (this.insideMore && this.insideOfPaging !== false && newVal.length) { |
| | | this.showLoadingMore = newVal.length; |
| | | } |
| | | } else { |
| | | this.showLoadingMore = newVal.length; |
| | | } |
| | | }, |
| | | // 夿彿²¡ææ´å¤æ°æ®ä¸å页å
容æªè¶
åºz-pagingæ¶æ¯å¦æ¾ç¤ºæ²¡ææ´å¤æ°æ®çview |
| | | async _checkShowNoMoreInside(totalData, oldScrollViewNode, oldPagingContainerNode) { |
| | | try { |
| | | const scrollViewNode = oldScrollViewNode || await this._getNodeClientRect('.zp-scroll-view'); |
| | | // å¨é¡µé¢æ»å¨æ¨¡å¼ä¸ |
| | | if (this.usePageScroll) { |
| | | if (scrollViewNode) { |
| | | // è·åæ»å¨å
容æ»é«åº¦ |
| | | const scrollViewTotalH = scrollViewNode[0].top + scrollViewNode[0].height; |
| | | // 妿æ»å¨å
容æ»é«åº¦å°äºçªå£é«åº¦ï¼å认为å
容æªè¶
åºz-paging |
| | | this.insideOfPaging = scrollViewTotalH < this.windowHeight; |
| | | // 妿éè¦æ²¡ææ´å¤æ°æ®æ¶ï¼éèåºé¨å è½½æ´å¤viewï¼å¹¶ä¸å
容æªè¶
è¿z-pagingï¼åéèåºé¨å è½½æ´å¤ |
| | | if (this.hideNoMoreInside) { |
| | | this.showLoadingMore = !this.insideOfPaging; |
| | | } |
| | | // 妿éè¦å
容æªè¶
è¿z-pagingæ¶èªå¨å è½½æ´å¤ï¼å触åå è½½æ´å¤ |
| | | this._updateInsideOfPaging(); |
| | | } |
| | | } else { |
| | | // å¨scroll-viewæ»å¨æ¨¡å¼ä¸ |
| | | const pagingContainerNode = oldPagingContainerNode || await this._getNodeClientRect('.zp-paging-container-content'); |
| | | // è·åæ»å¨å
容æ»é«åº¦ |
| | | const pagingContainerH = pagingContainerNode ? pagingContainerNode[0].height : 0; |
| | | // è·åz-pagingå
ç½®scroll-viewé«åº¦ |
| | | const scrollViewH = scrollViewNode ? scrollViewNode[0].height : 0; |
| | | // 妿æ»å¨å
容æ»é«åº¦å°äºz-pagingå
ç½®scroll-viewé«åº¦ï¼å认为å
容æªè¶
åºz-paging |
| | | this.insideOfPaging = pagingContainerH < scrollViewH; |
| | | if (this.hideNoMoreInside) { |
| | | this.showLoadingMore = !this.insideOfPaging; |
| | | } |
| | | // 妿éè¦å
容æªè¶
è¿z-pagingæ¶èªå¨å è½½æ´å¤ï¼å触åå è½½æ´å¤ |
| | | this._updateInsideOfPaging(); |
| | | } |
| | | } catch (e) { |
| | | // 妿åçäºå¼å¸¸ï¼å¤ætotalDataæ°ç»é¿åº¦ä¸º0ï¼å认为å
容æªè¶
åºz-paging |
| | | this.insideOfPaging = !totalData.length; |
| | | if (this.hideNoMoreInside) { |
| | | this.showLoadingMore = !this.insideOfPaging; |
| | | } |
| | | // 妿éè¦å
容æªè¶
è¿z-pagingæ¶èªå¨å è½½æ´å¤ï¼å触åå è½½æ´å¤ |
| | | this._updateInsideOfPaging(); |
| | | } |
| | | }, |
| | | // æ¯å¦è¦å±ç¤ºä¸æå è½½æ´å¤view |
| | | _showLoadingMore(type) { |
| | | if (!this.showLoadingMoreWhenReload && (!(this.loadingStatus === Enum.More.Default ? this.nShowBottom : true) || !this.realTotalData.length)) return false; |
| | | if (((!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== Enum.More.Loading) && !this.showLoadingMore) || |
| | | (!this.loadingMoreEnabled && (!this.showLoadingMoreWhenReload || this.isUserPullDown || this.loadingStatus !== Enum.More.Loading)) || this.refresherOnly) { |
| | | return false; |
| | | } |
| | | if (this.useChatRecordMode && type !== 'Loading') return false; |
| | | if (!this.zSlots) return false; |
| | | if (type === 'Custom') { |
| | | return this.showDefaultLoadingMoreText && !(this.loadingStatus === Enum.More.NoMore && !this.showLoadingMoreNoMoreView); |
| | | } |
| | | const res = this.loadingStatus === Enum.More[type] && this.zSlots[`loadingMore${type}`] && (type === 'NoMore' ? this.showLoadingMoreNoMoreView : true); |
| | | if (res) { |
| | | // #ifdef APP-NVUE |
| | | if (!this.isIos) { |
| | | this.nLoadingMoreFixedHeight = false; |
| | | } |
| | | // #endif |
| | | } |
| | | return res; |
| | | }, |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]loadingç¸å
³æ¨¡å |
| | | import u from '.././z-paging-utils' |
| | | import Enum from '.././z-paging-enum' |
| | | |
| | | export default { |
| | | props: { |
| | | // ç¬¬ä¸æ¬¡å è½½åèªå¨éèloading slotï¼é»è®¤ä¸ºæ¯ |
| | | autoHideLoadingAfterFirstLoaded: { |
| | | type: Boolean, |
| | | default: u.gc('autoHideLoadingAfterFirstLoaded', true) |
| | | }, |
| | | // loading slotæ¯å¦éºæ»¡å±å¹å¹¶åºå®ï¼é»è®¤ä¸ºå¦ |
| | | loadingFullFixed: { |
| | | type: Boolean, |
| | | default: u.gc('loadingFullFixed', false) |
| | | }, |
| | | // æ¯å¦èªå¨æ¾ç¤ºç³»ç»Loadingï¼å³uni.showLoadingï¼è¥å¼å¯åå°å¨å·æ°å表æ¶(è°ç¨reloadãrefreshæ¶)æ¾ç¤ºï¼ä¸æå·æ°åæ»å¨å°åºé¨å è½½æ´å¤ä¸ä¼æ¾ç¤ºï¼é»è®¤ä¸ºfalseã |
| | | autoShowSystemLoading: { |
| | | type: Boolean, |
| | | default: u.gc('autoShowSystemLoading', false) |
| | | }, |
| | | // æ¾ç¤ºç³»ç»Loadingæ¶æ¯å¦æ¾ç¤ºéæèå±ï¼é²æ¢è§¦æ¸ç©¿éï¼é»è®¤ä¸ºæ¯(H5ãAppã微信å°ç¨åºãç¾åº¦å°ç¨åºææ) |
| | | systemLoadingMask: { |
| | | type: Boolean, |
| | | default: u.gc('systemLoadingMask', true) |
| | | }, |
| | | // æ¾ç¤ºç³»ç»Loadingæ¶æ¾ç¤ºçæåï¼é»è®¤ä¸º"å è½½ä¸" |
| | | systemLoadingText: { |
| | | type: [String, Object], |
| | | default: u.gc('systemLoadingText', null) |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | loading: false, |
| | | loadingForNow: false, |
| | | } |
| | | }, |
| | | watch: { |
| | | // loadingç¶æ |
| | | loadingStatus(newVal) { |
| | | this.$emit('loadingStatusChange', newVal); |
| | | this.$nextTick(() => { |
| | | this.loadingStatusAfterRender = newVal; |
| | | }) |
| | | if (this.useChatRecordMode) { |
| | | if (this.isFirstPage && (newVal === Enum.More.NoMore || newVal === Enum.More.Fail)) { |
| | | this.isFirstPageAndNoMore = true; |
| | | return; |
| | | } |
| | | } |
| | | this.isFirstPageAndNoMore = false; |
| | | }, |
| | | loading(newVal){ |
| | | if (newVal) { |
| | | this.loadingForNow = newVal; |
| | | } |
| | | }, |
| | | }, |
| | | computed: { |
| | | // æ¯å¦æ¾ç¤ºloading |
| | | showLoading() { |
| | | if (this.firstPageLoaded || !this.loading || !this.loadingForNow) return false; |
| | | if (this.finalShowSystemLoading) { |
| | | // æ¾ç¤ºç³»ç»loading |
| | | uni.showLoading({ |
| | | title: this.finalSystemLoadingText, |
| | | mask: this.systemLoadingMask |
| | | }) |
| | | } |
| | | return this.autoHideLoadingAfterFirstLoaded ? (this.fromEmptyViewReload ? true : !this.pagingLoaded) : this.loadingType === Enum.LoadingType.Refresher; |
| | | }, |
| | | // æç»çæ¯å¦æ¾ç¤ºç³»ç»loading |
| | | finalShowSystemLoading() { |
| | | return this.autoShowSystemLoading && this.loadingType === Enum.LoadingType.Refresher; |
| | | } |
| | | }, |
| | | methods: { |
| | | // å¤çå¼å§å è½½æ´å¤ç¶æ |
| | | _startLoading(isReload = false) { |
| | | if ((this.showLoadingMoreWhenReload && !this.isUserPullDown) || !isReload) { |
| | | this.loadingStatus = Enum.More.Loading; |
| | | } |
| | | this.loading = true; |
| | | }, |
| | | // åæ¢ç³»ç»loadingårefresh |
| | | _endSystemLoadingAndRefresh(){ |
| | | this.finalShowSystemLoading && uni.hideLoading(); |
| | | !this.useCustomRefresher && uni.stopPullDownRefresh(); |
| | | // #ifdef APP-NVUE |
| | | this.usePageScroll && uni.stopPullDownRefresh(); |
| | | // #endif |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]nvueç¬æé¨å模å |
| | | import u from '.././z-paging-utils' |
| | | import c from '.././z-paging-constant' |
| | | import Enum from '.././z-paging-enum' |
| | | |
| | | // #ifdef APP-NVUE |
| | | const weexAnimation = weex.requireModule('animation'); |
| | | // #endif |
| | | export default { |
| | | props: { |
| | | // #ifdef APP-NVUE |
| | | // nvueä¸ä¿®æ¹å表类åï¼å¯é弿listãwaterfallåscrollerï¼é»è®¤ä¸ºlist |
| | | nvueListIs: { |
| | | type: String, |
| | | default: u.gc('nvueListIs', 'list') |
| | | }, |
| | | // nvue waterfallé
ç½®ï¼ä»
å¨nvueä¸ä¸nvueListIs=waterfallæ¶ææï¼é
ç½®åæ°è¯¦æ
åè§ï¼https://uniapp.dcloud.io/component/waterfall |
| | | nvueWaterfallConfig: { |
| | | type: Object, |
| | | default: u.gc('nvueWaterfallConfig', {}) |
| | | }, |
| | | // nvue æ§å¶æ¯å¦åå¼¹ææï¼iOS䏿¯æå¨æä¿®æ¹ |
| | | nvueBounce: { |
| | | type: Boolean, |
| | | default: u.gc('nvueBounce', true) |
| | | }, |
| | | // nvueä¸éè¿ä»£ç æ»å¨å°é¡¶é¨/åºé¨æ¶ï¼æ¯å¦å å¿«å¨ç»ææ(æ æ»å¨å¨ç»æ¶æ æ)ï¼é»è®¤ä¸ºå¦ |
| | | nvueFastScroll: { |
| | | type: Boolean, |
| | | default: u.gc('nvueFastScroll', false) |
| | | }, |
| | | // nvueä¸listçid |
| | | nvueListId: { |
| | | type: String, |
| | | default: u.gc('nvueListId', '') |
| | | }, |
| | | // nvueä¸refreshç»ä»¶çæ ·å¼ |
| | | nvueRefresherStyle: { |
| | | type: Object, |
| | | default: u.gc('nvueRefresherStyle', {}) |
| | | }, |
| | | // nvue䏿¯å¦æå页模å¼(类似ç«åswiper)æ¾ç¤ºListï¼é»è®¤ä¸ºfalse |
| | | nvuePagingEnabled: { |
| | | type: Boolean, |
| | | default: u.gc('nvuePagingEnabled', false) |
| | | }, |
| | | // æ¯å¦éènvueå表åºé¨çtagViewï¼æ¤viewç¨äºæ è¯æ»å¨å°åºé¨ä½ç½®ï¼è¥éèåæ»å¨å°åºé¨åè½å°å¤±æï¼å¨nvueä¸å®ç°å¸é¡¶+swiperåè½æ¶éå°æå¤å±z-pagingçæ¤å±æ§è®¾ç½®ä¸ºtrueãé»è®¤ä¸ºå¦ |
| | | hideNvueBottomTag: { |
| | | type: Boolean, |
| | | default: u.gc('hideNvueBottomTag', false) |
| | | }, |
| | | // nvue䏿§å¶onscrolläºä»¶è§¦åçé¢çï¼è¡¨ç¤ºä¸¤æ¬¡onscrolläºä»¶ä¹é´å表è³å°æ»å¨äº10pxãæ³¨æï¼å°è¯¥å¼è®¾ç½®ä¸ºè¾å°çæ°å¼ä¼æé«æ»å¨äºä»¶éæ ·ç精度ï¼ä½åæ¶ä¹ä¼éä½é¡µé¢çæ§è½ |
| | | offsetAccuracy: { |
| | | type: Number, |
| | | default: u.gc('offsetAccuracy', 10) |
| | | }, |
| | | // #endif |
| | | }, |
| | | data() { |
| | | return { |
| | | nRefresherLoading: false, |
| | | nListIsDragging: false, |
| | | nShowBottom: true, |
| | | nFixFreezing: false, |
| | | nShowRefresherReveal: false, |
| | | nLoadingMoreFixedHeight: false, |
| | | nShowRefresherRevealHeight: 0, |
| | | nOldShowRefresherRevealHeight: -1, |
| | | nRefresherWidth: u.rpx2px(750), |
| | | nF2Opacity: 0 |
| | | } |
| | | }, |
| | | computed: { |
| | | // #ifdef APP-NVUE |
| | | nScopedSlots() { |
| | | // #ifdef VUE2 |
| | | return this.$scopedSlots; |
| | | // #endif |
| | | // #ifdef VUE3 |
| | | return null; |
| | | // #endif |
| | | }, |
| | | nWaterfallColumnCount() { |
| | | if (this.finalNvueListIs !== 'waterfall') return 0; |
| | | return this._nGetWaterfallConfig('column-count', 2); |
| | | }, |
| | | nWaterfallColumnWidth() { |
| | | return this._nGetWaterfallConfig('column-width', 'auto'); |
| | | }, |
| | | nWaterfallColumnGap() { |
| | | return this._nGetWaterfallConfig('column-gap', 'normal'); |
| | | }, |
| | | nWaterfallLeftGap() { |
| | | return this._nGetWaterfallConfig('left-gap', 0); |
| | | }, |
| | | nWaterfallRightGap() { |
| | | return this._nGetWaterfallConfig('right-gap', 0); |
| | | }, |
| | | nViewIs() { |
| | | const is = this.finalNvueListIs; |
| | | return is === 'scroller' || is === 'view' ? 'view' : is === 'waterfall' ? 'header' : 'cell'; |
| | | }, |
| | | nSafeAreaBottomHeight() { |
| | | return this.safeAreaInsetBottom ? this.safeAreaBottom : 0; |
| | | }, |
| | | finalNvueListIs() { |
| | | if (this.usePageScroll) return 'view'; |
| | | const nvueListIsLowerCase = this.nvueListIs.toLowerCase(); |
| | | if (['list','waterfall','scroller'].indexOf(nvueListIsLowerCase) !== -1) return nvueListIsLowerCase; |
| | | return 'list'; |
| | | }, |
| | | finalNvueSuperListIs() { |
| | | return this.usePageScroll ? 'view' : 'scroller'; |
| | | }, |
| | | finalNvueRefresherEnabled() { |
| | | return this.finalNvueListIs !== 'view' && this.finalRefresherEnabled && !this.nShowRefresherReveal && !this.useChatRecordMode; |
| | | }, |
| | | // #endif |
| | | }, |
| | | mounted(){ |
| | | // #ifdef APP-NVUE |
| | | //æè½¬å±å¹æ¶æ´æ°å®½åº¦ |
| | | uni.onWindowResize((res) => { |
| | | // this._nUpdateRefresherWidth(); |
| | | }) |
| | | // #endif |
| | | }, |
| | | methods: { |
| | | // #ifdef APP-NVUE |
| | | // å表æ»å¨æ¶è§¦å |
| | | _nOnScroll(e) { |
| | | this.$emit('scroll', e); |
| | | const contentOffsetY = -e.contentOffset.y; |
| | | this.oldScrollTop = contentOffsetY; |
| | | this.nListIsDragging = e.isDragging; |
| | | this._checkShouldShowBackToTop(contentOffsetY, contentOffsetY - 1); |
| | | }, |
| | | // å表æ»å¨ç»æ |
| | | _nOnScrollend(e) { |
| | | this.$emit('scrollend', e); |
| | | |
| | | // 夿æ¯å¦æ»å¨å°é¡¶é¨äº |
| | | if (e?.contentOffset?.y >= 0) { |
| | | this._emitScrollEvent('scrolltoupper'); |
| | | } |
| | | // 夿æ¯å¦æ»å¨å°åºé¨äº |
| | | this._getNodeClientRect('.zp-n-list').then(node => { |
| | | if (node) { |
| | | if (e?.contentSize?.height + e?.contentOffset?.y <= node[0].height) { |
| | | this._emitScrollEvent('scrolltolower'); |
| | | } |
| | | } |
| | | }) |
| | | }, |
| | | // 䏿巿°å·æ°ä¸ |
| | | _nOnRrefresh() { |
| | | if (this.nShowRefresherReveal) return; |
| | | // è¿å
¥å·æ°ç¶æ |
| | | this.nRefresherLoading = true; |
| | | if (this.refresherStatus === Enum.Refresher.GoF2) { |
| | | this._handleGoF2(); |
| | | this.$nextTick(() => { |
| | | this._nRefresherEnd(); |
| | | }) |
| | | } else { |
| | | this.refresherStatus = Enum.Refresher.Loading; |
| | | this._doRefresherLoad(); |
| | | } |
| | | |
| | | }, |
| | | // 䏿巿°ä¸æä¸ |
| | | _nOnPullingdown(e) { |
| | | if (this.refresherStatus === Enum.Refresher.Loading || (this.isIos && !this.nListIsDragging)) return; |
| | | this._emitTouchmove(e); |
| | | let { viewHeight, pullingDistance } = e; |
| | | // æ´æ°ä¸æå·æ°ç¶æ |
| | | // 䏿巿°è·ç¦»è¶
è¿éå¼ |
| | | if (pullingDistance >= viewHeight) { |
| | | // 妿å¼å¯äºä¸æè¿å
¥äºæ¥¼å¹¶ä¸ä¸æå·æ°è·ç¦»è¶
è¿è¿å
¥äºæ¥¼éå¼ï¼åå½å䏿巿°ç¶æä¸ºæ¾æè¿å
¥äºæ¥¼ï¼å¦åä¸ºæ¾æç«å³å·æ° |
| | | // (pullingDistance - viewHeight) + this.finalRefresherThreshold ä¸çåäºpullingDistanceï¼æ¤å¤æ¯ä¸ºäºå
¼å®¹ä¸åå¹³å°ä¸æç¸åè·ç¦»pullingDistanceä¸ä¸è´çé®é¢ï¼pullingDistanceä»
ä¸viewHeightäºç¸å
³è |
| | | this.refresherStatus = this.refresherF2Enabled && (pullingDistance - viewHeight) + this.finalRefresherThreshold >= this.finalRefresherF2Threshold ? Enum.Refresher.GoF2 : Enum.Refresher.ReleaseToRefresh; |
| | | } else { |
| | | // 䏿巿°è·ç¦»æªè¶
è¿éå¼ï¼æ¾ç¤ºé»è®¤ç¶æ |
| | | this.refresherStatus = Enum.Refresher.Default; |
| | | } |
| | | }, |
| | | // 䏿巿°ç»æ |
| | | _nRefresherEnd(doEnd = true) { |
| | | if (doEnd) { |
| | | this._nDoRefresherEndAnimation(0, -this.nShowRefresherRevealHeight); |
| | | !this.usePageScroll && this.$refs['zp-n-list'].resetLoadmore(); |
| | | this.nRefresherLoading = false; |
| | | } |
| | | }, |
| | | // æ§è¡ä¸»å¨è§¦å䏿巿°å¨ç» |
| | | _nDoRefresherEndAnimation(height, translateY, animate = true, checkStack = true) { |
| | | // æ¸
é¤ä¸æå·æ°ç¸å
³timeout |
| | | this._cleanRefresherCompleteTimeout(); |
| | | this._cleanRefresherEndTimeout(); |
| | | |
| | | if (!this.finalShowRefresherWhenReload) { |
| | | // 妿reloadä¸éè¦èªå¨å±ç¤ºä¸æå·æ°viewï¼åå¨complete durationç»æååæä¸æå·æ°ç¶æè®¾ç½®åé»è®¤ |
| | | this.refresherEndTimeout = u.delay(() => { |
| | | this.refresherStatus = Enum.Refresher.Default; |
| | | }, this.refresherCompleteDuration); |
| | | return; |
| | | } |
| | | // ç¨æ·å¤çç¨æ·å¨çæ¶é´å
夿¬¡è°ç¨reloadçæ
åµï¼æ¤æ¶ä¸æå·æ°viewä¸éè¦é夿¾ç¤ºï¼åªéè¦ä¿è¯æå䏿¬¡reload对åºç请æ±ç»æåæ¶å䏿巿°viewå³å¯ |
| | | const stackCount = this.refresherRevealStackCount; |
| | | if (height === 0 && checkStack) { |
| | | this.refresherRevealStackCount --; |
| | | if (stackCount > 1) return; |
| | | this.refresherEndTimeout = u.delay(() => { |
| | | this.refresherStatus = Enum.Refresher.Default; |
| | | }, this.refresherCompleteDuration); |
| | | } |
| | | if (stackCount > 1) { |
| | | this.refresherStatus = Enum.Refresher.Loading; |
| | | } |
| | | |
| | | const duration = animate ? 200 : 0; |
| | | if (this.nOldShowRefresherRevealHeight !== height) { |
| | | if (height > 0) { |
| | | this.nShowRefresherReveal = true; |
| | | } |
| | | // å±ç¤ºä¸æå·æ°view |
| | | weexAnimation.transition(this.$refs['zp-n-list-refresher-reveal'], { |
| | | styles: { |
| | | height: `${height}px`, |
| | | transform: `translateY(${translateY}px)`, |
| | | }, |
| | | duration, |
| | | timingFunction: 'linear', |
| | | needLayout: true, |
| | | delay: 0 |
| | | }) |
| | | } |
| | | u.delay(() => { |
| | | if (animate) { |
| | | this.nShowRefresherReveal = height > 0; |
| | | } |
| | | }, duration > 0 ? duration - 60 : 0); |
| | | this.nOldShowRefresherRevealHeight = height; |
| | | }, |
| | | // æ»å¨å°åºé¨å è½½æ´å¤ |
| | | _nOnLoadmore() { |
| | | if (this.nShowRefresherReveal || !this.totalData.length) return; |
| | | this.useChatRecordMode ? this.doChatRecordLoadMore() : this._onLoadingMore('toBottom'); |
| | | }, |
| | | // è·ånvue waterfallå项é
ç½® |
| | | _nGetWaterfallConfig(key, defaultValue) { |
| | | return this.nvueWaterfallConfig[key] || defaultValue; |
| | | }, |
| | | // æ´æ°nvue 䏿巿°view容å¨ç宽度 |
| | | _nUpdateRefresherWidth() { |
| | | u.delay(() => { |
| | | this.$nextTick(()=>{ |
| | | this._getNodeClientRect('.zp-n-list').then(node => { |
| | | if (node) { |
| | | this.nRefresherWidth = node[0].width || this.nRefresherWidth; |
| | | } |
| | | }) |
| | | }) |
| | | }) |
| | | } |
| | | // #endif |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]䏿巿°view模å |
| | | import u from '.././z-paging-utils' |
| | | import c from '.././z-paging-constant' |
| | | import Enum from '.././z-paging-enum' |
| | | |
| | | // #ifdef APP-NVUE |
| | | const weexAnimation = weex.requireModule('animation'); |
| | | // #endif |
| | | export default { |
| | | props: { |
| | | // 䏿巿°ç䏻颿 ·å¼ï¼æ¯æblackï¼whiteï¼é»è®¤black |
| | | refresherThemeStyle: { |
| | | type: String, |
| | | default: u.gc('refresherThemeStyle', '') |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°ä¸å·¦ä¾§å¾æ çæ ·å¼ |
| | | refresherImgStyle: { |
| | | type: Object, |
| | | default: u.gc('refresherImgStyle', {}) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°ä¸å³ä¾§ç¶ææè¿°æåçæ ·å¼ |
| | | refresherTitleStyle: { |
| | | type: Object, |
| | | default: u.gc('refresherTitleStyle', {}) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°ä¸å³ä¾§æåæ´æ°æ¶é´æåçæ ·å¼(show-refresher-update-time为trueæ¶ææ) |
| | | refresherUpdateTimeStyle: { |
| | | type: Object, |
| | | default: u.gc('refresherUpdateTimeStyle', {}) |
| | | }, |
| | | // å¨å¾®ä¿¡å°ç¨åºåQQå°ç¨åºä¸ï¼æ¯å¦å®æ¶çå¬ä¸æå·æ°ä¸è¿åº¦ï¼é»è®¤ä¸ºå¦ |
| | | watchRefresherTouchmove: { |
| | | type: Boolean, |
| | | default: u.gc('watchRefresherTouchmove', false) |
| | | }, |
| | | // åºé¨å è½½æ´å¤ç䏻颿 ·å¼ï¼æ¯æblackï¼whiteï¼é»è®¤black |
| | | loadingMoreThemeStyle: { |
| | | type: String, |
| | | default: u.gc('loadingMoreThemeStyle', '') |
| | | }, |
| | | // æ¯å¦åªä½¿ç¨ä¸æå·æ°ï¼è®¾ç½®ä¸ºtrueåå°å
³émountedèªå¨è¯·æ±æ°æ®ãå
³éæ»å¨å°åºé¨å è½½æ´å¤ï¼å¼ºå¶éèç©ºæ°æ®å¾ãé»è®¤ä¸ºå¦ |
| | | refresherOnly: { |
| | | type: Boolean, |
| | | default: u.gc('refresherOnly', false) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°é»è®¤ç¶æä¸åå¼¹å¨ç»æ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤ä¸º100毫ç§ï¼nvueæ æ |
| | | refresherDefaultDuration: { |
| | | type: [Number, String], |
| | | default: u.gc('refresherDefaultDuration', 100) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°ç»æä»¥åå»¶è¿åå¼¹çæ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤ä¸º0 |
| | | refresherCompleteDelay: { |
| | | type: [Number, String], |
| | | default: u.gc('refresherCompleteDelay', 0) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°ç»æåå¼¹å¨ç»æ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤ä¸º300毫ç§(refresherEndBounceEnabled为falseæ¶ï¼refresherCompleteDuration为设å®å¼ç1/3)ï¼nvueæ æ |
| | | refresherCompleteDuration: { |
| | | type: [Number, String], |
| | | default: u.gc('refresherCompleteDuration', 300) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°ä¸æ¯å¦å
许å表æ»å¨ï¼é»è®¤ä¸ºæ¯ |
| | | refresherRefreshingScrollable: { |
| | | type: Boolean, |
| | | default: u.gc('refresherRefreshingScrollable', true) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°ç»æç¶æä¸æ¯å¦å
许å表æ»å¨ï¼é»è®¤ä¸ºå¦ |
| | | refresherCompleteScrollable: { |
| | | type: Boolean, |
| | | default: u.gc('refresherCompleteScrollable', false) |
| | | }, |
| | | // æ¯å¦ä½¿ç¨èªå®ä¹ç䏿巿°ï¼é»è®¤ä¸ºæ¯ï¼å³ä½¿ç¨z-pagingç䏿巿°ã设置为falseå³ä»£è¡¨ä½¿ç¨uni scroll-viewèªå¸¦ç䏿巿°ï¼h5ãAppã微信å°ç¨åºä»¥å¤çå¹³å°ä¸æ¯æuni scroll-viewèªå¸¦ç䏿巿° |
| | | useCustomRefresher: { |
| | | type: Boolean, |
| | | default: u.gc('useCustomRefresher', true) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°ä¸æå¸§çï¼é»è®¤ä¸º40ï¼è¿é«å¯è½ä¼åºç°æå¨é®é¢ |
| | | refresherFps: { |
| | | type: [Number, String], |
| | | default: u.gc('refresherFps', 40) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°å
许触åçæå¤§ä¸æè§åº¦ï¼é»è®¤ä¸º40度ï¼å½ä¸æè§åº¦å°äºè®¾å®å¼æ¶ï¼èªå®ä¹ä¸æå·æ°å¨ç»ä¸ä¼è¢«è§¦å |
| | | refresherMaxAngle: { |
| | | type: [Number, String], |
| | | default: u.gc('refresherMaxAngle', 40) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°çè§åº¦ç±æªè¾¾å°æå¤§è§åº¦åå°è¾¾å°æå¤§è§åº¦æ¶ï¼æ¯å¦ç»§ç»ä¸æå·æ°æå¿ï¼é»è®¤ä¸ºå¦ |
| | | refresherAngleEnableChangeContinued: { |
| | | type: Boolean, |
| | | default: u.gc('refresherAngleEnableChangeContinued', false) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°é»è®¤ç¶æä¸çæå |
| | | refresherDefaultText: { |
| | | type: [String, Object], |
| | | default: u.gc('refresherDefaultText', null) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°æ¾æç«å³å·æ°ç¶æä¸çæå |
| | | refresherPullingText: { |
| | | type: [String, Object], |
| | | default: u.gc('refresherPullingText', null) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°å·æ°ä¸ç¶æä¸çæå |
| | | refresherRefreshingText: { |
| | | type: [String, Object], |
| | | default: u.gc('refresherRefreshingText', null) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°å·æ°ç»æç¶æä¸çæå |
| | | refresherCompleteText: { |
| | | type: [String, Object], |
| | | default: u.gc('refresherCompleteText', null) |
| | | }, |
| | | // èªå®ä¹ç»§ç»ä¸æè¿å
¥äºæ¥¼æå |
| | | refresherGoF2Text: { |
| | | type: [String, Object], |
| | | default: u.gc('refresherGoF2Text', null) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°é»è®¤ç¶æä¸çå¾ç |
| | | refresherDefaultImg: { |
| | | type: String, |
| | | default: u.gc('refresherDefaultImg', null) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°æ¾æç«å³å·æ°ç¶æä¸çå¾çï¼é»è®¤ä¸refresherDefaultImgä¸è´ |
| | | refresherPullingImg: { |
| | | type: String, |
| | | default: u.gc('refresherPullingImg', null) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°å·æ°ä¸ç¶æä¸çå¾ç |
| | | refresherRefreshingImg: { |
| | | type: String, |
| | | default: u.gc('refresherRefreshingImg', null) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°å·æ°ç»æç¶æä¸çå¾ç |
| | | refresherCompleteImg: { |
| | | type: String, |
| | | default: u.gc('refresherCompleteImg', null) |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°å·æ°ä¸ç¶æä¸æ¯å¦å±ç¤ºæè½¬å¨ç» |
| | | refresherRefreshingAnimated: { |
| | | type: Boolean, |
| | | default: u.gc('refresherRefreshingAnimated', true) |
| | | }, |
| | | // æ¯å¦å¼å¯èªå®ä¹ä¸æå·æ°å·æ°ç»æåå¼¹ææï¼é»è®¤ä¸ºæ¯ |
| | | refresherEndBounceEnabled: { |
| | | type: Boolean, |
| | | default: u.gc('refresherEndBounceEnabled', true) |
| | | }, |
| | | // æ¯å¦å¼å¯èªå®ä¹ä¸æå·æ°ï¼é»è®¤ä¸ºæ¯ |
| | | refresherEnabled: { |
| | | type: Boolean, |
| | | default: u.gc('refresherEnabled', true) |
| | | }, |
| | | // 设置èªå®ä¹ä¸æå·æ°éå¼ï¼é»è®¤ä¸º80rpx |
| | | refresherThreshold: { |
| | | type: [Number, String], |
| | | default: u.gc('refresherThreshold', '80rpx') |
| | | }, |
| | | // 设置系ç»ä¸æå·æ°é»è®¤æ ·å¼ï¼æ¯æè®¾ç½® blackï¼whiteï¼noneï¼none 表示ä¸ä½¿ç¨é»è®¤æ ·å¼ï¼é»è®¤ä¸ºblack |
| | | refresherDefaultStyle: { |
| | | type: String, |
| | | default: u.gc('refresherDefaultStyle', 'black') |
| | | }, |
| | | // 设置èªå®ä¹ä¸æå·æ°åºåèæ¯ |
| | | refresherBackground: { |
| | | type: String, |
| | | default: u.gc('refresherBackground', 'transparent') |
| | | }, |
| | | // 设置åºå®çèªå®ä¹ä¸æå·æ°åºåèæ¯ |
| | | refresherFixedBackground: { |
| | | type: String, |
| | | default: u.gc('refresherFixedBackground', 'transparent') |
| | | }, |
| | | // 设置åºå®çèªå®ä¹ä¸æå·æ°åºåé«åº¦ï¼é»è®¤ä¸º0 |
| | | refresherFixedBacHeight: { |
| | | type: [Number, String], |
| | | default: u.gc('refresherFixedBacHeight', 0) |
| | | }, |
| | | // 设置èªå®ä¹ä¸æå·æ°ä¸æè¶
åºéå¼åç»§ç»ä¸æä½ç§»è¡°åçæ¯ä¾ï¼èå´0-1ï¼å¼è¶å¤§ä»£è¡¨è¡°åè¶å¤ãé»è®¤ä¸º0.65(nvueæ æ) |
| | | refresherOutRate: { |
| | | type: Number, |
| | | default: u.gc('refresherOutRate', 0.65) |
| | | }, |
| | | // æ¯å¦å¼å¯ä¸æè¿å
¥äºæ¥¼åè½ï¼é»è®¤ä¸ºå¦ |
| | | refresherF2Enabled: { |
| | | type: Boolean, |
| | | default: u.gc('refresherF2Enabled', false) |
| | | }, |
| | | // 䏿è¿å
¥äºæ¥¼éå¼ï¼é»è®¤ä¸º200rpx |
| | | refresherF2Threshold: { |
| | | type: [Number, String], |
| | | default: u.gc('refresherF2Threshold', '200rpx') |
| | | }, |
| | | // 䏿è¿å
¥äºæ¥¼å¨ç»æ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤ä¸º200æ¯«ç§ |
| | | refresherF2Duration: { |
| | | type: [Number, String], |
| | | default: u.gc('refresherF2Duration', 200) |
| | | }, |
| | | // 䏿è¿å
¥äºæ¥¼ç¶ææ¾æåæ¯å¦å¼¹åºäºæ¥¼ï¼é»è®¤ä¸ºæ¯ |
| | | showRefresherF2: { |
| | | type: Boolean, |
| | | default: u.gc('showRefresherF2', true) |
| | | }, |
| | | // 设置èªå®ä¹ä¸æå·æ°ä¸ææ¶å®é
䏿ä½ç§»ä¸ç¨æ·ä¸æè·ç¦»çæ¯å¼ï¼é»è®¤ä¸º0.75ï¼å³ä»£è¡¨è¥ç¨æ·ä¸æ10pxï¼åå®é
ä½ç§»ä¸º7.5px(nvueæ æ) |
| | | refresherPullRate: { |
| | | type: Number, |
| | | default: u.gc('refresherPullRate', 0.75) |
| | | }, |
| | | // æ¯å¦æ¾ç¤ºæåæ´æ°æ¶é´ï¼é»è®¤ä¸ºå¦ |
| | | showRefresherUpdateTime: { |
| | | type: Boolean, |
| | | default: u.gc('showRefresherUpdateTime', false) |
| | | }, |
| | | // 妿éè¦åºå«ä¸å页é¢çæåæ´æ°æ¶é´ï¼è¯·ä¸ºä¸å页é¢çz-pagingç`refresher-update-time-key`设置ä¸åçå符串 |
| | | refresherUpdateTimeKey: { |
| | | type: String, |
| | | default: u.gc('refresherUpdateTimeKey', 'default') |
| | | }, |
| | | // 䏿巿°æ¶ä¸æå°âæ¾æç«å³å·æ°âæâæ¾æè¿å
¥äºæ¥¼âç¶ææ¶æ¯å¦ä½¿ææºçæ¯å¨ï¼é»è®¤ä¸ºå¦ï¼h5æ æï¼ |
| | | refresherVibrate: { |
| | | type: Boolean, |
| | | default: u.gc('refresherVibrate', false) |
| | | }, |
| | | // 䏿巿°æ¶æ¯å¦ç¦æ¢ä¸æå·æ°viewè·éç¨æ·è§¦æ¸ç«ç´ç§»å¨ï¼é»è®¤ä¸ºå¦ãæ³¨ææ¤å±æ§åªæ¯ç¦æ¢ä¸æå·æ°viewç§»å¨ï¼å
¶ä»ä¸æå·æ°é»è¾ä¾ç¶ä¼æ£å¸¸è§¦å |
| | | refresherNoTransform: { |
| | | type: Boolean, |
| | | default: u.gc('refresherNoTransform', false) |
| | | }, |
| | | // æ¯å¦å¼å¯ä¸æå·æ°ç¶ææ å ä½ï¼éç¨äºéèå¯¼èªæ æ¶ï¼ä¸æå·æ°éè¦é¿å¼ç¶ææ é«åº¦çæ
åµï¼é»è®¤ä¸ºå¦ |
| | | useRefresherStatusBarPlaceholder: { |
| | | type: Boolean, |
| | | default: u.gc('useRefresherStatusBarPlaceholder', false) |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | R: Enum.Refresher, |
| | | //䏿巿°ç¶æ |
| | | refresherStatus: Enum.Refresher.Default, |
| | | refresherTouchstartY: 0, |
| | | lastRefresherTouchmove: null, |
| | | refresherReachMaxAngle: true, |
| | | refresherTransform: 'translateY(0px)', |
| | | refresherTransition: '', |
| | | finalRefresherDefaultStyle: 'black', |
| | | refresherRevealStackCount: 0, |
| | | refresherCompleteTimeout: null, |
| | | refresherCompleteSubTimeout: null, |
| | | refresherEndTimeout: null, |
| | | isTouchmovingTimeout: null, |
| | | refresherTriggered: false, |
| | | isTouchmoving: false, |
| | | isTouchEnded: false, |
| | | isUserPullDown: false, |
| | | privateRefresherEnabled: -1, |
| | | privateShowRefresherWhenReload: false, |
| | | customRefresherHeight: -1, |
| | | showCustomRefresher: false, |
| | | doRefreshAnimateAfter: false, |
| | | isRefresherInComplete: false, |
| | | showF2: false, |
| | | f2Transform: '', |
| | | pullDownTimeStamp: 0, |
| | | moveDis: 0, |
| | | oldMoveDis: 0, |
| | | currentDis: 0, |
| | | oldCurrentMoveDis: 0, |
| | | oldRefresherTouchmoveY: 0, |
| | | oldTouchDirection: '', |
| | | oldEmitedTouchDirection: '', |
| | | oldPullingDistance: -1, |
| | | refresherThresholdUpdateTag: 0 |
| | | } |
| | | }, |
| | | watch: { |
| | | refresherDefaultStyle: { |
| | | handler(newVal) { |
| | | if (newVal.length) { |
| | | this.finalRefresherDefaultStyle = newVal; |
| | | } |
| | | }, |
| | | immediate: true |
| | | }, |
| | | refresherStatus(newVal) { |
| | | newVal === Enum.Refresher.Loading && this._cleanRefresherEndTimeout(); |
| | | this.refresherVibrate && (newVal === Enum.Refresher.ReleaseToRefresh || newVal === Enum.Refresher.GoF2) && this._doVibrateShort(); |
| | | this.$emit('refresherStatusChange', newVal); |
| | | this.$emit('update:refresherStatus', newVal); |
| | | }, |
| | | // çå¬å½å䏿巿°å¯ç¨/ç¦ç¨ç¶æ |
| | | refresherEnabled(newVal) { |
| | | // å½ç¦ç¨ä¸æå·æ°æ¶ï¼å¼ºå¶æ¶åæ£å¨å±ç¤ºç䏿巿°view |
| | | !newVal && this.endRefresh(); |
| | | } |
| | | }, |
| | | computed: { |
| | | pullDownDisTimeStamp() { |
| | | return 1000 / this.refresherFps; |
| | | }, |
| | | refresherThresholdUnitConverted() { |
| | | return u.addUnit(this.refresherThreshold, this.unit); |
| | | }, |
| | | finalRefresherEnabled() { |
| | | if (this.useChatRecordMode) return false; |
| | | if (this.privateRefresherEnabled === -1) return this.refresherEnabled; |
| | | return this.privateRefresherEnabled === 1; |
| | | }, |
| | | finalRefresherThreshold() { |
| | | let refresherThreshold = this.refresherThresholdUnitConverted; |
| | | let idDefault = false; |
| | | if (refresherThreshold === u.addUnit(80, this.unit)) { |
| | | idDefault = true; |
| | | if (this.showRefresherUpdateTime) { |
| | | refresherThreshold = u.addUnit(120, this.unit); |
| | | } |
| | | } |
| | | if (idDefault && this.customRefresherHeight > 0) return this.customRefresherHeight + this.finalRefresherThresholdPlaceholder; |
| | | return u.convertToPx(refresherThreshold) + this.finalRefresherThresholdPlaceholder; |
| | | }, |
| | | finalRefresherF2Threshold() { |
| | | return u.convertToPx(u.addUnit(this.refresherF2Threshold, this.unit)); |
| | | }, |
| | | finalRefresherThresholdPlaceholder() { |
| | | return this.useRefresherStatusBarPlaceholder ? this.statusBarHeight : 0; |
| | | }, |
| | | finalRefresherFixedBacHeight() { |
| | | return u.convertToPx(this.refresherFixedBacHeight); |
| | | }, |
| | | finalRefresherThemeStyle() { |
| | | return this.refresherThemeStyle.length ? this.refresherThemeStyle : this.defaultThemeStyle; |
| | | }, |
| | | finalRefresherOutRate() { |
| | | let rate = this.refresherOutRate; |
| | | rate = Math.max(0,rate); |
| | | rate = Math.min(1,rate); |
| | | return rate; |
| | | }, |
| | | finalRefresherPullRate() { |
| | | let rate = this.refresherPullRate; |
| | | rate = Math.max(0,rate); |
| | | return rate; |
| | | }, |
| | | finalRefresherTransform() { |
| | | if (this.refresherNoTransform || this.refresherTransform === 'translateY(0px)') return 'none'; |
| | | return this.refresherTransform; |
| | | }, |
| | | finalShowRefresherWhenReload() { |
| | | return this.showRefresherWhenReload || this.privateShowRefresherWhenReload; |
| | | }, |
| | | finalRefresherTriggered() { |
| | | if (!(this.finalRefresherEnabled && !this.useCustomRefresher)) return false; |
| | | return this.refresherTriggered; |
| | | }, |
| | | showRefresher() { |
| | | const showRefresher = this.finalRefresherEnabled || this.useCustomRefresher && !this.useChatRecordMode; |
| | | // #ifndef APP-NVUE |
| | | this.active && this.customRefresherHeight === -1 && showRefresher && this.updateCustomRefresherHeight(); |
| | | // #endif |
| | | return showRefresher; |
| | | }, |
| | | hasTouchmove() { |
| | | // #ifdef VUE2 |
| | | // #ifdef APP-VUE || H5 |
| | | if (this.$listeners && !this.$listeners.refresherTouchmove) return false; |
| | | // #endif |
| | | // #ifdef MP-WEIXIN || MP-QQ |
| | | return this.watchRefresherTouchmove; |
| | | // #endif |
| | | return true; |
| | | // #endif |
| | | return this.watchRefresherTouchmove; |
| | | }, |
| | | }, |
| | | methods: { |
| | | // ç»æ¢ä¸æå·æ°ç¶æ |
| | | endRefresh() { |
| | | this.totalData = this.realTotalData; |
| | | this._refresherEnd(); |
| | | this._endSystemLoadingAndRefresh(); |
| | | this._handleScrollViewBounce({ bounce: true }); |
| | | this.$nextTick(() => { |
| | | this.refresherTriggered = false; |
| | | }) |
| | | }, |
| | | // æå¨æ´æ°èªå®ä¹ä¸æå·æ°viewé«åº¦ |
| | | updateCustomRefresherHeight() { |
| | | u.delay(() => this.$nextTick(this._updateCustomRefresherHeight)); |
| | | }, |
| | | // å
³éäºæ¥¼ |
| | | closeF2() { |
| | | this._handleCloseF2(); |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°è¢«è§¦å |
| | | _onRefresh(fromScrollView = false, isUserPullDown = true) { |
| | | if (fromScrollView && !(this.finalRefresherEnabled && !this.useCustomRefresher)) return; |
| | | this.$emit('onRefresh'); |
| | | this.$emit('Refresh'); |
| | | // #ifdef APP-NVUE |
| | | if (this.loading) { |
| | | u.delay(this._nRefresherEnd, 500) |
| | | return; |
| | | } |
| | | // #endif |
| | | if (this.loading || this.isRefresherInComplete) return; |
| | | this.loadingType = Enum.LoadingType.Refresher; |
| | | if (this.nShowRefresherReveal) return; |
| | | this.isUserPullDown = isUserPullDown; |
| | | this.isUserReload = !isUserPullDown; |
| | | this._startLoading(true); |
| | | this.refresherTriggered = true; |
| | | if (this.reloadWhenRefresh && isUserPullDown) { |
| | | this.useChatRecordMode ? this._onLoadingMore('click') : this._reload(false, false, isUserPullDown); |
| | | } |
| | | }, |
| | | // èªå®ä¹ä¸æå·æ°è¢«å¤ä½ |
| | | _onRestore() { |
| | | this.refresherTriggered = 'restore'; |
| | | this.$emit('onRestore'); |
| | | this.$emit('Restore'); |
| | | }, |
| | | // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | // touchå¼å§ |
| | | _refresherTouchstart(e) { |
| | | this._handleListTouchstart(); |
| | | if (this._touchDisabled()) return; |
| | | this._handleRefresherTouchstart(u.getTouch(e)); |
| | | }, |
| | | // #endif |
| | | // è¿ä¸æ¥å¤çtouchå¼å§ç»æ |
| | | _handleRefresherTouchstart(touch) { |
| | | if (!this.loading && this.isTouchEnded) { |
| | | this.isTouchmoving = false; |
| | | } |
| | | this.loadingType = Enum.LoadingType.Refresher; |
| | | this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); |
| | | this.isTouchEnded = false; |
| | | this.refresherTransition = ''; |
| | | this.refresherTouchstartY = touch.touchY; |
| | | this.$emit('refresherTouchstart', this.refresherTouchstartY); |
| | | this.lastRefresherTouchmove = touch; |
| | | this._cleanRefresherCompleteTimeout(); |
| | | this._cleanRefresherEndTimeout(); |
| | | }, |
| | | |
| | | // éapp-vueæå¾®ä¿¡å°ç¨åºæQQå°ç¨åºæh5å¹³å°ï¼ä½¿ç¨jsæ§å¶ä¸æå·æ° |
| | | // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | // touchä¸ |
| | | _refresherTouchmove(e) { |
| | | const currentTimeStamp = u.getTime(); |
| | | let touch = null; |
| | | let refresherTouchmoveY = 0; |
| | | if (this.watchTouchDirectionChange) { |
| | | // æ£æµä¸æå·æ°æ¹åæ¹å |
| | | touch = u.getTouch(e); |
| | | refresherTouchmoveY = touch.touchY; |
| | | const direction = refresherTouchmoveY > this.oldRefresherTouchmoveY ? 'top' : 'bottom'; |
| | | // åªæå¨æ¹åæ¹åçæ¶åæemitç¸å
³äºä»¶ |
| | | if (direction === this.oldTouchDirection && direction !== this.oldEmitedTouchDirection) { |
| | | this._handleTouchDirectionChange({ direction }); |
| | | this.oldEmitedTouchDirection = direction; |
| | | } |
| | | this.oldTouchDirection = direction; |
| | | this.oldRefresherTouchmoveY = refresherTouchmoveY; |
| | | } |
| | | // èæµå¤çï¼å¨pullDownDisTimeStampæ¶é´å
ç䏿巿°ä¸äºä»¶ä¸è¿è¡å¤ç |
| | | if (this.pullDownTimeStamp && currentTimeStamp - this.pullDownTimeStamp <= this.pullDownDisTimeStamp) return; |
| | | // 妿ä¸å
è®¸ä¸æï¼åreturn |
| | | if (this._touchDisabled()) return; |
| | | this.pullDownTimeStamp = Number(currentTimeStamp); |
| | | touch = u.getTouch(e); |
| | | refresherTouchmoveY = touch.touchY; |
| | | // è·åå½åtouchçy - åå§touchçyï¼è®¡ç®å®ä»¬çå·® |
| | | let moveDis = refresherTouchmoveY - this.refresherTouchstartY; |
| | | if (moveDis < 0) return; |
| | | // 坹䏿巿°çè§åº¦è¿è¡éå¶ |
| | | if (this.refresherMaxAngle >= 0 && this.refresherMaxAngle <= 90 && this.lastRefresherTouchmove && this.lastRefresherTouchmove.touchY <= refresherTouchmoveY) { |
| | | if (!moveDis && !this.refresherAngleEnableChangeContinued && this.moveDis < 1 && !this.refresherReachMaxAngle) return; |
| | | const x = Math.abs(touch.touchX - this.lastRefresherTouchmove.touchX); |
| | | const y = Math.abs(refresherTouchmoveY - this.lastRefresherTouchmove.touchY); |
| | | const z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); |
| | | if ((x || y) && x > 1) { |
| | | // è·å䏿巿°åå两次ä½ç§»çè§åº¦ |
| | | const angle = Math.asin(y / z) / Math.PI * 180; |
| | | // 妿è§åº¦å°äºé
ç½®è¦æ±ï¼åreturn |
| | | if (angle < this.refresherMaxAngle) { |
| | | this.lastRefresherTouchmove = touch; |
| | | this.refresherReachMaxAngle = false; |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | // è·åæç»çmoveDis |
| | | moveDis = this._getFinalRefresherMoveDis(moveDis); |
| | | // å¤ç䏿巿°ä½ç§» |
| | | this._handleRefresherTouchmove(moveDis, touch); |
| | | // 䏿巿°æ¶ï¼ç¦æ¢é¡µé¢æ»å¨ä»¥é²æ¢é¡µé¢å䏿»å¨å䏿巿°åæ¶ä½ç¨å¯¼è´ä¸æå·æ°ä½ç½®åç§»è¶
è¿é¢æ |
| | | if (!this.disabledBounce) { |
| | | // #ifndef MP-LARK |
| | | this._handleScrollViewBounce({ bounce: false }); |
| | | // #endif |
| | | this.disabledBounce = true; |
| | | } |
| | | this._emitTouchmove({ pullingDistance: moveDis, dy: this.moveDis - this.oldMoveDis }); |
| | | }, |
| | | // #endif |
| | | // è¿ä¸æ¥å¤çtouchä¸ç»æ |
| | | _handleRefresherTouchmove(moveDis, touch) { |
| | | this.refresherReachMaxAngle = true; |
| | | this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); |
| | | this.isTouchmoving = true; |
| | | this.isTouchEnded = false; |
| | | // æ´æ°ä¸æå·æ°ç¶æ |
| | | // 䏿巿°è·ç¦»è¶
è¿éå¼ |
| | | if (moveDis >= this.finalRefresherThreshold) { |
| | | // 妿å¼å¯äºä¸æè¿å
¥äºæ¥¼å¹¶ä¸ä¸æå·æ°è·ç¦»è¶
è¿è¿å
¥äºæ¥¼éå¼ï¼åå½å䏿巿°ç¶æä¸ºæ¾æè¿å
¥äºæ¥¼ï¼å¦åä¸ºæ¾æç«å³å·æ° |
| | | this.refresherStatus = this.refresherF2Enabled && moveDis >= this.finalRefresherF2Threshold ? Enum.Refresher.GoF2 : Enum.Refresher.ReleaseToRefresh; |
| | | } else { |
| | | // 䏿巿°è·ç¦»æªè¶
è¿éå¼ï¼æ¾ç¤ºé»è®¤ç¶æ |
| | | this.refresherStatus = Enum.Refresher.Default; |
| | | } |
| | | // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | // this.scrollEnable = false; |
| | | // éè¿transformæ§å¶ä¸æå·æ°viewåç´åç§» |
| | | this.refresherTransform = `translateY(${moveDis}px)`; |
| | | this.lastRefresherTouchmove = touch; |
| | | // #endif |
| | | this.moveDis = moveDis; |
| | | }, |
| | | // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | // touchç»æ |
| | | _refresherTouchend(e) { |
| | | // 䏿巿°ç¨æ·æç¦»å¼å±å¹ï¼å
许å表æ»å¨ |
| | | this._handleScrollViewBounce({bounce: true}); |
| | | if (this._touchDisabled() || !this.isTouchmoving) return; |
| | | const touch = u.getTouch(e); |
| | | let refresherTouchendY = touch.touchY; |
| | | let moveDis = refresherTouchendY - this.refresherTouchstartY; |
| | | moveDis = this._getFinalRefresherMoveDis(moveDis); |
| | | this._handleRefresherTouchend(moveDis); |
| | | this.disabledBounce = false; |
| | | }, |
| | | // #endif |
| | | // è¿ä¸æ¥å¤çtouchç»æç»æ |
| | | _handleRefresherTouchend(moveDis) { |
| | | // #ifndef APP-PLUS || H5 || MP-WEIXIN |
| | | if (!this.isTouchmoving) return; |
| | | // #endif |
| | | this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); |
| | | this.refresherReachMaxAngle = true; |
| | | this.isTouchEnded = true; |
| | | const refresherThreshold = this.finalRefresherThreshold; |
| | | if (moveDis >= refresherThreshold && (this.refresherStatus === Enum.Refresher.ReleaseToRefresh || this.refresherStatus === Enum.Refresher.GoF2)) { |
| | | // å¦ææ¯æ¾æè¿å
¥äºæ¥¼ç¶æï¼å触åè¿å
¥äºæ¥¼ |
| | | if (this.refresherStatus === Enum.Refresher.GoF2) { |
| | | this._handleGoF2(); |
| | | this._refresherEnd(); |
| | | } else { |
| | | // å¦ææ¯æ¾æç«å³å·æ°ç¶æï¼å触å䏿巿° |
| | | // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | this.refresherTransform = `translateY(${refresherThreshold}px)`; |
| | | this.refresherTransition = 'transform .1s linear'; |
| | | // #endif |
| | | u.delay(() => { |
| | | this._emitTouchmove({ pullingDistance: refresherThreshold, dy: this.moveDis - refresherThreshold }); |
| | | }, 0.1); |
| | | this.moveDis = refresherThreshold; |
| | | this.refresherStatus = Enum.Refresher.Loading; |
| | | this._doRefresherLoad(); |
| | | } |
| | | } else { |
| | | this._refresherEnd(); |
| | | this.isTouchmovingTimeout = u.delay(() => { |
| | | this.isTouchmoving = false; |
| | | }, this.refresherDefaultDuration); |
| | | } |
| | | this.scrollEnable = true; |
| | | this.$emit('refresherTouchend', moveDis); |
| | | }, |
| | | // å¤çå表触æ¸å¼å§äºä»¶ |
| | | _handleListTouchstart() { |
| | | if (this.useChatRecordMode && this.autoHideKeyboardWhenChat) { |
| | | uni.hideKeyboard(); |
| | | this.$emit('hidedKeyboard'); |
| | | } |
| | | }, |
| | | // å¤çscroll-view bounceæ¯å¦çæ |
| | | _handleScrollViewBounce({ bounce }) { |
| | | if (!this.usePageScroll && !this.scrollToTopBounceEnabled) { |
| | | if (this.wxsScrollTop <= 5) { |
| | | // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | this.refresherTransition = ''; |
| | | // #endif |
| | | this.scrollEnable = bounce; |
| | | } else if (bounce) { |
| | | this.scrollEnable = bounce; |
| | | } |
| | | } |
| | | }, |
| | | // wxsæ£å¨ä¸æç¶ææ¹åå¤ç |
| | | _handleWxsPullingDownStatusChange(onPullingDown) { |
| | | this.wxsOnPullingDown = onPullingDown; |
| | | if (onPullingDown && !this.useChatRecordMode) { |
| | | this.renderPropScrollTop = 0; |
| | | } |
| | | }, |
| | | // wxsæ£å¨ä¸æå¤ç |
| | | _handleWxsPullingDown({ moveDis, diffDis }){ |
| | | this._emitTouchmove({ pullingDistance: moveDis,dy: diffDis }); |
| | | }, |
| | | // wxsè§¦æ¸æ¹åæ¹å |
| | | _handleTouchDirectionChange({ direction }) { |
| | | this.$emit('touchDirectionChange',direction); |
| | | }, |
| | | // wxséç¥æ´æ°å
¶props |
| | | _handlePropUpdate(){ |
| | | this.wxsPropType = u.getTime().toString(); |
| | | }, |
| | | // 䏿巿°ç»æ |
| | | _refresherEnd(shouldEndLoadingDelay = true, fromAddData = false, isUserPullDown = false, setLoading = true) { |
| | | if (this.loadingType === Enum.LoadingType.Refresher) { |
| | | // 计ç®å½å䏿巿°ç»æéè¦å»¶è¿çæ¶é´ |
| | | const refresherCompleteDelay = (fromAddData && (isUserPullDown || this.showRefresherWhenReload)) ? this.refresherCompleteDelay : 0; |
| | | // å¦æå»¶è¿æ¶é´å¤§äº0ï¼åå±ç¤ºå·æ°ç»æç¶æï¼å¦åç´æ¥å±ç¤ºé»è®¤ç¶æ |
| | | const refresherStatus = refresherCompleteDelay > 0 ? Enum.Refresher.Complete : Enum.Refresher.Default; |
| | | if (this.finalShowRefresherWhenReload) { |
| | | const stackCount = this.refresherRevealStackCount; |
| | | this.refresherRevealStackCount --; |
| | | if (stackCount > 1) return; |
| | | } |
| | | this._cleanRefresherEndTimeout(); |
| | | this.refresherEndTimeout = u.delay(() => { |
| | | // æ´æ°ä¸æå·æ°ç¶æ |
| | | this.refresherStatus = refresherStatus; |
| | | // 妿å½å䏿巿°ç¶æä¸æ¯å·æ°ç»æï¼å认为å
¶ä¸å¨å·æ°ç»æç¶æ |
| | | if (refresherStatus !== Enum.Refresher.Complete) { |
| | | this.isRefresherInComplete = false; |
| | | } |
| | | }, this.refresherStatus !== Enum.Refresher.Default && refresherStatus === Enum.Refresher.Default ? this.refresherCompleteDuration : 0); |
| | | |
| | | // #ifndef APP-NVUE |
| | | if (refresherCompleteDelay > 0) { |
| | | this.isRefresherInComplete = true; |
| | | } |
| | | // #endif |
| | | this._cleanRefresherCompleteTimeout(); |
| | | this.refresherCompleteTimeout = u.delay(() => { |
| | | let animateDuration = 1; |
| | | const animateType = this.refresherEndBounceEnabled && fromAddData ? 'cubic-bezier(0.19,1.64,0.42,0.72)' : 'linear'; |
| | | if (fromAddData) { |
| | | animateDuration = this.refresherEndBounceEnabled ? this.refresherCompleteDuration / 1000 : this.refresherCompleteDuration / 3000; |
| | | } |
| | | this.refresherTransition = `transform ${fromAddData ? animateDuration : this.refresherDefaultDuration / 1000}s ${animateType}`; |
| | | // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | this.refresherTransform = 'translateY(0px)'; |
| | | this.currentDis = 0; |
| | | // #endif |
| | | // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | this.wxsPropType = this.refresherTransition + 'end' + u.getTime(); |
| | | // #endif |
| | | // #ifdef APP-NVUE |
| | | this._nRefresherEnd(); |
| | | // #endif |
| | | this.moveDis = 0; |
| | | // #ifndef APP-NVUE |
| | | if (refresherStatus === Enum.Refresher.Complete) { |
| | | if (this.refresherCompleteSubTimeout) { |
| | | clearTimeout(this.refresherCompleteSubTimeout); |
| | | this.refresherCompleteSubTimeout = null; |
| | | } |
| | | this.refresherCompleteSubTimeout = u.delay(() => { |
| | | this.$nextTick(() => { |
| | | this.refresherStatus = Enum.Refresher.Default; |
| | | this.isRefresherInComplete = false; |
| | | }) |
| | | }, animateDuration * 800); |
| | | } |
| | | // #endif |
| | | this._emitTouchmove({ pullingDistance: 0, dy: this.moveDis }); |
| | | }, refresherCompleteDelay); |
| | | } |
| | | if (setLoading) { |
| | | u.delay(() => this.loading = false, shouldEndLoadingDelay ? 10 : 0); |
| | | isUserPullDown && this._onRestore(); |
| | | } |
| | | }, |
| | | // å¤çè¿å
¥äºæ¥¼ |
| | | _handleGoF2() { |
| | | if (this.showF2 || !this.refresherF2Enabled) return; |
| | | this.$emit('refresherF2Change', 'go'); |
| | | |
| | | if (!this.showRefresherF2) return; |
| | | // #ifndef APP-NVUE |
| | | this.f2Transform = `translateY(${-this.superContentHeight}px)`; |
| | | this.showF2 = true; |
| | | u.delay(() => { |
| | | this.f2Transform = 'translateY(0px)'; |
| | | }, 100, 'f2ShowDelay') |
| | | // #endif |
| | | |
| | | // #ifdef APP-NVUE |
| | | this.showF2 = true; |
| | | this.$nextTick(() => { |
| | | weexAnimation.transition(this.$refs['zp-n-f2'], { |
| | | styles: { transform: `translateY(${-this.superContentHeight}px)` }, |
| | | duration: 0, |
| | | timingFunction: 'linear', |
| | | needLayout: true, |
| | | delay: 0 |
| | | }) |
| | | this.nF2Opacity = 1; |
| | | }) |
| | | u.delay(() => { |
| | | weexAnimation.transition(this.$refs['zp-n-f2'], { |
| | | styles: { transform: 'translateY(0px)' }, |
| | | duration: this.refresherF2Duration, |
| | | timingFunction: 'linear', |
| | | needLayout: true, |
| | | delay: 0 |
| | | }) |
| | | }, 10, 'f2GoDelay') |
| | | // #endif |
| | | }, |
| | | // å¤çéåºäºæ¥¼ |
| | | _handleCloseF2() { |
| | | if (!this.showF2 || !this.refresherF2Enabled) return; |
| | | this.$emit('refresherF2Change', 'close'); |
| | | |
| | | if (!this.showRefresherF2) return; |
| | | // #ifndef APP-NVUE |
| | | this.f2Transform = `translateY(${-this.superContentHeight}px)`; |
| | | // #endif |
| | | |
| | | // #ifdef APP-NVUE |
| | | weexAnimation.transition(this.$refs['zp-n-f2'], { |
| | | styles: { transform: `translateY(${-this.superContentHeight}px)` }, |
| | | duration: this.refresherF2Duration, |
| | | timingFunction: 'linear', |
| | | needLayout: true, |
| | | delay: 0 |
| | | }) |
| | | // #endif |
| | | |
| | | u.delay(() => { |
| | | this.showF2 = false; |
| | | this.nF2Opacity = 0; |
| | | }, this.refresherF2Duration, 'f2CloseDelay') |
| | | }, |
| | | // 模æç¨æ·æå¨è§¦å䏿巿° |
| | | _doRefresherRefreshAnimate() { |
| | | this._cleanRefresherCompleteTimeout(); |
| | | // ç¨æ·å¤çç¨æ·å¨çæ¶é´å
夿¬¡è°ç¨reloadçæ
åµï¼æ¤æ¶ä¸æå·æ°viewä¸éè¦é夿¾ç¤ºï¼åªéè¦ä¿è¯æå䏿¬¡reload对åºç请æ±ç»æåæ¶å䏿巿°viewå³å¯ |
| | | // #ifndef APP-NVUE |
| | | const doRefreshAnimateAfter = !this.doRefreshAnimateAfter && (this.finalShowRefresherWhenReload) && this |
| | | .customRefresherHeight === -1 && this.refresherThreshold === u.addUnit(80, this.unit); |
| | | if (doRefreshAnimateAfter) { |
| | | this.doRefreshAnimateAfter = true; |
| | | return; |
| | | } |
| | | // #endif |
| | | this.refresherRevealStackCount ++; |
| | | // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | this.refresherTransform = `translateY(${this.finalRefresherThreshold}px)`; |
| | | // #endif |
| | | // #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | this.wxsPropType = 'begin' + u.getTime(); |
| | | // #endif |
| | | this.moveDis = this.finalRefresherThreshold; |
| | | this.refresherStatus = Enum.Refresher.Loading; |
| | | this.isTouchmoving = true; |
| | | this.isTouchmovingTimeout && clearTimeout(this.isTouchmovingTimeout); |
| | | this._doRefresherLoad(false); |
| | | }, |
| | | // 触å䏿巿° |
| | | _doRefresherLoad(isUserPullDown = true) { |
| | | this._onRefresh(false, isUserPullDown); |
| | | this.loading = true; |
| | | }, |
| | | // #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 |
| | | // è·åå¤çåçmoveDis |
| | | _getFinalRefresherMoveDis(moveDis) { |
| | | let diffDis = moveDis - this.oldCurrentMoveDis; |
| | | this.oldCurrentMoveDis = moveDis; |
| | | if (diffDis > 0) { |
| | | // æ ¹æ®é
ç½®ç䏿巿°ç¨æ·æå¿ä½ç§»ä¸å®é
éè¦çä½ç§»æ¯çè®¡ç®æç»çdiffDis |
| | | diffDis = diffDis * this.finalRefresherPullRate; |
| | | if (this.currentDis > this.finalRefresherThreshold) { |
| | | diffDis = diffDis * (1 - this.finalRefresherOutRate); |
| | | } |
| | | } |
| | | // æ§å¶diffDisè¿å¤§çæ
åµï¼æ¯å¦è¿å
¥é¡µé¢çªç¶çç¶ä¸æï¼æ¤æ¶diffDisä¸åºè¿è¡å¤ªå¤§çåç§» |
| | | diffDis = diffDis > 100 ? diffDis / 100 : diffDis; |
| | | this.currentDis += diffDis; |
| | | this.currentDis = Math.max(0, this.currentDis); |
| | | return this.currentDis; |
| | | }, |
| | | // 夿touchæå¿æ¯å¦è¦è§¦å |
| | | _touchDisabled() { |
| | | const checkOldScrollTop = this.oldScrollTop > 5; |
| | | return this.loading || this.isRefresherInComplete || this.useChatRecordMode || !this.refresherEnabled || !this.useCustomRefresher ||(this.usePageScroll && this.useCustomRefresher && this.pageScrollTop > 10) || (!(this.usePageScroll && this.useCustomRefresher) && checkOldScrollTop); |
| | | }, |
| | | // #endif |
| | | // æ´æ°èªå®ä¹ä¸æå·æ°viewé«åº¦ |
| | | _updateCustomRefresherHeight() { |
| | | this._getNodeClientRect('.zp-custom-refresher-slot-view').then((res) => { |
| | | this.customRefresherHeight = res ? res[0].height : 0; |
| | | this.showCustomRefresher = this.customRefresherHeight > 0; |
| | | if (this.doRefreshAnimateAfter) { |
| | | this.doRefreshAnimateAfter = false; |
| | | this._doRefresherRefreshAnimate(); |
| | | } |
| | | }); |
| | | }, |
| | | // emit pullingDownäºä»¶ |
| | | _emitTouchmove(e) { |
| | | // #ifndef APP-NVUE |
| | | e.viewHeight = this.finalRefresherThreshold; |
| | | // #endif |
| | | e.rate = e.viewHeight > 0 ? e.pullingDistance / e.viewHeight : 0; |
| | | this.hasTouchmove && this.oldPullingDistance !== e.pullingDistance && this.$emit('refresherTouchmove', e); |
| | | this.oldPullingDistance = e.pullingDistance; |
| | | }, |
| | | // æ¸
é¤refresherCompleteTimeout |
| | | _cleanRefresherCompleteTimeout() { |
| | | this.refresherCompleteTimeout = this._cleanTimeout(this.refresherCompleteTimeout); |
| | | // #ifdef APP-NVUE |
| | | this._nRefresherEnd(false); |
| | | // #endif |
| | | }, |
| | | // æ¸
é¤refresherEndTimeout |
| | | _cleanRefresherEndTimeout() { |
| | | this.refresherEndTimeout = this._cleanTimeout(this.refresherEndTimeout); |
| | | }, |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]scrollç¸å
³æ¨¡å |
| | | import u from '.././z-paging-utils' |
| | | import Enum from '.././z-paging-enum' |
| | | |
| | | // #ifdef APP-NVUE |
| | | const weexDom = weex.requireModule('dom'); |
| | | // #endif |
| | | |
| | | export default { |
| | | props: { |
| | | // 使ç¨é¡µé¢æ»å¨ï¼é»è®¤ä¸ºå¦ï¼å½è®¾ç½®ä¸ºæ¯æ¶å使ç¨é¡µé¢çæ»å¨è鿤ç»ä»¶å
é¨çscroll-viewçæ»å¨ï¼ä½¿ç¨é¡µé¢æ»å¨æ¶z-pagingæ é设置确å®çé«åº¦ä¸å¯¹äºé¿å表å±ç¤ºæ§è½æ´é«ï¼ä½é
ç½®ä¼ç¥å¾®ç¹ç |
| | | usePageScroll: { |
| | | type: Boolean, |
| | | default: u.gc('usePageScroll', false) |
| | | }, |
| | | // æ¯å¦å¯ä»¥æ»å¨ï¼ä½¿ç¨å
ç½®scroll-viewånvueæ¶ææï¼é»è®¤ä¸ºæ¯ |
| | | scrollable: { |
| | | type: Boolean, |
| | | default: u.gc('scrollable', true) |
| | | }, |
| | | // æ§å¶æ¯å¦åºç°æ»å¨æ¡ï¼é»è®¤ä¸ºæ¯ |
| | | showScrollbar: { |
| | | type: Boolean, |
| | | default: u.gc('showScrollbar', true) |
| | | }, |
| | | // æ¯å¦å
è®¸æ¨ªåæ»å¨ï¼é»è®¤ä¸ºå¦ |
| | | scrollX: { |
| | | type: Boolean, |
| | | default: u.gc('scrollX', false) |
| | | }, |
| | | // iOS设å¤ä¸æ»å¨å°é¡¶é¨æ¶æ¯å¦å
许åå¼¹ææï¼é»è®¤ä¸ºå¦ãå
³éåå¼¹ææåå¯ä½¿æ»å¨å°é¡¶é¨ä¸ä¸æå·æ°æ´è¿è´¯ï¼ä½æ¯æå¸é¡¶viewæ¶æ»å¨å°é¡¶é¨æ¶å¯è½åºç°æå¨ã |
| | | scrollToTopBounceEnabled: { |
| | | type: Boolean, |
| | | default: u.gc('scrollToTopBounceEnabled', false) |
| | | }, |
| | | // iOS设å¤ä¸æ»å¨å°åºé¨æ¶æ¯å¦å
许åå¼¹ææï¼é»è®¤ä¸ºæ¯ã |
| | | scrollToBottomBounceEnabled: { |
| | | type: Boolean, |
| | | default: u.gc('scrollToBottomBounceEnabled', true) |
| | | }, |
| | | // å¨è®¾ç½®æ»å¨æ¡ä½ç½®æ¶ä½¿ç¨å¨ç»è¿æ¸¡ï¼é»è®¤ä¸ºå¦ |
| | | scrollWithAnimation: { |
| | | type: Boolean, |
| | | default: u.gc('scrollWithAnimation', false) |
| | | }, |
| | | // å¼åºä¸ºæåå
ç´ idï¼idä¸è½ä»¥æ°åå¼å¤´ï¼ã设置åªä¸ªæ¹å坿»å¨ï¼åå¨åªä¸ªæ¹åæ»å¨å°è¯¥å
ç´ |
| | | scrollIntoView: { |
| | | type: String, |
| | | default: u.gc('scrollIntoView', '') |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | scrollTop: 0, |
| | | oldScrollTop: 0, |
| | | scrollLeft: 0, |
| | | oldScrollLeft: 0, |
| | | scrollViewStyle: {}, |
| | | scrollViewContainerStyle: {}, |
| | | scrollViewInStyle: {}, |
| | | pageScrollTop: -1, |
| | | scrollEnable: true, |
| | | privateScrollWithAnimation: -1, |
| | | cacheScrollNodeHeight: -1, |
| | | superContentHeight: 0, |
| | | } |
| | | }, |
| | | watch: { |
| | | oldScrollTop(newVal) { |
| | | !this.usePageScroll && this._scrollTopChange(newVal,false); |
| | | }, |
| | | pageScrollTop(newVal) { |
| | | this.usePageScroll && this._scrollTopChange(newVal,true); |
| | | }, |
| | | usePageScroll: { |
| | | handler(newVal) { |
| | | this.loaded && this.autoHeight && this._setAutoHeight(!newVal); |
| | | // #ifdef H5 |
| | | if (newVal) { |
| | | this.$nextTick(() => { |
| | | const mainScrollRef = this.$refs['zp-scroll-view'].$refs.main; |
| | | if (mainScrollRef) { |
| | | mainScrollRef.style = {}; |
| | | } |
| | | }) |
| | | } |
| | | // #endif |
| | | }, |
| | | immediate: true |
| | | }, |
| | | finalScrollTop(newVal) { |
| | | this.renderPropScrollTop = newVal < 6 ? 0 : 10; |
| | | } |
| | | }, |
| | | computed: { |
| | | finalScrollWithAnimation() { |
| | | if (this.privateScrollWithAnimation !== -1) { |
| | | return this.privateScrollWithAnimation === 1; |
| | | } |
| | | return this.scrollWithAnimation; |
| | | }, |
| | | finalScrollViewStyle() { |
| | | if (this.superContentZIndex != 1) { |
| | | this.scrollViewStyle['z-index'] = this.superContentZIndex; |
| | | this.scrollViewStyle['position'] = 'relative'; |
| | | } |
| | | return this.scrollViewStyle; |
| | | }, |
| | | finalScrollTop() { |
| | | return this.usePageScroll ? this.pageScrollTop : this.oldScrollTop; |
| | | }, |
| | | // å½åæ¯å¦æ¯æ§çwebview |
| | | finalIsOldWebView() { |
| | | return this.isOldWebView && !this.usePageScroll; |
| | | }, |
| | | // å½åscroll-view/list-viewæ¯å¦å
许æ»å¨ |
| | | finalScrollable() { |
| | | return this.scrollable && !this.usePageScroll && this.scrollEnable |
| | | && (this.refresherCompleteScrollable ? true : this.refresherStatus !== Enum.Refresher.Complete) |
| | | && (this.refresherRefreshingScrollable ? true : this.refresherStatus !== Enum.Refresher.Loading); |
| | | } |
| | | }, |
| | | methods: { |
| | | // æ»å¨å°é¡¶é¨ï¼animate为æ¯å¦å±ç¤ºæ»å¨å¨ç»ï¼é»è®¤ä¸ºæ¯ |
| | | scrollToTop(animate, checkReverse = true) { |
| | | // 妿æ¯èå¤©è®°å½æ¨¡å¼å¹¶ä¸å表åç½®äºï¼åæ»å¨å°é¡¶é¨å®é
䏿¯æ»å¨å°åºé¨ |
| | | if (this.useChatRecordMode && checkReverse && !this.isChatRecordModeAndNotInversion) { |
| | | this.scrollToBottom(animate, false); |
| | | return; |
| | | } |
| | | this.$nextTick(() => { |
| | | this._scrollToTop(animate, false); |
| | | // #ifdef APP-NVUE |
| | | if (this.nvueFastScroll && animate) { |
| | | u.delay(() => { |
| | | this._scrollToTop(false, false); |
| | | }); |
| | | } |
| | | // #endif |
| | | }) |
| | | }, |
| | | // æ»å¨å°åºé¨ï¼animate为æ¯å¦å±ç¤ºæ»å¨å¨ç»ï¼é»è®¤ä¸ºæ¯ |
| | | scrollToBottom(animate, checkReverse = true) { |
| | | // 妿æ¯èå¤©è®°å½æ¨¡å¼å¹¶ä¸å表åç½®äºï¼åæ»å¨å°åºé¨å®é
䏿¯æ»å¨å°é¡¶é¨ |
| | | if (this.useChatRecordMode && checkReverse && !this.isChatRecordModeAndNotInversion) { |
| | | this.scrollToTop(animate, false); |
| | | return; |
| | | } |
| | | this.$nextTick(() => { |
| | | this._scrollToBottom(animate); |
| | | // #ifdef APP-NVUE |
| | | if (this.nvueFastScroll && animate) { |
| | | u.delay(() => { |
| | | this._scrollToBottom(false); |
| | | }); |
| | | } |
| | | // #endif |
| | | }) |
| | | }, |
| | | // æ»å¨å°æå®view(vue䏿æ)ãsel为éè¦æ»å¨çviewçidå¼ï¼ä¸å
å«"#"ï¼offset为åç§»éï¼åä½ä¸ºpxï¼animate为æ¯å¦å±ç¤ºæ»å¨å¨ç»ï¼é»è®¤ä¸ºå¦ |
| | | scrollIntoViewById(sel, offset, animate) { |
| | | this._scrollIntoView(sel, offset, animate); |
| | | }, |
| | | // æ»å¨å°æå®view(vue䏿æ)ãnodeTop为éè¦æ»å¨çviewçtopå¼(éè¿uni.createSelectorQuery()è·å)ï¼offset为åç§»éï¼åä½ä¸ºpxï¼animate为æ¯å¦å±ç¤ºæ»å¨å¨ç»ï¼é»è®¤ä¸ºå¦ |
| | | scrollIntoViewByNodeTop(nodeTop, offset, animate) { |
| | | this.scrollTop = this.oldScrollTop; |
| | | this.$nextTick(() => { |
| | | this._scrollIntoViewByNodeTop(nodeTop, offset, animate); |
| | | }) |
| | | }, |
| | | // yè½´æ»å¨å°æå®ä½ç½®(vue䏿æ)ãy为ä¸é¡¶é¨çè·ç¦»ï¼åä½ä¸ºpxï¼offset为åç§»éï¼åä½ä¸ºpxï¼animate为æ¯å¦å±ç¤ºæ»å¨å¨ç»ï¼é»è®¤ä¸ºå¦ |
| | | scrollToY(y, offset, animate) { |
| | | this.scrollTop = this.oldScrollTop; |
| | | this.$nextTick(() => { |
| | | this._scrollToY(y, offset, animate); |
| | | }) |
| | | }, |
| | | // xè½´æ»å¨å°æå®ä½ç½®(é页颿»å¨ä¸å¨vue䏿æ)ãx为ä¸å·¦ä¾§çè·ç¦»ï¼åä½ä¸ºpxï¼offset为åç§»éï¼åä½ä¸ºpxï¼animate为æ¯å¦å±ç¤ºæ»å¨å¨ç»ï¼é»è®¤ä¸ºå¦ |
| | | scrollToX(x, offset, animate) { |
| | | this.scrollLeft = this.oldScrollLeft; |
| | | this.$nextTick(() => { |
| | | this._scrollToX(x, offset, animate); |
| | | }) |
| | | }, |
| | | // æ»å¨å°æå®view(nvueä¸åèæåè¡¨ä¸ææ)ãindex为éè¦æ»å¨çviewçindex(第å 个ï¼ä»0å¼å§)ï¼offset为åç§»éï¼åä½ä¸ºpxï¼animate为æ¯å¦å±ç¤ºæ»å¨å¨ç»ï¼é»è®¤ä¸ºå¦ |
| | | scrollIntoViewByIndex(index, offset, animate) { |
| | | if (index >= this.realTotalData.length) { |
| | | u.consoleErr('å½åæ»å¨çindexè¶
åºå·²æ¸²æå表é¿åº¦ï¼è¯·å
éè¿refreshToPageå è½½å°å¯¹åºindex页并çå¾
渲ææåååè°ç¨æ¤æ¹æ³ï¼'); |
| | | return; |
| | | } |
| | | this.$nextTick(() => { |
| | | // #ifdef APP-NVUE |
| | | // å¨nvueä¸ï¼æ ¹æ®indexè·å对åºèç¹ä¿¡æ¯å¹¶æ»å¨å°æ¤èç¹ä½ç½® |
| | | this._scrollIntoView(index, offset, animate); |
| | | // #endif |
| | | // #ifndef APP-NVUE |
| | | if (this.finalUseVirtualList) { |
| | | const isCellFixed = this.cellHeightMode === Enum.CellHeightMode.Fixed; |
| | | u.delay(() => { |
| | | if (this.finalUseVirtualList) { |
| | | // èæå表 + æ¯ä¸ªcellé«åº¦å®å
¨ç¸å模å¼ä¸ï¼æ¤æ¶æ»å¨å°å¯¹åºindexçcellå°±æ¯æ»å¨å°scrollTop = cellHeight * indexçä½ç½® |
| | | // èæå表 + é«åº¦æ¯å¨æéåºå®ç模å¼ä¸ï¼æ¤æ¶æ»å¨å°å¯¹åºindexçcellå°±æ¯æ»å¨å°scrollTop = ç¼åçcellé«åº¦æ°ç»ä¸ç¬¬index个çlastTotalHeightçä½ç½® |
| | | const scrollTop = isCellFixed ? this.virtualCellHeight * index : this.virtualHeightCacheList[index].lastTotalHeight; |
| | | this.scrollToY(scrollTop, offset, animate); |
| | | } |
| | | }, isCellFixed ? 0 : 100) |
| | | } |
| | | // #endif |
| | | }) |
| | | }, |
| | | // æ»å¨å°æå®view(nvue䏿æ)ãview为éè¦æ»å¨çview(éè¿`this.$refs.xxx`è·å)ï¼ä¸å
å«"#"ï¼offset为åç§»éï¼åä½ä¸ºpxï¼animate为æ¯å¦å±ç¤ºæ»å¨å¨ç»ï¼é»è®¤ä¸ºå¦ |
| | | scrollIntoViewByView(view, offset, animate) { |
| | | this._scrollIntoView(view, offset, animate); |
| | | }, |
| | | // å½ä½¿ç¨é¡µé¢æ»å¨å¹¶ä¸èªå®ä¹ä¸æå·æ°æ¶ï¼è¯·å¨é¡µé¢çonPageScrollä¸è°ç¨æ¤æ¹æ³ï¼åç¥z-pagingå½åçpageScrollTopï¼å¦åä¼å¯¼è´å¨ä»»æä½ç½®é½å¯ä»¥ä¸æå·æ° |
| | | updatePageScrollTop(value) { |
| | | this.pageScrollTop = value; |
| | | }, |
| | | // å½ä½¿ç¨é¡µé¢æ»å¨å¹¶ä¸è®¾ç½®äºslot="top"æ¶ï¼é»è®¤å次å è½½ä¼èªå¨è·åå
¶é«åº¦ï¼å¹¶ä½¿å
é¨å®¹å¨ä¸ç§»ï¼å½slot="top"çviewé«åº¦å¨ææ¹åæ¶ï¼å¨å
¶é«åº¦éè¦æ´æ°æ¶è°ç¨æ¤æ¹æ³ |
| | | updatePageScrollTopHeight() { |
| | | this._updatePageScrollTopOrBottomHeight('top'); |
| | | }, |
| | | // å½ä½¿ç¨é¡µé¢æ»å¨å¹¶ä¸è®¾ç½®äºslot="bottom"æ¶ï¼é»è®¤å次å è½½ä¼èªå¨è·åå
¶é«åº¦ï¼å¹¶ä½¿å
é¨å®¹å¨ä¸ç§»ï¼å½slot="bottom"çviewé«åº¦å¨ææ¹åæ¶ï¼å¨å
¶é«åº¦éè¦æ´æ°æ¶è°ç¨æ¤æ¹æ³ |
| | | updatePageScrollBottomHeight() { |
| | | this._updatePageScrollTopOrBottomHeight('bottom'); |
| | | }, |
| | | // æ´æ°slot="left"åslot="right"宽度ï¼å½slot="left"æslot="right"å®½åº¦å¨ææ¹åæ¶è°ç¨ |
| | | updateLeftAndRightWidth() { |
| | | if (!this.finalIsOldWebView) return; |
| | | this.$nextTick(() => this._updateLeftAndRightWidth(this.scrollViewContainerStyle, 'zp-page')); |
| | | }, |
| | | // æ´æ°z-pagingå
ç½®scroll-viewçscrollTop |
| | | updateScrollViewScrollTop(scrollTop, animate = true) { |
| | | this._updatePrivateScrollWithAnimation(animate); |
| | | this.scrollTop = this.oldScrollTop; |
| | | this.$nextTick(() => { |
| | | this.scrollTop = scrollTop; |
| | | this.oldScrollTop = this.scrollTop; |
| | | }); |
| | | }, |
| | | |
| | | // 彿»å¨å°é¡¶é¨æ¶ |
| | | _onScrollToUpper() { |
| | | this._emitScrollEvent('scrolltoupper'); |
| | | this.$emit('scrollTopChange', 0); |
| | | this.$nextTick(() => { |
| | | this.oldScrollTop = 0; |
| | | }) |
| | | }, |
| | | // 彿»å¨å°åºé¨æ¶ |
| | | _onScrollToLower(e) { |
| | | (!e.detail || !e.detail.direction || e.detail.direction === 'bottom') |
| | | && this.toBottomLoadingMoreEnabled |
| | | && this._onLoadingMore(this.useChatRecordMode ? 'click' : 'toBottom') |
| | | }, |
| | | // æ»å¨å°é¡¶é¨ |
| | | _scrollToTop(animate = true, isPrivate = true) { |
| | | // #ifdef APP-NVUE |
| | | // å¨nvueä¸éè¦éè¿weex.scrollToElementæ»å¨å°é¡¶é¨ï¼æ¤æ¶å¨é¡¶é¨æå
¥äºä¸ä¸ªviewï¼ä½¿å¾æ»å¨å°è¿ä¸ªviewä½ç½® |
| | | const el = this.$refs['zp-n-list-top-tag']; |
| | | if (this.usePageScroll) { |
| | | this._getNodeClientRect('zp-page-scroll-top', false).then(node => { |
| | | const nodeHeight = node ? node[0].height : 0; |
| | | weexDom.scrollToElement(el, { |
| | | offset: -nodeHeight, |
| | | animated: animate |
| | | }); |
| | | }); |
| | | } else { |
| | | if (!this.isIos && this.nvueListIs === 'scroller') { |
| | | this._getNodeClientRect('zp-n-refresh-container', false).then(node => { |
| | | const nodeHeight = node ? node[0].height : 0; |
| | | weexDom.scrollToElement(el, { |
| | | offset: -nodeHeight, |
| | | animated: animate |
| | | }); |
| | | }); |
| | | } else { |
| | | weexDom.scrollToElement(el, { |
| | | offset: 0, |
| | | animated: animate |
| | | }); |
| | | } |
| | | } |
| | | return; |
| | | // #endif |
| | | if (this.usePageScroll) { |
| | | this.$nextTick(() => { |
| | | uni.pageScrollTo({ |
| | | scrollTop: 0, |
| | | duration: animate ? 100 : 0, |
| | | }); |
| | | }); |
| | | return; |
| | | } |
| | | this._updatePrivateScrollWithAnimation(animate); |
| | | this.scrollTop = this.oldScrollTop; |
| | | this.$nextTick(() => { |
| | | this.scrollTop = 0; |
| | | this.oldScrollTop = this.scrollTop; |
| | | }); |
| | | }, |
| | | // æ»å¨å°åºé¨ |
| | | async _scrollToBottom(animate = true) { |
| | | // #ifdef APP-NVUE |
| | | // å¨nvueä¸éè¦éè¿weex.scrollToElementæ»å¨å°é¡¶é¨ï¼æ¤æ¶å¨åºé¨æå
¥äºä¸ä¸ªviewï¼ä½¿å¾æ»å¨å°è¿ä¸ªviewä½ç½® |
| | | const el = this.$refs['zp-n-list-bottom-tag']; |
| | | if (el) { |
| | | weexDom.scrollToElement(el, { |
| | | offset: 0, |
| | | animated: animate |
| | | }); |
| | | } else { |
| | | u.consoleErr('æ»å¨å°åºé¨å¤±è´¥ï¼å 为æ¨è®¾ç½®äºhideNvueBottomTag为true'); |
| | | } |
| | | return; |
| | | // #endif |
| | | if (this.usePageScroll) { |
| | | this.$nextTick(() => { |
| | | uni.pageScrollTo({ |
| | | scrollTop: Number.MAX_VALUE, |
| | | duration: animate ? 100 : 0, |
| | | }); |
| | | }); |
| | | return; |
| | | } |
| | | try { |
| | | this._updatePrivateScrollWithAnimation(animate); |
| | | const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container'); |
| | | const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view'); |
| | | const pagingContainerH = pagingContainerNode ? pagingContainerNode[0].height : 0; |
| | | const scrollViewH = scrollViewNode ? scrollViewNode[0].height : 0; |
| | | if (pagingContainerH > scrollViewH) { |
| | | this.scrollTop = this.oldScrollTop; |
| | | this.$nextTick(() => { |
| | | this.scrollTop = pagingContainerH - scrollViewH + this.virtualPlaceholderTopHeight; |
| | | this.oldScrollTop = this.scrollTop; |
| | | }); |
| | | } |
| | | } catch (e) {} |
| | | }, |
| | | // æ»å¨å°æå®view |
| | | _scrollIntoView(sel, offset = 0, animate = false, finishCallback) { |
| | | try { |
| | | this.scrollTop = this.oldScrollTop; |
| | | this.$nextTick(() => { |
| | | // #ifdef APP-NVUE |
| | | const refs = this.$parent.$refs; |
| | | if (!refs) return; |
| | | const dataType = Object.prototype.toString.call(sel); |
| | | let el = null; |
| | | if (dataType === '[object Number]') { |
| | | const els = refs[`z-paging-${sel}`]; |
| | | el = els ? els[0] : null; |
| | | } else if (dataType === '[object Array]') { |
| | | el = sel[0]; |
| | | } else { |
| | | el = sel; |
| | | } |
| | | if (el) { |
| | | weexDom.scrollToElement(el, { |
| | | offset: -offset, |
| | | animated: animate |
| | | }); |
| | | } else { |
| | | u.consoleErr('å¨nvue䏿»å¨å°æå®ä½ç½®ï¼cellå¿
须设置 :ref="`z-paging-${index}`"'); |
| | | } |
| | | return; |
| | | // #endif |
| | | this._getNodeClientRect('#' + sel.replace('#', ''), this.$parent).then((node) => { |
| | | if (node) { |
| | | let nodeTop = node[0].top; |
| | | this._scrollIntoViewByNodeTop(nodeTop, offset, animate); |
| | | finishCallback && finishCallback(); |
| | | } |
| | | }); |
| | | }); |
| | | } catch (e) {} |
| | | }, |
| | | // éè¿nodeTopæ»å¨å°æå®view |
| | | _scrollIntoViewByNodeTop(nodeTop, offset = 0, animate = false) { |
| | | // 妿æ¯èå¤©è®°å½æ¨¡å¼å¹¶ä¸å表åç½®äºï¼æ¤æ¶nodeTopéè¦çäºscroll-viewé«åº¦ - nodeTop |
| | | if (this.isChatRecordModeAndInversion) { |
| | | this._getNodeClientRect('.zp-scroll-view').then(sNode => { |
| | | if (sNode) { |
| | | this._scrollToY(sNode[0].height - nodeTop, offset, animate, true); |
| | | } |
| | | }) |
| | | } else { |
| | | this._scrollToY(nodeTop, offset, animate, true); |
| | | } |
| | | }, |
| | | // yè½´æ»å¨å°æå®ä½ç½® |
| | | _scrollToY(y, offset = 0, animate = false, addScrollTop = false) { |
| | | this._updatePrivateScrollWithAnimation(animate); |
| | | u.delay(() => { |
| | | if (this.usePageScroll) { |
| | | if (addScrollTop && this.pageScrollTop !== -1) { |
| | | y += this.pageScrollTop; |
| | | } |
| | | const scrollTop = y - offset; |
| | | uni.pageScrollTo({ |
| | | scrollTop, |
| | | duration: animate ? 100 : 0 |
| | | }); |
| | | } else { |
| | | if (addScrollTop) { |
| | | y += this.oldScrollTop; |
| | | } |
| | | this.scrollTop = y - offset; |
| | | } |
| | | }, 10) |
| | | }, |
| | | // xè½´æ»å¨å°æå®ä½ç½® |
| | | _scrollToX(x, offset = 0, animate = false) { |
| | | this._updatePrivateScrollWithAnimation(animate); |
| | | u.delay(() => { |
| | | if (!this.usePageScroll) { |
| | | this.scrollLeft = x - offset; |
| | | } else { |
| | | u.consoleErr('使ç¨é¡µé¢æ»å¨æ¶ä¸æ¯æscrollToX'); |
| | | } |
| | | }, 10) |
| | | }, |
| | | // scroll-viewæ»å¨ä¸ |
| | | _scroll(e) { |
| | | this.$emit('scroll', e); |
| | | const { scrollTop, scrollLeft } = e.detail; |
| | | // #ifndef APP-NVUE |
| | | this.finalUseVirtualList && this._updateVirtualScroll(scrollTop, this.oldScrollTop - scrollTop); |
| | | // #endif |
| | | this.oldScrollTop = scrollTop; |
| | | this.oldScrollLeft = scrollLeft; |
| | | // æ»å¨åºåå
å®¹çæ»é«åº¦ - å½åæ»å¨çscrollTop = å½åæ»å¨åºåçé¡¶é¨ä¸å
容åºé¨çè·ç¦» |
| | | const scrollDiff = e.detail.scrollHeight - this.oldScrollTop; |
| | | // å¨éios平尿»å¨ä¸ï¼å次éªè¯ä¸ä¸æ¯å¦æ»å¨å°äºåºé¨ãå 为å¨ä¸äºå®å设å¤ä¸ï¼ææ¦çæ»å¨å°åºé¨ä¸è§¦å@scrolltoloweräºä»¶ï¼å æ¤æ·»å å鿣æµé»è¾ |
| | | !this.isIos && this._checkScrolledToBottom(scrollDiff); |
| | | }, |
| | | // emit scrolltolower/scrolltoupperäºä»¶ |
| | | _emitScrollEvent(type) { |
| | | const reversedType = type === 'scrolltolower' ? 'scrolltoupper' : 'scrolltolower'; |
| | | const eventType = this.useChatRecordMode && !this.isChatRecordModeAndNotInversion |
| | | ? reversedType |
| | | : type; |
| | | |
| | | this.$emit(eventType); |
| | | }, |
| | | // æ´æ°å
ç½®çscroll-viewæ¯å¦å¯ç¨æ»å¨å¨ç» |
| | | _updatePrivateScrollWithAnimation(animate) { |
| | | this.privateScrollWithAnimation = animate ? 1 : 0; |
| | | u.delay(() => this.$nextTick(() => { |
| | | // 卿»å¨ç»æåå°æ»å¨å¨ç»ç¶æè®¾ç½®ååå§ç¶æ |
| | | this.privateScrollWithAnimation = -1; |
| | | }), 100, 'updateScrollWithAnimationDelay') |
| | | }, |
| | | // æ£æµscrollViewæ¯å¦è¦éºæ»¡å±å¹ |
| | | _doCheckScrollViewShouldFullHeight(totalData) { |
| | | if (this.autoFullHeight && this.usePageScroll && this.isTotalChangeFromAddData) { |
| | | // #ifndef APP-NVUE |
| | | this.$nextTick(() => { |
| | | this._checkScrollViewShouldFullHeight((scrollViewNode, pagingContainerNode) => { |
| | | this._preCheckShowNoMoreInside(totalData, scrollViewNode, pagingContainerNode) |
| | | }); |
| | | }) |
| | | // #endif |
| | | // #ifdef APP-NVUE |
| | | this._preCheckShowNoMoreInside(totalData) |
| | | // #endif |
| | | } else { |
| | | this._preCheckShowNoMoreInside(totalData) |
| | | } |
| | | }, |
| | | // æ£æµz-pagingæ¯å¦è¦å
¨å±è¦ç(å½ä½¿ç¨é¡µé¢æ»å¨å¹¶ä¸ä¸æ»¡å
¨å±æ¶ï¼é»è®¤z-pagingéè¦éºæ»¡å
¨å±ï¼é¿å
æ°æ®è¿å°æ¶å
é¨çempty-viewæ æ³æ£ç¡®å±ç¤º) |
| | | async _checkScrollViewShouldFullHeight(callback) { |
| | | try { |
| | | const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view'); |
| | | const pagingContainerNode = await this._getNodeClientRect('.zp-paging-container-content'); |
| | | if (!scrollViewNode || !pagingContainerNode) return; |
| | | const scrollViewHeight = pagingContainerNode[0].height; |
| | | const scrollViewTop = scrollViewNode[0].top; |
| | | if (this.isAddedData && scrollViewHeight + scrollViewTop <= this.windowHeight) { |
| | | this._setAutoHeight(true, scrollViewNode); |
| | | callback(scrollViewNode, pagingContainerNode); |
| | | } else { |
| | | this._setAutoHeight(false); |
| | | callback(null, null); |
| | | } |
| | | } catch (e) { |
| | | callback(null, null); |
| | | } |
| | | }, |
| | | // æ´æ°ç¼åä¸z-pagingæ´ä¸ªå
容容å¨é«åº¦ |
| | | async _updateCachedSuperContentHeight() { |
| | | const superContentNode = await this._getNodeClientRect('.z-paging-content'); |
| | | if (superContentNode) { |
| | | this.superContentHeight = superContentNode[0].height; |
| | | } |
| | | }, |
| | | // scrollTopæ¹åæ¶è§¦å |
| | | _scrollTopChange(newVal, isPageScrollTop){ |
| | | this.$emit('scrollTopChange', newVal); |
| | | this.$emit('update:scrollTop', newVal); |
| | | this._checkShouldShowBackToTop(newVal); |
| | | // ä¹åå¨å®åä¸scroll-viewææ¦çæ»å¨å°é¡¶é¨æ¶scrollTopä¸ä¸º0导è´ä¸æå·æ°å¤æå¼å¸¸ï¼å æ¤å¤æscrollTopå¨105ä¹å
é½å
è®¸ä¸æå·æ°ï¼ä½æ¤æ¹æ¡ä¼å¯¼è´æäºæ
åµï¼ä¾å¦æ»å¨å°è·ç¦»é¡¶é¨10pxå¤ï¼ä¸ææå¨ï¼å æ¤æ¹ä¸ºéè¿è·åzp-scroll-viewçèç¹ä¿¡æ¯ä¸çscrollTopè¿è¡éªè¯çæ¹æ¡ |
| | | // const scrollTop = this.isIos ? (newVal > 5 ? 6 : 0) : (newVal > 105 ? 106 : (newVal > 5 ? 6 : 0)); |
| | | const scrollTop = newVal > 5 ? 6 : 0; |
| | | if (isPageScrollTop && this.wxsPageScrollTop !== scrollTop) { |
| | | this.wxsPageScrollTop = scrollTop; |
| | | } else if (!isPageScrollTop && this.wxsScrollTop !== scrollTop) { |
| | | this.wxsScrollTop = scrollTop; |
| | | if (scrollTop > 6) { |
| | | this.scrollEnable = true; |
| | | } |
| | | } |
| | | }, |
| | | // æ´æ°ä½¿ç¨é¡µé¢æ»å¨æ¶slot="top"æ"bottom"æå
¥viewçé«åº¦ |
| | | _updatePageScrollTopOrBottomHeight(type) { |
| | | // #ifndef APP-NVUE |
| | | if (!this.usePageScroll) return; |
| | | // #endif |
| | | this._doCheckScrollViewShouldFullHeight(this.realTotalData); |
| | | const node = `.zp-page-${type}`; |
| | | const marginText = `margin${type.slice(0,1).toUpperCase() + type.slice(1)}`; |
| | | let safeAreaInsetBottomAdd = this.safeAreaInsetBottom; |
| | | this.$nextTick(() => { |
| | | let delayTime = 0; |
| | | // #ifdef MP-BAIDU || APP-NVUE |
| | | delayTime = 50; |
| | | // #endif |
| | | u.delay(() => { |
| | | this._getNodeClientRect(node).then((res) => { |
| | | if (res) { |
| | | let pageScrollNodeHeight = res[0].height; |
| | | if (type === 'bottom') { |
| | | if (safeAreaInsetBottomAdd) { |
| | | pageScrollNodeHeight += this.safeAreaBottom; |
| | | } |
| | | } else { |
| | | this.cacheTopHeight = pageScrollNodeHeight; |
| | | } |
| | | this.$set(this.scrollViewStyle, marginText, `${pageScrollNodeHeight}px`); |
| | | } else if (safeAreaInsetBottomAdd) { |
| | | this.$set(this.scrollViewStyle, marginText, `${this.safeAreaBottom}px`); |
| | | } |
| | | }); |
| | | }, delayTime) |
| | | }) |
| | | }, |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]èæå表模å |
| | | import u from '.././z-paging-utils' |
| | | import c from '.././z-paging-constant' |
| | | import Enum from '.././z-paging-enum' |
| | | |
| | | export default { |
| | | props: { |
| | | // æ¯å¦ä½¿ç¨èæå表ï¼é»è®¤ä¸ºå¦ |
| | | useVirtualList: { |
| | | type: Boolean, |
| | | default: u.gc('useVirtualList', false) |
| | | }, |
| | | // å¨ä½¿ç¨èæå表æ¶ï¼æ¯å¦ä½¿ç¨å
¼å®¹æ¨¡å¼ï¼é»è®¤ä¸ºå¦ |
| | | useCompatibilityMode: { |
| | | type: Boolean, |
| | | default: u.gc('useCompatibilityMode', false) |
| | | }, |
| | | // 使ç¨å
¼å®¹æ¨¡å¼æ¶ä¼ éçéå æ°æ® |
| | | extraData: { |
| | | type: Object, |
| | | default: u.gc('extraData', {}) |
| | | }, |
| | | // æ¯å¦å¨z-pagingå
é¨å¾ªç¯æ¸²æå表(å
ç½®å表)ï¼é»è®¤ä¸ºå¦ãè¥use-virtual-list为trueï¼åæ¤é¡¹æä¸ºtrue |
| | | useInnerList: { |
| | | type: Boolean, |
| | | default: u.gc('useInnerList', false) |
| | | }, |
| | | // 强å¶å
³éinner-listï¼é»è®¤ä¸ºfalseï¼å¦æä¸ºtrueå°å¼ºå¶å
³éinnerListï¼éç¨äºå¼å¯äºèæå表åéè¦å¼ºå¶å
³éinner-listçæ
åµ |
| | | forceCloseInnerList: { |
| | | type: Boolean, |
| | | default: u.gc('forceCloseInnerList', false) |
| | | }, |
| | | // å
ç½®å表cellçkeyåç§°ï¼ä»
nvueææï¼å¨nvueä¸å¼å¯use-inner-listæ¶å¿
须填æ¤é¡¹ |
| | | cellKeyName: { |
| | | type: String, |
| | | default: u.gc('cellKeyName', '') |
| | | }, |
| | | // innerListæ ·å¼ |
| | | innerListStyle: { |
| | | type: Object, |
| | | default: u.gc('innerListStyle', {}) |
| | | }, |
| | | // innerCellæ ·å¼ |
| | | innerCellStyle: { |
| | | type: Object, |
| | | default: u.gc('innerCellStyle', {}) |
| | | }, |
| | | // é¢å è½½çå表å¯è§èå´(å表é«åº¦)页æ°ï¼é»è®¤ä¸º12ï¼å³é¢å è½½å½å页åä¸ä¸å12页çcellãæ¤æ°å¼è¶å¤§ï¼åèæå表ä¸å è½½çdomè¶å¤ï¼å
åæ¶èè¶å¤§(ä¼ç»´æå¨ä¸ä¸ªç¨³å®å¼)ï¼ä½å¢å é¢å è½½é¡µé¢æ°éå¯ç¼è§£å¿«éæ»å¨çæç½å±é®é¢ |
| | | preloadPage: { |
| | | type: [Number, String], |
| | | default: u.gc('preloadPage', 12), |
| | | validator: (value) => { |
| | | if (value <= 0) u.consoleErr('preload-pageå¿
须大äº0ï¼'); |
| | | return value > 0; |
| | | } |
| | | }, |
| | | // èæå表cellé«åº¦æ¨¡å¼ï¼é»è®¤ä¸ºfixedï¼ä¹å°±æ¯æ¯ä¸ªcellé«åº¦å®å
¨ç¸åï¼å°ä»¥ç¬¬ä¸ä¸ªcellé«åº¦ä¸ºåè¿è¡è®¡ç®ãå¯éå¼ãdynamicãï¼å³ä»£è¡¨é«åº¦æ¯å¨æéåºå®çï¼ãdynamicãæ§è½ä½äºãfixedãã |
| | | cellHeightMode: { |
| | | type: String, |
| | | default: u.gc('cellHeightMode', Enum.CellHeightMode.Fixed) |
| | | }, |
| | | // åºå®çcellé«åº¦ï¼cellHeightMode=fixedæææï¼è¥è®¾ç½®äºå¼ï¼åä¸è®¡ç®ç¬¬ä¸ä¸ªcellé«åº¦è使ç¨è®¾ç½®çcellé«åº¦ |
| | | fixedCellHeight: { |
| | | type: [Number, String], |
| | | default: u.gc('fixedCellHeight', 0) |
| | | }, |
| | | // èæåè¡¨åæ°ï¼é»è®¤ä¸º1ã常ç¨äºæ¯è¡æå¤åçæ
åµï¼ä¾å¦æ¯è¡æ2åæ°æ®ï¼éè¦å°æ¤å¼è®¾ç½®ä¸º2 |
| | | virtualListCol: { |
| | | type: [Number, String], |
| | | default: u.gc('virtualListCol', 1) |
| | | }, |
| | | // èæå表scrollåæ ·å¸§çï¼é»è®¤ä¸º80ï¼è¿ä½å®¹æåºç°ç½å±é®é¢ï¼è¿é«å®¹æåºç°å¡é¡¿é®é¢ |
| | | virtualScrollFps: { |
| | | type: [Number, String], |
| | | default: u.gc('virtualScrollFps', 80) |
| | | }, |
| | | // èæå表cell idçåç¼ï¼éç¨äºä¸ä¸ªé¡µé¢æå¤ä¸ªèæå表çæ
åµï¼ç¨ä»¥åºåä¸åèæå表cellçidï¼æ³¨æï¼è¯·å¿ä¼ æ°åæä»¥æ°åå¼å¤´çå符串ãå¦è®¾ç½®ä¸ºlist1ï¼åcellçidåºä¸ºï¼list1-zp-id-${item.zp_index} |
| | | virtualCellIdPrefix: { |
| | | type: String, |
| | | default: u.gc('virtualCellIdPrefix', '') |
| | | }, |
| | | // èæå表æ¯å¦ä½¿ç¨swiper-itemå
裹ï¼é»è®¤ä¸ºå¦ï¼æ¤å±æ§ä¸ºäºè§£å³vue3+(微信å°ç¨åºæQQå°ç¨åº)ä¸ï¼ä½¿ç¨éå
ç½®åè¡¨åæ³æ¶ï¼è¥z-pagingå¨swiper-itemå
å卿 æ³è·åslotæå
¥çcellé«åº¦è¿è导è´èæå表失败çé®é¢ |
| | | // ä»
vue3+(微信å°ç¨åºæQQå°ç¨åº)+éå
ç½®åè¡¨åæ³èæå表ææï¼å
¶ä»æ
嵿¤å±æ§è®¾ç½®ä»»ä½å¼é½æ æï¼æä»¥å¦ææ¨å¨swiper-itemå
使ç¨z-pagingçéå
ç½®èæåè¡¨åæ³ï¼å°æ¤å±æ§è®¾ç½®ä¸ºtrueå³å¯ |
| | | virtualInSwiperSlot: { |
| | | type: Boolean, |
| | | default: false |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | virtualListKey: u.getInstanceId(), |
| | | virtualPageHeight: 0, |
| | | virtualCellHeight: 0, |
| | | virtualScrollTimeStamp: 0, |
| | | |
| | | virtualList: [], |
| | | virtualPlaceholderTopHeight: 0, |
| | | virtualPlaceholderBottomHeight: 0, |
| | | virtualTopRangeIndex: 0, |
| | | virtualBottomRangeIndex: 0, |
| | | lastVirtualTopRangeIndex: 0, |
| | | lastVirtualBottomRangeIndex: 0, |
| | | virtualItemInsertedCount: 0, |
| | | |
| | | virtualHeightCacheList: [], |
| | | |
| | | getCellHeightRetryCount: { |
| | | fixed: 0, |
| | | dynamic: 0 |
| | | }, |
| | | pagingOrgTop: -1, |
| | | updateVirtualListFromDataChange: false |
| | | } |
| | | }, |
| | | watch: { |
| | | // ç嬿»æ°æ®çæ¹åï¼å·æ°èæå表å¸å± |
| | | realTotalData() { |
| | | this.updateVirtualListRender(); |
| | | }, |
| | | // çå¬èæåè¡¨æ¸²ææ°ç»çæ¹åå¹¶emit |
| | | virtualList(newVal){ |
| | | this.$emit('update:virtualList', newVal); |
| | | this.$emit('virtualListChange', newVal); |
| | | }, |
| | | // çå¬èæå表顶é¨å ä½é«åº¦æ¹åå¹¶emit |
| | | virtualPlaceholderTopHeight(newVal) { |
| | | this.$emit('virtualTopHeightChange', newVal); |
| | | } |
| | | }, |
| | | computed: { |
| | | virtualCellIndexKey() { |
| | | return c.listCellIndexKey; |
| | | }, |
| | | finalUseVirtualList() { |
| | | if (this.useVirtualList && this.usePageScroll){ |
| | | u.consoleErr('使ç¨é¡µé¢æ»å¨æ¶ï¼å¼å¯èæåè¡¨æ æï¼'); |
| | | } |
| | | return this.useVirtualList && !this.usePageScroll; |
| | | }, |
| | | finalUseInnerList() { |
| | | return this.useInnerList || (this.finalUseVirtualList && !this.forceCloseInnerList); |
| | | }, |
| | | finalCellKeyName() { |
| | | // #ifdef APP-NVUE |
| | | if (this.finalUseVirtualList && !this.cellKeyName.length){ |
| | | u.consoleErr('å¨nvueä¸å¼å¯use-virtual-listå¿
须设置cell-key-nameï¼å¦åå°å¯è½å¯¼è´å表渲æé误ï¼'); |
| | | } |
| | | // #endif |
| | | return this.cellKeyName; |
| | | }, |
| | | finalVirtualPageHeight(){ |
| | | return this.virtualPageHeight > 0 ? this.virtualPageHeight : this.windowHeight; |
| | | }, |
| | | finalFixedCellHeight() { |
| | | return u.convertToPx(this.fixedCellHeight); |
| | | }, |
| | | fianlVirtualCellIdPrefix() { |
| | | const prefix = this.virtualCellIdPrefix ? this.virtualCellIdPrefix + '-' : ''; |
| | | return prefix + 'zp-id'; |
| | | }, |
| | | finalPlaceholderTopHeightStyle() { |
| | | // #ifdef VUE2 |
| | | return { transform: this.virtualPlaceholderTopHeight > 0 ? `translateY(${this.virtualPlaceholderTopHeight}px)` : 'none' }; |
| | | // #endif |
| | | return {}; |
| | | }, |
| | | virtualRangePageHeight(){ |
| | | return this.finalVirtualPageHeight * this.preloadPage; |
| | | }, |
| | | virtualScrollDisTimeStamp() { |
| | | return 1000 / this.virtualScrollFps; |
| | | } |
| | | }, |
| | | methods: { |
| | | // å¨ä½¿ç¨å¨æé«åº¦èæå表æ¶ï¼è¥å¨å表æ°ç»ä¸éè¦æå
¥æä¸ªitemï¼éè¦è°ç¨æ¤æ¹æ³ï¼item:éè¦æå
¥çitemï¼index:æå
¥çcellä½ç½®ï¼è¥index为2ï¼åæå
¥çitemå¨ålistçindex=1ä¹åï¼indexä»0å¼å§ |
| | | doInsertVirtualListItem(item, index) { |
| | | if (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return; |
| | | this.realTotalData.splice(index, 0, item); |
| | | // #ifdef VUE3 |
| | | this.realTotalData = [...this.realTotalData]; |
| | | // #endif |
| | | this.virtualItemInsertedCount ++; |
| | | if (!item || Object.prototype.toString.call(item) !== '[object Object]') { |
| | | item = { item }; |
| | | } |
| | | const cellIndexKey = this.virtualCellIndexKey; |
| | | item[cellIndexKey] = `custom-${this.virtualItemInsertedCount}`; |
| | | item[c.listCellIndexUniqueKey] = `${this.virtualListKey}-${item[cellIndexKey]}`; |
| | | this.$nextTick(async () => { |
| | | let retryCount = 0; |
| | | while (retryCount <= 10) { |
| | | await u.wait(c.delayTime); |
| | | |
| | | const cellNode = await this._getVirtualCellNodeByIndex(item[cellIndexKey]); |
| | | // 妿è·åå½åcellçèç¹ä¿¡æ¯å¤±è´¥ï¼åéè¯ï¼ä¸è¶
è¿10æ¬¡ï¼ |
| | | if (!cellNode) { |
| | | retryCount ++; |
| | | continue; |
| | | } |
| | | |
| | | const currentHeight = cellNode ? cellNode[0].height : 0; |
| | | const lastHeightCache = this.virtualHeightCacheList[index - 1]; |
| | | const lastTotalHeight = lastHeightCache ? lastHeightCache.totalHeight : 0; |
| | | // å¨ç¼åçcellé«åº¦æ°ç»ä¸ï¼æå
¥æ¤cellé«åº¦ä¿¡æ¯ |
| | | this.virtualHeightCacheList.splice(index, 0, { |
| | | height: currentHeight, |
| | | lastTotalHeight, |
| | | totalHeight: lastTotalHeight + currentHeight |
| | | }); |
| | | |
| | | // ä»å½åindexèµ·åç»çcellç¼åé«åº¦çlastTotalHeightåtotalHeightéè¦å ä¸å½åcellçé«åº¦ |
| | | for (let i = index + 1; i < this.virtualHeightCacheList.length; i++) { |
| | | const thisNode = this.virtualHeightCacheList[i]; |
| | | thisNode.lastTotalHeight += currentHeight; |
| | | thisNode.totalHeight += currentHeight; |
| | | } |
| | | |
| | | this._updateVirtualScroll(this.oldScrollTop); |
| | | break; |
| | | } |
| | | }) |
| | | }, |
| | | // å¨ä½¿ç¨å¨æé«åº¦èæå表æ¶ï¼æå¨æ´æ°æå®cellçç¼åé«åº¦(å½cellé«åº¦å¨åå§åä¹å忬¡æ¹ååè°ç¨)ï¼index:éè¦æ´æ°çcellå¨å表ä¸çä½ç½®ï¼ä»0å¼å§ |
| | | didUpdateVirtualListCell(index) { |
| | | if (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return; |
| | | const currentNode = this.virtualHeightCacheList[index]; |
| | | this.$nextTick(() => { |
| | | this._getVirtualCellNodeByIndex(index).then(cellNode => { |
| | | // æ´æ°å½åcellçé«åº¦ |
| | | const cellNodeHeight = cellNode ? cellNode[0].height : 0; |
| | | const heightDis = cellNodeHeight - currentNode.height; |
| | | currentNode.height = cellNodeHeight; |
| | | currentNode.totalHeight = currentNode.lastTotalHeight + cellNodeHeight; |
| | | |
| | | // ä»å½åindexèµ·åç»çcellç¼åé«åº¦çlastTotalHeightåtotalHeightéè¦å ä¸å½åcellååçé«åº¦ |
| | | for (let i = index + 1; i < this.virtualHeightCacheList.length; i++) { |
| | | const thisNode = this.virtualHeightCacheList[i]; |
| | | thisNode.totalHeight += heightDis; |
| | | thisNode.lastTotalHeight += heightDis; |
| | | } |
| | | }); |
| | | }) |
| | | }, |
| | | // å¨ä½¿ç¨å¨æé«åº¦èæå表æ¶ï¼è¥å é¤äºå表æ°ç»ä¸çæä¸ªitemï¼éè¦è°ç¨æ¤æ¹æ³ä»¥æ´æ°é«åº¦ç¼åæ°ç»ï¼index:å é¤çcellå¨å表ä¸çä½ç½®ï¼ä»0å¼å§ |
| | | didDeleteVirtualListCell(index) { |
| | | if (this.cellHeightMode !== Enum.CellHeightMode.Dynamic) return; |
| | | const currentNode = this.virtualHeightCacheList[index]; |
| | | // ä»å½åindexèµ·åç»çcellç¼åé«åº¦çlastTotalHeightåtotalHeightéè¦åå»å½åcellçé«åº¦ |
| | | for (let i = index + 1; i < this.virtualHeightCacheList.length; i++) { |
| | | const thisNode = this.virtualHeightCacheList[i]; |
| | | thisNode.totalHeight -= currentNode.height; |
| | | thisNode.lastTotalHeight -= currentNode.height; |
| | | } |
| | | // å°å½åcellçé«åº¦ä¿¡æ¯ä»é«åº¦ç¼åæ°ç»ä¸å é¤ |
| | | this.virtualHeightCacheList.splice(index, 1); |
| | | }, |
| | | // æå¨è§¦åèæåè¡¨æ¸²ææ´æ°ï¼å¯ç¨äºè§£å³ä¾å¦ä¿®æ¹äºèæå表æ°ç»ä¸å
ç´ ï¼ä½å±ç¤ºæªæ´æ°çæ
åµ |
| | | updateVirtualListRender() { |
| | | // #ifndef APP-NVUE |
| | | if (this.finalUseVirtualList) { |
| | | this.updateVirtualListFromDataChange = true; |
| | | this.$nextTick(() => { |
| | | this.getCellHeightRetryCount.fixed = 0; |
| | | if (this.realTotalData.length) { |
| | | this.cellHeightMode === Enum.CellHeightMode.Fixed && this.isFirstPage && this._updateFixedCellHeight() |
| | | } else { |
| | | this._resetDynamicListState(!this.isUserPullDown); |
| | | } |
| | | this._updateVirtualScroll(this.oldScrollTop); |
| | | }) |
| | | } |
| | | // #endif |
| | | }, |
| | | // åå§åèæå表 |
| | | _virtualListInit() { |
| | | this.$nextTick(() => { |
| | | u.delay(() => { |
| | | // è·åèæå表æ»å¨åºåçé«åº¦ |
| | | this._getNodeClientRect('.zp-scroll-view').then(node => { |
| | | if (node) { |
| | | this.pagingOrgTop = node[0].top; |
| | | this.virtualPageHeight = node[0].height; |
| | | } |
| | | }); |
| | | }); |
| | | }) |
| | | }, |
| | | // cellHeightMode为fixedæ¶è·å第ä¸ä¸ªcellé«åº¦ |
| | | _updateFixedCellHeight() { |
| | | if (!this.finalFixedCellHeight) { |
| | | this.$nextTick(() => { |
| | | u.delay(() => { |
| | | this._getVirtualCellNodeByIndex(0).then(cellNode => { |
| | | if (!cellNode) { |
| | | if (this.getCellHeightRetryCount.fixed > 10) return; |
| | | this.getCellHeightRetryCount.fixed ++; |
| | | // 妿è·å第ä¸ä¸ªcellçèç¹ä¿¡æ¯å¤±è´¥ï¼åéè¯ï¼ä¸è¶
è¿10æ¬¡ï¼ |
| | | this._updateFixedCellHeight(); |
| | | } else { |
| | | this.virtualCellHeight = cellNode[0].height; |
| | | this._updateVirtualScroll(this.oldScrollTop); |
| | | } |
| | | }); |
| | | }, c.delayTime, 'updateFixedCellHeightDelay'); |
| | | }) |
| | | } else { |
| | | this.virtualCellHeight = this.finalFixedCellHeight; |
| | | } |
| | | }, |
| | | // cellHeightMode为dynamicæ¶è·åæ¯ä¸ªcellé«åº¦ |
| | | _updateDynamicCellHeight(list, dataFrom = 'bottom') { |
| | | const dataFromTop = dataFrom === 'top'; |
| | | const heightCacheList = this.virtualHeightCacheList; |
| | | const currentCacheList = dataFromTop ? [] : heightCacheList; |
| | | let listTotalHeight = 0; |
| | | this.$nextTick(() => { |
| | | u.delay(async () => { |
| | | for (let i = 0; i < list.length; i++) { |
| | | const cellNode = await this._getVirtualCellNodeByIndex(list[i][this.virtualCellIndexKey]); |
| | | const currentHeight = cellNode ? cellNode[0].height : 0; |
| | | if (!cellNode) { |
| | | if (this.getCellHeightRetryCount.dynamic <= 10) { |
| | | heightCacheList.splice(heightCacheList.length - i, i); |
| | | this.getCellHeightRetryCount.dynamic ++; |
| | | // 妿è·åå½åcellçèç¹ä¿¡æ¯å¤±è´¥ï¼åéè¯ï¼ä¸è¶
è¿10æ¬¡ï¼ |
| | | this._updateDynamicCellHeight(list, dataFrom); |
| | | } |
| | | return; |
| | | } |
| | | const lastHeightCache = currentCacheList.length ? currentCacheList.slice(-1)[0] : null; |
| | | const lastTotalHeight = lastHeightCache ? lastHeightCache.totalHeight : 0; |
| | | // ç¼åå½åcellçé«åº¦ä¿¡æ¯ï¼height-å½åcellé«åº¦ï¼lastTotalHeight-å颿æcellçé«åº¦æ»åï¼totalHeight-å
å«å½åcellçææé«åº¦æ»å |
| | | currentCacheList.push({ |
| | | height: currentHeight, |
| | | lastTotalHeight, |
| | | totalHeight: lastTotalHeight + currentHeight |
| | | }); |
| | | if (dataFromTop) { |
| | | listTotalHeight += currentHeight; |
| | | } |
| | | } |
| | | // å¦ææ°æ®æ¯ä»é¡¶é¨æ¼æ¥ç |
| | | if (dataFromTop && list.length) { |
| | | for (let i = 0; i < heightCacheList.length; i++) { |
| | | // æ´æ°ä¹åææé¡¹çç¼åé«åº¦ï¼éè¦å 䏿¤æ¬¡æå
¥çææcellé«åº¦ä¹åï¼å 为æ¯ä»é¡¶é¨æå
¥çcellï¼ |
| | | const heightCacheItem = heightCacheList[i]; |
| | | heightCacheItem.lastTotalHeight += listTotalHeight; |
| | | heightCacheItem.totalHeight += listTotalHeight; |
| | | } |
| | | this.virtualHeightCacheList = currentCacheList.concat(heightCacheList); |
| | | } |
| | | this._updateVirtualScroll(this.oldScrollTop); |
| | | }, c.delayTime, 'updateDynamicCellHeightDelay') |
| | | }) |
| | | }, |
| | | // 设置cellItemçindex |
| | | _setCellIndex(list, dataFrom = 'bottom') { |
| | | let currentItemIndex = 0; |
| | | const cellIndexKey = this.virtualCellIndexKey; |
| | | dataFrom === 'bottom' && ([Enum.QueryFrom.Refresh, Enum.QueryFrom.Reload].indexOf(this.queryFrom) >= 0) && this._resetDynamicListState(); |
| | | if (this.totalData.length && this.queryFrom !== Enum.QueryFrom.Refresh) { |
| | | if (dataFrom === 'bottom') { |
| | | currentItemIndex = this.realTotalData.length; |
| | | const lastItem = this.realTotalData.length ? this.realTotalData.slice(-1)[0] : null; |
| | | if (lastItem && lastItem[cellIndexKey] !== undefined) { |
| | | currentItemIndex = lastItem[cellIndexKey] + 1; |
| | | } |
| | | } else if (dataFrom === 'top') { |
| | | const firstItem = this.realTotalData.length ? this.realTotalData[0] : null; |
| | | if (firstItem && firstItem[cellIndexKey] !== undefined) { |
| | | currentItemIndex = firstItem[cellIndexKey] - list.length; |
| | | } |
| | | } |
| | | } else { |
| | | this._resetDynamicListState(); |
| | | } |
| | | for (let i = 0; i < list.length; i++) { |
| | | let item = list[i]; |
| | | if (!item || Object.prototype.toString.call(item) !== '[object Object]') { |
| | | item = { item }; |
| | | } |
| | | if (item[c.listCellIndexUniqueKey]) { |
| | | item = u.deepCopy(item); |
| | | } |
| | | item[cellIndexKey] = currentItemIndex + i; |
| | | item[c.listCellIndexUniqueKey] = `${this.virtualListKey}-${item[cellIndexKey]}`; |
| | | list[i] = item; |
| | | } |
| | | this.getCellHeightRetryCount.dynamic = 0; |
| | | this.cellHeightMode === Enum.CellHeightMode.Dynamic && this._updateDynamicCellHeight(list, dataFrom); |
| | | }, |
| | | // æ´æ°scrollæ»å¨ï¼èæå表æ»å¨æ¶è§¦åï¼ |
| | | _updateVirtualScroll(scrollTop, scrollDiff = 0) { |
| | | const currentTimeStamp = u.getTime(); |
| | | scrollTop === 0 && this._resetTopRange(); |
| | | if (scrollTop !== 0 && this.virtualScrollTimeStamp && currentTimeStamp - this.virtualScrollTimeStamp <= this.virtualScrollDisTimeStamp) { |
| | | return; |
| | | } |
| | | this.virtualScrollTimeStamp = currentTimeStamp; |
| | | |
| | | let scrollIndex = 0; |
| | | const cellHeightMode = this.cellHeightMode; |
| | | if (cellHeightMode === Enum.CellHeightMode.Fixed) { |
| | | // 妿æ¯åºå®é«åº¦çèæå表 |
| | | // 计ç®å½åæ»å¨å°çcellçindex = scrollTop / èæå表cellçåºå®é«åº¦ |
| | | scrollIndex = parseInt(scrollTop / this.virtualCellHeight) || 0; |
| | | // æ´æ°é¡¶é¨ååºé¨å ä½viewçé«åº¦ï¼ä¸ºå
¼å®¹èèï¼é¡¶é¨éç¨transformYçæ¹å¼å ä½) |
| | | this._updateFixedTopRangeIndex(scrollIndex); |
| | | this._updateFixedBottomRangeIndex(scrollIndex); |
| | | } else if(cellHeightMode === Enum.CellHeightMode.Dynamic) { |
| | | // 妿æ¯ä¸åºå®é«åº¦çèæå表 |
| | | // å½åæ»å¨çæ¹å |
| | | const scrollDirection = scrollDiff > 0 ? 'top' : 'bottom'; |
| | | // è§å¾åºåçé«åº¦ |
| | | const rangePageHeight = this.virtualRangePageHeight; |
| | | // é¡¶é¨è§å¾åºåå¤çé«åº¦ï¼é¡¶é¨ä¸éè¦æ¸²æèæ¯éè¦å ä½é¨åçé«åº¦ï¼ |
| | | const topRangePageOffset = scrollTop - rangePageHeight; |
| | | // åºé¨è§å¾åºåå¤çé«åº¦ï¼åºé¨ä¸éè¦æ¸²æèæ¯éè¦å ä½é¨åçé«åº¦ï¼ |
| | | const bottomRangePageOffset = scrollTop + this.finalVirtualPageHeight + rangePageHeight; |
| | | |
| | | let virtualBottomRangeIndex = 0; |
| | | let virtualPlaceholderBottomHeight = 0; |
| | | let reachedLimitBottom = false; |
| | | const heightCacheList = this.virtualHeightCacheList; |
| | | const lastHeightCache = !!heightCacheList ? heightCacheList.slice(-1)[0] : null; |
| | | |
| | | let startTopRangeIndex = this.virtualTopRangeIndex; |
| | | // 妿æ¯ååºé¨æ»å¨ï¼é¡¶é¨å ä½çé«åº¦ä¸æå¢å¤§ï¼é¡¶é¨çå®é
渲æcellæ°é䏿åå°ï¼ |
| | | if (scrollDirection === 'bottom') { |
| | | // ä»é¡¶é¨è§å¾è¾¹ç¼çcellçä½ç½®å¼å§ååæ¥æ¾ |
| | | for (let i = startTopRangeIndex; i < heightCacheList.length; i++){ |
| | | const heightCacheItem = heightCacheList[i]; |
| | | // å¦ææ¥æ¾å°æä¸ªcell对åºçtotalHeight大äºé¡¶é¨è§å¾åºåå¤çé«åº¦ï¼åæ¤cell为顶é¨è§å¾è¾¹ç¼çcell |
| | | if (heightCacheItem && heightCacheItem.totalHeight > topRangePageOffset) { |
| | | // è®°å½é¡¶é¨è§å¾è¾¹ç¼cellçindexå¹¶æ´æ°é¡¶é¨å ä½åºåçé«åº¦å¹¶åæ¢ç»§ç»æ¥æ¾ |
| | | this.virtualTopRangeIndex = i; |
| | | this.virtualPlaceholderTopHeight = heightCacheItem.lastTotalHeight; |
| | | break; |
| | | } |
| | | } |
| | | } else { |
| | | // 妿æ¯å顶鍿»å¨ï¼é¡¶é¨å ä½çé«åº¦ä¸æåå°ï¼é¡¶é¨çå®é
渲æcellæ°é䏿å¢å ï¼ |
| | | let topRangeMatched = false; |
| | | // ä»é¡¶é¨è§å¾è¾¹ç¼çcellçä½ç½®å¼å§ååæ¥æ¾ |
| | | for (let i = startTopRangeIndex; i >= 0; i--){ |
| | | const heightCacheItem = heightCacheList[i]; |
| | | // å¦ææ¥æ¾å°æä¸ªcell对åºçtotalHeightå°äºé¡¶é¨è§å¾åºåå¤çé«åº¦ï¼åæ¤cell为顶é¨è§å¾è¾¹ç¼çcell |
| | | if (heightCacheItem && heightCacheItem.totalHeight < topRangePageOffset) { |
| | | // è®°å½é¡¶é¨è§å¾è¾¹ç¼cellçindexå¹¶æ´æ°é¡¶é¨å ä½åºåçé«åº¦å¹¶åæ¢ç»§ç»æ¥æ¾ |
| | | this.virtualTopRangeIndex = i; |
| | | this.virtualPlaceholderTopHeight = heightCacheItem.lastTotalHeight; |
| | | topRangeMatched = true; |
| | | break; |
| | | } |
| | | } |
| | | // å¦ææ¥æ¾ä¸å°ï¼å认为顶é¨å ä½é«åº¦ä¸º0äºï¼é¡¶é¨cellä¸éè¦ç»§ç»å¤ç¨ï¼éç½®topRangeIndexåplaceholderTopHeight |
| | | !topRangeMatched && this._resetTopRange(); |
| | | } |
| | | // ä»é¡¶é¨è§å¾è¾¹ç¼çcellçä½ç½®å¼å§ååæ¥æ¾ |
| | | for (let i = this.virtualTopRangeIndex; i < heightCacheList.length; i++){ |
| | | const heightCacheItem = heightCacheList[i]; |
| | | // å¦ææ¥æ¾å°æä¸ªcell对åºçtotalHeight大äºåºé¨è§å¾åºåå¤çé«åº¦ï¼åæ¤cell为åºé¨è§å¾è¾¹ç¼çcell |
| | | if (heightCacheItem && heightCacheItem.totalHeight > bottomRangePageOffset) { |
| | | // è®°å½åºé¨è§å¾è¾¹ç¼cellçindexå¹¶æ´æ°åºé¨å ä½åºåçé«åº¦å¹¶åæ¢ç»§ç»æ¥æ¾ |
| | | virtualBottomRangeIndex = i; |
| | | virtualPlaceholderBottomHeight = lastHeightCache.totalHeight - heightCacheItem.totalHeight; |
| | | reachedLimitBottom = true; |
| | | break; |
| | | } |
| | | } |
| | | if (!reachedLimitBottom || this.virtualBottomRangeIndex === 0) { |
| | | this.virtualBottomRangeIndex = this.realTotalData.length ? this.realTotalData.length - 1 : this.pageSize; |
| | | this.virtualPlaceholderBottomHeight = 0; |
| | | } else { |
| | | this.virtualBottomRangeIndex = virtualBottomRangeIndex; |
| | | this.virtualPlaceholderBottomHeight = virtualPlaceholderBottomHeight; |
| | | } |
| | | this._updateVirtualList(); |
| | | } |
| | | }, |
| | | // æ´æ°fixedCell模å¼ä¸topRangeIndex&placeholderTopHeight |
| | | _updateFixedTopRangeIndex(scrollIndex) { |
| | | let virtualTopRangeIndex = this.virtualCellHeight === 0 ? 0 : scrollIndex - (parseInt(this.finalVirtualPageHeight / this.virtualCellHeight) || 1) * this.preloadPage; |
| | | virtualTopRangeIndex *= this.virtualListCol; |
| | | virtualTopRangeIndex = Math.max(0, virtualTopRangeIndex); |
| | | this.virtualTopRangeIndex = virtualTopRangeIndex; |
| | | this.virtualPlaceholderTopHeight = (virtualTopRangeIndex / this.virtualListCol) * this.virtualCellHeight; |
| | | }, |
| | | // æ´æ°fixedCell模å¼ä¸bottomRangeIndex&placeholderBottomHeight |
| | | _updateFixedBottomRangeIndex(scrollIndex) { |
| | | let virtualBottomRangeIndex = this.virtualCellHeight === 0 ? this.pageSize : scrollIndex + (parseInt(this.finalVirtualPageHeight / this.virtualCellHeight) || 1) * (this.preloadPage + 1); |
| | | virtualBottomRangeIndex *= this.virtualListCol; |
| | | virtualBottomRangeIndex = Math.min(this.realTotalData.length, virtualBottomRangeIndex); |
| | | this.virtualBottomRangeIndex = virtualBottomRangeIndex; |
| | | this.virtualPlaceholderBottomHeight = (this.realTotalData.length - virtualBottomRangeIndex) * this.virtualCellHeight / this.virtualListCol; |
| | | this._updateVirtualList(); |
| | | }, |
| | | // æ´æ°virtualList |
| | | _updateVirtualList() { |
| | | const shouldUpdateList = this.updateVirtualListFromDataChange || (this.lastVirtualTopRangeIndex !== this.virtualTopRangeIndex || this.lastVirtualBottomRangeIndex !== this.virtualBottomRangeIndex); |
| | | if (shouldUpdateList) { |
| | | this.updateVirtualListFromDataChange = false; |
| | | this.lastVirtualTopRangeIndex = this.virtualTopRangeIndex; |
| | | this.lastVirtualBottomRangeIndex = this.virtualBottomRangeIndex; |
| | | this.virtualList = this.realTotalData.slice(this.virtualTopRangeIndex, this.virtualBottomRangeIndex + 1); |
| | | } |
| | | }, |
| | | // éç½®å¨æcell模å¼ä¸çé«åº¦ç¼åæ°æ®ãèæåè¡¨åæ»å¨ç¶æ |
| | | _resetDynamicListState(resetVirtualList = false) { |
| | | this.virtualHeightCacheList = []; |
| | | if (resetVirtualList) { |
| | | this.virtualList = []; |
| | | } |
| | | this.virtualTopRangeIndex = 0; |
| | | this.virtualPlaceholderTopHeight = 0; |
| | | }, |
| | | // éç½®topRangeIndexåplaceholderTopHeight |
| | | _resetTopRange() { |
| | | this.virtualTopRangeIndex = 0; |
| | | this.virtualPlaceholderTopHeight = 0; |
| | | this._updateVirtualList(); |
| | | }, |
| | | // æ£æµèæå表å½åæ»å¨ä½ç½®ï¼å¦åç°æ»å¨ä½ç½®ä¸æ£ç¡®åéæ°è®¡ç®èæå表ç¸å
³åæ°(为解å³å¨Appä¸å¯è½åºç°çé¿æ¶é´è¿å
¥åå°åæå¼Appç½å±çé®é¢) |
| | | _checkVirtualListScroll() { |
| | | if (this.finalUseVirtualList) { |
| | | this.$nextTick(() => { |
| | | this._getNodeClientRect('.zp-paging-touch-view').then(node => { |
| | | const currentTop = node ? node[0].top : 0; |
| | | if (!node || (currentTop === this.pagingOrgTop && this.virtualPlaceholderTopHeight !== 0)) { |
| | | this._updateVirtualScroll(0); |
| | | } |
| | | }); |
| | | }) |
| | | } |
| | | }, |
| | | // è·å对åºindexçèæå表cellèç¹ä¿¡æ¯ |
| | | _getVirtualCellNodeByIndex(index) { |
| | | let inDom = this.finalUseInnerList; |
| | | // å¨vue3+(微信å°ç¨åºæQQå°ç¨åº)ä¸ï¼ä½¿ç¨éå
ç½®åè¡¨åæ³æ¶ï¼è¥z-pagingå¨swiper-itemå
å卿 æ³è·åslotæå
¥çcellé«åº¦çé®é¢ |
| | | // éè¿uni.createSelectorQuery().in(this.$parent)æ¥è§£å³æ¤é®é¢ |
| | | // #ifdef VUE3 |
| | | // #ifdef MP-WEIXIN || MP-QQ |
| | | if (this.forceCloseInnerList && this.virtualInSwiperSlot) { |
| | | inDom = this.$parent; |
| | | } |
| | | // #endif |
| | | // #endif |
| | | return this._getNodeClientRect(`#${this.fianlVirtualCellIdPrefix}-${index}`, inDom); |
| | | }, |
| | | // å¤ç使ç¨å
ç½®å表æ¶ç¹å»äºcelläºä»¶ |
| | | _innerCellClick(item, index) { |
| | | this.$emit('innerCellClick', item, index); |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]常é |
| | | |
| | | export default { |
| | | // å½åçæ¬å· |
| | | version: '2.8.6', |
| | | // å»¶è¿æä½çéç¨æ¶é´ |
| | | delayTime: 100, |
| | | // 请æ±å¤±è´¥æ¶åå
¨å±emit使ç¨çkey |
| | | errorUpdateKey: 'z-paging-error-emit', |
| | | // å
¨å±emit completeçkey |
| | | completeUpdateKey: 'z-paging-complete-emit', |
| | | // z-pagingç¼åçåç¼key |
| | | cachePrefixKey: 'z-paging-cache', |
| | | |
| | | // èæå表ä¸å表indexçkey |
| | | listCellIndexKey: 'zp_index', |
| | | // èæå表ä¸å表çå¯ä¸key |
| | | listCellIndexUniqueKey: 'zp_unique_index' |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]æä¸¾ |
| | | |
| | | export default { |
| | | // å½åå 载类å refresher:䏿巿° load-more:䏿å è½½æ´å¤ |
| | | LoadingType: { |
| | | Refresher: 'refresher', |
| | | LoadMore: 'load-more' |
| | | }, |
| | | // 䏿巿°ç¶æ default:é»è®¤ç¶æ release-to-refresh:æ¾æç«å³å·æ° loading:å·æ°ä¸ complete:å·æ°ç»æ go-f2:æ¾æè¿å
¥äºæ¥¼ |
| | | Refresher: { |
| | | Default: 'default', |
| | | ReleaseToRefresh: 'release-to-refresh', |
| | | Loading: 'loading', |
| | | Complete: 'complete', |
| | | GoF2: 'go-f2' |
| | | }, |
| | | // åºé¨å è½½æ´å¤ç¶æ default:é»è®¤ç¶æ loading:å è½½ä¸ no-more:æ²¡ææ´å¤æ°æ® fail:å 载失败 |
| | | More: { |
| | | Default: 'default', |
| | | Loading: 'loading', |
| | | NoMore: 'no-more', |
| | | Fail: 'fail' |
| | | }, |
| | | // @queryè§¦åæ¥æº user-pull-down:ç¨æ·ä¸»å¨ä¸æå·æ° reload:éè¿reload触å refresh:éè¿refresh触å load-more:éè¿æ»å¨å°åºé¨å è½½æ´å¤æç¹å»åºé¨å è½½æ´å¤è§¦å |
| | | QueryFrom: { |
| | | UserPullDown: 'user-pull-down', |
| | | Reload: 'reload', |
| | | Refresh: 'refresh', |
| | | LoadMore: 'load-more' |
| | | }, |
| | | // èæå表cellé«åº¦æ¨¡å¼ |
| | | CellHeightMode: { |
| | | // åºå®é«åº¦ |
| | | Fixed: 'fixed', |
| | | // 卿é«åº¦ |
| | | Dynamic: 'dynamic' |
| | | }, |
| | | // å表ç¼åæ¨¡å¼ |
| | | CacheMode: { |
| | | // é»è®¤æ¨¡å¼ï¼åªä¼ç¼å䏿¬¡ |
| | | Default: 'default', |
| | | // æ»æ¯ç¼åï¼æ¯æ¬¡åè¡¨å·æ°(䏿巿°ãè°ç¨reloadç)é½ä¼æ´æ°ç¼å |
| | | Always: 'always' |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]æ¦æªå¨ |
| | | |
| | | const queryKey = 'Query'; |
| | | const fetchParamsKey = 'FetchParams'; |
| | | const fetchResultKey = 'FetchResult'; |
| | | const language2LocalKey = 'Language2Local'; |
| | | |
| | | // æ¦æª&å¤ç@queryäºä»¶ |
| | | function handleQuery(callback) { |
| | | _addHandleByKey(queryKey, callback); |
| | | return this; |
| | | } |
| | | |
| | | // æ¦æª&å¤ç@queryäºä»¶(ç§æï¼è¯·å¿è°ç¨) |
| | | function _handleQuery(pageNo, pageSize, from, lastItem) { |
| | | const callback = _getHandleByKey(queryKey); |
| | | return callback ? callback(pageNo, pageSize, from, lastItem) : [pageNo, pageSize, from]; |
| | | } |
| | | |
| | | // æ¦æª&å¤ç:fetchåæ° |
| | | function handleFetchParams(callback) { |
| | | _addHandleByKey(fetchParamsKey, callback); |
| | | return this; |
| | | } |
| | | |
| | | // æ¦æª&å¤ç:fetchåæ°(ç§æï¼è¯·å¿è°ç¨) |
| | | function _handleFetchParams(parmas, extraParams) { |
| | | const callback = _getHandleByKey(fetchParamsKey); |
| | | return callback ? callback(parmas, extraParams || {}) : { pageNo: parmas.pageNo, pageSize: parmas.pageSize, ...(extraParams || {}) }; |
| | | } |
| | | |
| | | // æ¦æª&å¤ç:fetchç»æ |
| | | function handleFetchResult(callback) { |
| | | _addHandleByKey(fetchResultKey, callback); |
| | | return this; |
| | | } |
| | | |
| | | // æ¦æª&å¤ç:fetchç»æ(ç§æï¼è¯·å¿è°ç¨) |
| | | function _handleFetchResult(result, paging, params) { |
| | | const callback = _getHandleByKey(fetchResultKey); |
| | | callback && callback(result, paging, params); |
| | | return callback ? true : false; |
| | | } |
| | | |
| | | // æ¦æª&å¤çç³»ç»language转i18n local |
| | | function handleLanguage2Local(callback) { |
| | | _addHandleByKey(language2LocalKey, callback); |
| | | return this; |
| | | } |
| | | |
| | | // æ¦æª&å¤çç³»ç»language转i18n local(ç§æï¼è¯·å¿è°ç¨) |
| | | function _handleLanguage2Local(language, local) { |
| | | const callback = _getHandleByKey(language2LocalKey); |
| | | return callback ? callback(language, local) : local; |
| | | } |
| | | |
| | | // è·åå½åapp对象 |
| | | function _getApp(){ |
| | | // #ifndef APP-NVUE |
| | | return getApp(); |
| | | // #endif |
| | | // #ifdef APP-NVUE |
| | | return getApp({ allowDefault: true }); |
| | | // #endif |
| | | } |
| | | |
| | | // æ¯å¦å¯ä»¥è®¿é®globalData |
| | | function _hasGlobalData() { |
| | | return _getApp() && _getApp().globalData; |
| | | } |
| | | |
| | | // æ·»å å¤ç彿° |
| | | function _addHandleByKey(key, callback) { |
| | | try { |
| | | setTimeout(function() { |
| | | if (_hasGlobalData()) { |
| | | _getApp().globalData[`zp_handle${key}Callback`] = callback; |
| | | } |
| | | }, 1); |
| | | } catch (_) {} |
| | | } |
| | | |
| | | // è·åå¤çåè°å½æ° |
| | | function _getHandleByKey(key) { |
| | | return _hasGlobalData() ? _getApp().globalData[`zp_handle${key}Callback`] : null; |
| | | } |
| | | |
| | | export default { |
| | | handleQuery, |
| | | _handleQuery, |
| | | handleFetchParams, |
| | | _handleFetchParams, |
| | | handleFetchResult, |
| | | _handleFetchResult, |
| | | handleLanguage2Local, |
| | | _handleLanguage2Local |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]æ ¸å¿js |
| | | |
| | | import zStatic from './z-paging-static' |
| | | import c from './z-paging-constant' |
| | | import u from './z-paging-utils' |
| | | |
| | | import zPagingRefresh from '../components/z-paging-refresh' |
| | | import zPagingLoadMore from '../components/z-paging-load-more' |
| | | import zPagingEmptyView from '../../z-paging-empty-view/z-paging-empty-view' |
| | | |
| | | // modules |
| | | import commonLayoutModule from './modules/common-layout' |
| | | import dataHandleModule from './modules/data-handle' |
| | | import i18nModule from './modules/i18n' |
| | | import nvueModule from './modules/nvue' |
| | | import emptyModule from './modules/empty' |
| | | import refresherModule from './modules/refresher' |
| | | import loadMoreModule from './modules/load-more' |
| | | import loadingModule from './modules/loading' |
| | | import chatRecordModerModule from './modules/chat-record-mode' |
| | | import scrollerModule from './modules/scroller' |
| | | import backToTopModule from './modules/back-to-top' |
| | | import virtualListModule from './modules/virtual-list' |
| | | |
| | | import Enum from './z-paging-enum' |
| | | |
| | | const systemInfo = u.getSystemInfoSync(); |
| | | export default { |
| | | name: "z-paging", |
| | | components: { |
| | | zPagingRefresh, |
| | | zPagingLoadMore, |
| | | zPagingEmptyView |
| | | }, |
| | | mixins: [ |
| | | commonLayoutModule, |
| | | dataHandleModule, |
| | | i18nModule, |
| | | nvueModule, |
| | | emptyModule, |
| | | refresherModule, |
| | | loadMoreModule, |
| | | loadingModule, |
| | | chatRecordModerModule, |
| | | scrollerModule, |
| | | backToTopModule, |
| | | virtualListModule |
| | | ], |
| | | data() { |
| | | return { |
| | | // --------------éæèµæº--------------- |
| | | base64BackToTop: zStatic.base64BackToTop, |
| | | |
| | | // -------------å
¨å±æ°æ®ç¸å
³-------------- |
| | | // å½åå 载类å |
| | | loadingType: Enum.LoadingType.Refresher, |
| | | requestTimeStamp: 0, |
| | | wxsPropType: '', |
| | | renderPropScrollTop: -1, |
| | | checkScrolledToBottomTimeOut: null, |
| | | cacheTopHeight: -1, |
| | | statusBarHeight: systemInfo.statusBarHeight, |
| | | |
| | | // --------------ç¶æ&夿--------------- |
| | | insideOfPaging: -1, |
| | | isLoadFailed: false, |
| | | isIos: systemInfo.platform === 'ios', |
| | | disabledBounce: false, |
| | | fromCompleteEmit: false, |
| | | disabledCompleteEmit: false, |
| | | pageLaunched: false, |
| | | active: false, |
| | | |
| | | // ---------------wxsç¸å
³--------------- |
| | | wxsIsScrollTopInTopRange: true, |
| | | wxsScrollTop: 0, |
| | | wxsPageScrollTop: 0, |
| | | wxsOnPullingDown: false, |
| | | }; |
| | | }, |
| | | props: { |
| | | // è°ç¨completeåå»¶è¿å¤ççæ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤0毫ç§ï¼ä¼å
级é«äºminDelay |
| | | delay: { |
| | | type: [Number, String], |
| | | default: u.gc('delay', 0), |
| | | }, |
| | | // 触å@queryåæå°å»¶è¿å¤ççæ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤0毫ç§ï¼ä¼å
级ä½äºdelayï¼å设设置为300毫ç§ï¼è¥åé¡µè¯·æ±æ¶é´å°äº300毫ç§ï¼åå¨è°ç¨completeåå»¶è¿[300毫ç§-è¯·æ±æ¶é¿]ï¼è¥è¯·æ±æ¶é¿å¤§äº300毫ç§ï¼åä¸å»¶è¿ï¼ï¼å½show-refresher-when-reload为trueæreload(true)æ¶ï¼å
¶æå°å¼ä¸º400 |
| | | minDelay: { |
| | | type: [Number, String], |
| | | default: u.gc('minDelay', 0), |
| | | }, |
| | | // 设置z-pagingçstyleï¼é¨åå¹³å°(å¦å¾®ä¿¡å°ç¨åº)æ æ³ç´æ¥ä¿®æ¹ç»ä»¶çstyleï¼å¯ä½¿ç¨æ¤å±æ§ä»£æ¿ |
| | | pagingStyle: { |
| | | type: Object, |
| | | default: u.gc('pagingStyle', {}), |
| | | }, |
| | | // z-pagingçé«åº¦ï¼ä¼å
级ä½äºpagingStyleä¸è®¾ç½®çheightï¼ä¼ å符串ï¼å¦100pxã100rpxã100% |
| | | height: { |
| | | type: String, |
| | | default: u.gc('height', '') |
| | | }, |
| | | // z-pagingç宽度ï¼ä¼å
级ä½äºpagingStyleä¸è®¾ç½®çwidthï¼ä¼ å符串ï¼å¦100pxã100rpxã100% |
| | | width: { |
| | | type: String, |
| | | default: u.gc('width', '') |
| | | }, |
| | | // z-pagingçæå¤§å®½åº¦ï¼ä¼å
级ä½äºpagingStyleä¸è®¾ç½®çmax-widthï¼ä¼ å符串ï¼å¦100pxã100rpxã100%ãé»è®¤ä¸ºç©ºï¼ä¹å°±æ¯éºæ»¡çªå£å®½åº¦ï¼è¥è®¾ç½®äºç¹å®å¼åä¼èªå¨æ·»å margin: 0 auto |
| | | maxWidth: { |
| | | type: String, |
| | | default: u.gc('maxWidth', '') |
| | | }, |
| | | // z-pagingçèæ¯è²ï¼ä¼å
级ä½äºpagingStyleä¸è®¾ç½®çbackgroundãä¼ å符串ï¼å¦"#ffffff" |
| | | bgColor: { |
| | | type: String, |
| | | default: u.gc('bgColor', '') |
| | | }, |
| | | // 设置z-pagingç容å¨(ææ§½çç¶view)çstyle |
| | | pagingContentStyle: { |
| | | type: Object, |
| | | default: u.gc('pagingContentStyle', {}), |
| | | }, |
| | | // z-pagingæ¯å¦èªå¨é«åº¦ï¼è¥èªå¨é«åº¦åä¼èªå¨éºæ»¡å±å¹ |
| | | autoHeight: { |
| | | type: Boolean, |
| | | default: u.gc('autoHeight', false) |
| | | }, |
| | | // z-pagingæ¯å¦èªå¨é«åº¦æ¶ï¼éå çé«åº¦ï¼æ³¨ææ·»å åä½pxærpxï¼è¥éè¦åå°é«åº¦ï¼åä¼ è´æ° |
| | | autoHeightAddition: { |
| | | type: [Number, String], |
| | | default: u.gc('autoHeightAddition', '0px') |
| | | }, |
| | | // loading(䏿巿°ã䏿å è½½æ´å¤)ç䏻颿 ·å¼ï¼æ¯æblackï¼whiteï¼é»è®¤black |
| | | defaultThemeStyle: { |
| | | type: String, |
| | | default: u.gc('defaultThemeStyle', 'black') |
| | | }, |
| | | // z-pagingæ¯å¦ä½¿ç¨fixedå¸å±ï¼è¥ä½¿ç¨fixedå¸å±ï¼åz-pagingçç¶viewæ éåºå®é«åº¦ï¼z-pagingé«åº¦é»è®¤ä¸º100%ï¼é»è®¤ä¸ºæ¯(å½ä½¿ç¨å
ç½®scroll-viewæ»å¨æ¶ææ) |
| | | fixed: { |
| | | type: Boolean, |
| | | default: u.gc('fixed', true) |
| | | }, |
| | | // æ¯å¦å¼å¯åºé¨å®å
¨åºåéé
|
| | | safeAreaInsetBottom: { |
| | | type: Boolean, |
| | | default: u.gc('safeAreaInsetBottom', false) |
| | | }, |
| | | // å¼å¯åºé¨å®å
¨åºåéé
åï¼æ¯å¦ä½¿ç¨placeholderå½¢å¼å®ç°ï¼é»è®¤ä¸ºå¦ãä¸ºå¦æ¶æ»å¨åºåä¼èªå¨é¿å¼åºé¨å®å
¨åºåï¼ä¹å°±æ¯æææ»å¨å
容é½ä¸ä¼æ¡ä½åºé¨å®å
¨åºåï¼è¥è®¾ç½®ä¸ºæ¯ï¼åæ»å¨æ¶æ»å¨å
容伿¡ä½åºé¨å®å
¨åºåï¼ä½æ¯å½æ»å¨å°åºé¨æ¶æä¼é¿å¼åºé¨å®å
¨åºå |
| | | useSafeAreaPlaceholder: { |
| | | type: Boolean, |
| | | default: u.gc('useSafeAreaPlaceholder', false) |
| | | }, |
| | | // z-paging bottomçèæ¯è²ï¼é»è®¤éæï¼ä¼ å符串ï¼å¦"#ffffff" |
| | | bottomBgColor: { |
| | | type: String, |
| | | default: u.gc('bottomBgColor', '') |
| | | }, |
| | | // slot="top"çviewçz-indexï¼é»è®¤ä¸º99ï¼ä»
使ç¨é¡µé¢æ»å¨æ¶ææ |
| | | topZIndex: { |
| | | type: Number, |
| | | default: u.gc('topZIndex', 99) |
| | | }, |
| | | // z-pagingå
容容å¨ç¶viewçz-indexï¼é»è®¤ä¸º1 |
| | | superContentZIndex: { |
| | | type: Number, |
| | | default: u.gc('superContentZIndex', 1) |
| | | }, |
| | | // z-pagingå
容容å¨é¨åçz-indexï¼é»è®¤ä¸º1 |
| | | contentZIndex: { |
| | | type: Number, |
| | | default: u.gc('contentZIndex', 1) |
| | | }, |
| | | // z-pagingäºæ¥¼çz-indexï¼é»è®¤ä¸º100 |
| | | f2ZIndex: { |
| | | type: Number, |
| | | default: u.gc('f2ZIndex', 100) |
| | | }, |
| | | // 使ç¨é¡µé¢æ»å¨æ¶ï¼æ¯å¦å¨ä¸æ»¡å±æ¶èªå¨å¡«å
满å±å¹ï¼é»è®¤ä¸ºæ¯ |
| | | autoFullHeight: { |
| | | type: Boolean, |
| | | default: u.gc('autoFullHeight', true) |
| | | }, |
| | | // æ¯å¦çå¬åè¡¨è§¦æ¸æ¹åæ¹åï¼é»è®¤ä¸ºå¦ |
| | | watchTouchDirectionChange: { |
| | | type: Boolean, |
| | | default: u.gc('watchTouchDirectionChange', false) |
| | | }, |
| | | // z-pagingä¸å¸å±çåä½ï¼é»è®¤ä¸ºrpx |
| | | unit: { |
| | | type: String, |
| | | default: u.gc('unit', 'rpx') |
| | | } |
| | | }, |
| | | created() { |
| | | // ç»ä»¶å建æ¶ï¼æ£æµæ¯å¦å¼å§å è½½ç¶æ |
| | | if (this.createdReload && !this.refresherOnly && this.auto) { |
| | | this._startLoading(); |
| | | this.$nextTick(this._preReload); |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.active = true; |
| | | this.wxsPropType = u.getTime().toString(); |
| | | this.renderJsIgnore; |
| | | if (!this.createdReload && !this.refresherOnly && this.auto) { |
| | | // å¼å§é¢å è½½ |
| | | u.delay(() => this.$nextTick(this._preReload), 0); |
| | | } |
| | | // 妿å¼å¯äºå表ç¼åï¼å¨åå§åçæ¶åéè¿ç¼åæ°æ®å¡«å
åè¡¨æ°æ® |
| | | this.finalUseCache && this._setListByLocalCache(); |
| | | let delay = 0; |
| | | // #ifdef H5 || MP |
| | | delay = c.delayTime; |
| | | // #endif |
| | | this.$nextTick(() => { |
| | | // åå§åsystemInfo |
| | | this.systemInfo = u.getSystemInfoSync(); |
| | | // åå§åz-pagingé«åº¦ |
| | | !this.usePageScroll && this.autoHeight && this._setAutoHeight(); |
| | | // #ifdef MP-KUAISHOU |
| | | this._setFullScrollViewInHeight(); |
| | | // #endif |
| | | this.loaded = true; |
| | | u.delay(() => { |
| | | // æ´æ°fixed模å¼ä¸z-pagingçå¸å±ï¼ä¸»è¦æ¯æ´æ°windowTopãwindowBottom |
| | | this.updateFixedLayout(); |
| | | // æ´æ°ç¼åä¸z-pagingæ´ä¸ªå
容容å¨é«åº¦ |
| | | this._updateCachedSuperContentHeight(); |
| | | }); |
| | | }) |
| | | // åå§å页颿»å¨æ¨¡å¼ä¸slot="top"ãslot="bottom"é«åº¦ |
| | | this.updatePageScrollTopHeight(); |
| | | this.updatePageScrollBottomHeight(); |
| | | // åå§åslot="left"ãslot="right"宽度 |
| | | this.updateLeftAndRightWidth(); |
| | | if (this.finalRefresherEnabled && this.useCustomRefresher) { |
| | | this.$nextTick(() => { |
| | | this.isTouchmoving = true; |
| | | }) |
| | | } |
| | | // çå¬uni.$emitä¸å
¨å±emitçcomplete errorçäºä»¶ |
| | | this._onEmit(); |
| | | // #ifdef APP-NVUE |
| | | if (!this.isIos && !this.useChatRecordMode) { |
| | | this.nLoadingMoreFixedHeight = true; |
| | | } |
| | | // å¨nvue䏿´æ°nvue䏿巿°view容å¨ç宽度ï¼è䏿¯åæ»é»è®¤ç750rpxï¼éè¦èèåè¡¨å®½åº¦ä¸æ¯éºæ»¡å±å¹çæ
åµ |
| | | this._nUpdateRefresherWidth(); |
| | | // #endif |
| | | // #ifndef APP-NVUE |
| | | // èæåè¡¨æ¨¡å¼æ¶ï¼åå§åæ°æ® |
| | | this.finalUseVirtualList && this._virtualListInit(); |
| | | // #endif |
| | | // #ifndef APP-PLUS |
| | | this.$nextTick(() => { |
| | | // éappå¹³å°ä¸ï¼å¨éè¿è·åcss设置çåºé¨å®å
¨åºåå ä½viewé«åº¦è®¾ç½®bottomè·ç¦»åï¼æ´æ°é¡µé¢æ»å¨åºé¨é«åº¦ |
| | | setTimeout(() => { |
| | | this._getCssSafeAreaInsetBottom(() => this.safeAreaInsetBottom && this.updatePageScrollBottomHeight()); |
| | | }, delay) |
| | | }) |
| | | // #endif |
| | | }, |
| | | destroyed() { |
| | | this._handleUnmounted(); |
| | | }, |
| | | // #ifdef VUE3 |
| | | unmounted() { |
| | | this._handleUnmounted(); |
| | | }, |
| | | // #endif |
| | | watch: { |
| | | defaultThemeStyle: { |
| | | handler(newVal) { |
| | | if (newVal.length) { |
| | | this.finalRefresherDefaultStyle = newVal; |
| | | } |
| | | }, |
| | | immediate: true |
| | | }, |
| | | autoHeight(newVal) { |
| | | this.loaded && !this.usePageScroll && this._setAutoHeight(newVal); |
| | | }, |
| | | autoHeightAddition(newVal) { |
| | | this.loaded && !this.usePageScroll && this.autoHeight && this._setAutoHeight(newVal); |
| | | }, |
| | | }, |
| | | computed: { |
| | | // å½åz-pagingçå
ç½®æ ·å¼ |
| | | finalPagingStyle() { |
| | | const pagingStyle = { ...this.pagingStyle }; |
| | | if (!this.systemInfo) return pagingStyle; |
| | | const { windowTop, windowBottom } = this; |
| | | if (!this.usePageScroll && this.fixed) { |
| | | if (windowTop && !pagingStyle.top) { |
| | | pagingStyle.top = windowTop + 'px'; |
| | | } |
| | | if (windowBottom && !pagingStyle.bottom) { |
| | | pagingStyle.bottom = windowBottom + 'px'; |
| | | } |
| | | } |
| | | if (this.bgColor.length && !pagingStyle['background']) { |
| | | pagingStyle['background'] = this.bgColor; |
| | | } |
| | | if (this.height.length && !pagingStyle['height']) { |
| | | pagingStyle['height'] = this.height; |
| | | } |
| | | if (this.width.length && !pagingStyle['width']) { |
| | | pagingStyle['width'] = this.width; |
| | | } |
| | | if (this.maxWidth.length && !pagingStyle['max-width']) { |
| | | pagingStyle['max-width'] = this.maxWidth; |
| | | pagingStyle['margin'] = '0 auto'; |
| | | } |
| | | return pagingStyle; |
| | | }, |
| | | // å½åz-pagingå
å®¹çæ ·å¼ |
| | | finalPagingContentStyle() { |
| | | if (this.contentZIndex != 1) { |
| | | this.pagingContentStyle['z-index'] = this.contentZIndex; |
| | | this.pagingContentStyle['position'] = 'relative'; |
| | | } |
| | | return this.pagingContentStyle; |
| | | }, |
| | | |
| | | renderJsIgnore() { |
| | | if ((this.usePageScroll && this.useChatRecordMode) || (!this.refresherEnabled && this.scrollable) || !this.useCustomRefresher) { |
| | | this.$nextTick(() => { |
| | | this.renderPropScrollTop = 10; |
| | | }) |
| | | } |
| | | return 0; |
| | | }, |
| | | windowHeight() { |
| | | if (!this.systemInfo) return 0; |
| | | return this.systemInfo.windowHeight || 0; |
| | | }, |
| | | windowBottom() { |
| | | if (!this.systemInfo) return 0; |
| | | let windowBottom = this.systemInfo.windowBottom || 0; |
| | | // 妿å¼å¯åºé¨å®å
¨åºåéé
å¹¶ä¸ä¸ä½¿ç¨placeholderçå½¢å¼ä½ç°å¹¶ä¸ä¸æ¯èå¤©è®°å½æ¨¡å¼ï¼å 为èå¤©è®°å½æ¨¡å¼å¨keyboardHeight计ç®å已添å äºåºé¨å®å
¨åºåï¼ï¼å¨windowBottomæ·»å åºé¨å®å
¨åºåé«åº¦ |
| | | if (this.safeAreaInsetBottom && !this.useSafeAreaPlaceholder && !this.useChatRecordMode) { |
| | | windowBottom += this.safeAreaBottom; |
| | | } |
| | | return windowBottom; |
| | | }, |
| | | isIosAndH5() { |
| | | // #ifndef H5 |
| | | return false; |
| | | // #endif |
| | | return this.isIos; |
| | | } |
| | | }, |
| | | methods: { |
| | | // å½åçæ¬å· |
| | | getVersion() { |
| | | return `z-paging v${c.version}`; |
| | | }, |
| | | // 设置nvue ListçspecialEffects |
| | | setSpecialEffects(args) { |
| | | this.setListSpecialEffects(args); |
| | | }, |
| | | // ä¸setSpecialEffectsçæï¼å
¼å®¹æ§çæ¬ |
| | | setListSpecialEffects(args) { |
| | | this.nFixFreezing = args && Object.keys(args).length; |
| | | if (this.isIos) { |
| | | this.privateRefresherEnabled = 0; |
| | | } |
| | | !this.usePageScroll && this.$refs['zp-n-list'].setSpecialEffects(args); |
| | | }, |
| | | // #ifdef APP-VUE |
| | | // å½appé¿æ¶é´è¿å
¥åå°åè¿å
¥åå°ï¼å ç³»ç»å
å管ç导è´appéæ°å è½½æ¶ï¼è¿è¡ä¸äºéé
å¤ç |
| | | _handlePageLaunch() { |
| | | // 馿¬¡è§¦åä¸è¿è¡å¤çï¼åªæè¿å
¥åå°åæå¼appéæ°å è½½æ¶æå¤ç |
| | | if (this.pageLaunched) { |
| | | // è§£å³å¨vue3+iosä¸ï¼app ReLaunchæ¶é¡¶é¨ä¸æå·æ°å±ç¤ºä½ç½®åä¸åç§»çé®é¢ |
| | | // #ifdef VUE3 |
| | | this.refresherThresholdUpdateTag = 1; |
| | | this.$nextTick(() => { |
| | | this.refresherThresholdUpdateTag = 0; |
| | | }) |
| | | // #endif |
| | | // è§£å³ä½¿ç¨èæå表æ¶ï¼app ReLaunchæ¶ç½å±é®é¢ |
| | | this._checkVirtualListScroll(); |
| | | } |
| | | this.pageLaunched = true; |
| | | }, |
| | | // #endif |
| | | // ä½¿ææºåçè¾çæ¶é´çæ¯å¨ï¼15msï¼ |
| | | _doVibrateShort() { |
| | | // #ifndef H5 |
| | | |
| | | // #ifdef APP-PLUS |
| | | if (this.isIos) { |
| | | const UISelectionFeedbackGenerator = plus.ios.importClass('UISelectionFeedbackGenerator'); |
| | | const feedbackGenerator = new UISelectionFeedbackGenerator(); |
| | | feedbackGenerator.init(); |
| | | setTimeout(() => { |
| | | feedbackGenerator.selectionChanged(); |
| | | }, 0) |
| | | } else { |
| | | plus.device.vibrate(15); |
| | | } |
| | | // #endif |
| | | // #ifndef APP-PLUS |
| | | uni.vibrateShort(); |
| | | // #endif |
| | | |
| | | // #endif |
| | | }, |
| | | // 设置z-pagingé«åº¦ |
| | | async _setAutoHeight(shouldFullHeight = true, scrollViewNode = null) { |
| | | const heightKey = 'min-height'; |
| | | try { |
| | | if (shouldFullHeight) { |
| | | // 妿éè¦éºæ»¡å
¨å±ï¼å计ç®å½åå
¨å±å¯æ¯åºåçé«åº¦ |
| | | let finalScrollViewNode = scrollViewNode || await this._getNodeClientRect('.zp-scroll-view'); |
| | | let finalScrollBottomNode = await this._getNodeClientRect('.zp-page-bottom'); |
| | | if (finalScrollViewNode) { |
| | | const scrollViewTop = finalScrollViewNode[0].top; |
| | | let scrollViewHeight = this.windowHeight - scrollViewTop; |
| | | scrollViewHeight -= finalScrollBottomNode ? finalScrollBottomNode[0].height : 0; |
| | | const additionHeight = u.convertToPx(this.autoHeightAddition); |
| | | // 卿¯ä»å®å°ç¨åºä¸ï¼æ·»å !importantä¼å¯¼è´min-height失æï¼å æ¤å¨æ¯ä»å®å°ç¨åºä¸éè¦å»æ |
| | | let importantSuffix = ' !important'; |
| | | // #ifdef MP-ALIPAY |
| | | importantSuffix = ''; |
| | | // #endif |
| | | const finalHeight = scrollViewHeight + additionHeight - (this.insideMore ? 1 : 0) + 'px' + importantSuffix; |
| | | this.$set(this.scrollViewStyle, heightKey, finalHeight); |
| | | this.$set(this.scrollViewInStyle, heightKey, finalHeight); |
| | | } |
| | | } else { |
| | | this.$delete(this.scrollViewStyle, heightKey); |
| | | this.$delete(this.scrollViewInStyle, heightKey); |
| | | } |
| | | } catch (e) {} |
| | | }, |
| | | // #ifdef MP-KUAISHOU |
| | | // 设置scroll-viewå
容å¨çæå°é«åº¦çäºscroll-viewçé«åº¦(为äºè§£å³å¨å¿«æå°ç¨åºä¸å
容è¾å°æ¶scroll-viewå
容å¨é«åº¦æ æ³éºæ»¡scroll-viewçé®é¢) |
| | | async _setFullScrollViewInHeight() { |
| | | try { |
| | | // 妿éè¦éºæ»¡å
¨å±ï¼å计ç®å½åå
¨å±å¯æ¯åºåçé«åº¦ |
| | | const scrollViewNode = await this._getNodeClientRect('.zp-scroll-view'); |
| | | scrollViewNode && this.$set(this.scrollViewInStyle, 'min-height', scrollViewNode[0].height + 'px'); |
| | | } catch (e) {} |
| | | }, |
| | | // #endif |
| | | // ç»ä»¶éæ¯åç»å¤ç |
| | | _handleUnmounted() { |
| | | this.active = false; |
| | | this._offEmit(); |
| | | // åæ¶çå¬é®çé«åº¦ååäºä»¶ï¼H5ãç¾åº¦å°ç¨åºãæé³å°ç¨åºãé£ä¹¦å°ç¨åºãQQå°ç¨åºãå¿«æå°ç¨åºä¸æ¯æï¼ |
| | | // #ifndef H5 || MP-BAIDU || MP-TOUTIAO || MP-QQ || MP-KUAISHOU |
| | | this.useChatRecordMode && uni.offKeyboardHeightChange(this._handleKeyboardHeightChange); |
| | | // #endif |
| | | }, |
| | | // è§¦åæ´æ°æ¯å¦è¶
åºé¡µé¢ç¶æ |
| | | _updateInsideOfPaging() { |
| | | this.insideMore && this.insideOfPaging === true && setTimeout(this.doLoadMore, 200) |
| | | }, |
| | | // æ¸
é¤timeout |
| | | _cleanTimeout(timeout) { |
| | | if (timeout) { |
| | | clearTimeout(timeout); |
| | | timeout = null; |
| | | } |
| | | return timeout; |
| | | }, |
| | | // æ·»å å
¨å±emitçå¬ |
| | | _onEmit() { |
| | | uni.$on(c.errorUpdateKey, (errorMsg) => { |
| | | if (this.loading) { |
| | | if (!!errorMsg) { |
| | | this.customerEmptyViewErrorText = errorMsg; |
| | | } |
| | | this.complete(false).catch(() => {}); |
| | | } |
| | | }) |
| | | uni.$on(c.completeUpdateKey, (data) => { |
| | | setTimeout(() => { |
| | | if (this.loading) { |
| | | if (!this.disabledCompleteEmit) { |
| | | const type = data.type || 'normal'; |
| | | const list = data.list || data; |
| | | const rule = data.rule; |
| | | this.fromCompleteEmit = true; |
| | | switch (type){ |
| | | case 'normal': |
| | | this.complete(list); |
| | | break; |
| | | case 'total': |
| | | this.completeByTotal(list, rule); |
| | | break; |
| | | case 'nomore': |
| | | this.completeByNoMore(list, rule); |
| | | break; |
| | | case 'key': |
| | | this.completeByKey(list, rule); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } else { |
| | | this.disabledCompleteEmit = false; |
| | | } |
| | | } |
| | | }, 1); |
| | | }) |
| | | }, |
| | | // 鿝å
¨å±emitålistenerçå¬ |
| | | _offEmit(){ |
| | | uni.$off(c.errorUpdateKey); |
| | | uni.$off(c.completeUpdateKey); |
| | | }, |
| | | }, |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]使ç¨é¡µé¢æ»å¨æ¶å¼å
¥æ¤mixinï¼ç¨äºçå¬åå¤çonPullDownRefreshç页é¢çå½å¨ææ¹æ³ |
| | | |
| | | export default { |
| | | onPullDownRefresh() { |
| | | if (this.isPagingRefNotFound()) return; |
| | | this.$refs.paging.reload().catch(() => {}); |
| | | }, |
| | | onPageScroll(e) { |
| | | if (this.isPagingRefNotFound()) return; |
| | | this.$refs.paging.updatePageScrollTop(e.scrollTop); |
| | | e.scrollTop < 10 && this.$refs.paging.doChatRecordLoadMore(); |
| | | }, |
| | | onReachBottom() { |
| | | if (this.isPagingRefNotFound()) return; |
| | | this.$refs.paging.pageReachBottom(); |
| | | }, |
| | | methods: { |
| | | isPagingRefNotFound() { |
| | | return !this.$refs.paging; |
| | | } |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]å
¬ç¨çéæå¾çèµæº |
| | | |
| | | export default { |
| | | base64Arrow: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAD1BMVEVHcExRUVFMTExRUVFRUVE9CdWsAAAABHRSTlMAjjrY9ZnUjwAAAQFJREFUWMPt2MsNgzAMgGEEE1B1gKJmAIRYoCH7z9RCXrabh33iYktcIv35EEg5ZBh07pvxJU6MFSPOSRnjnBUjUsaciRUjMsb4xIoRCWNiYsUInzE5sWKEyxiYWDbyefqHx1zIeiYTk7mQYziTYecxHvEJjwmIT3hMQELCYSISEg4TkZj0mYTEpM8kJCU9JiMp6TEZyUmbAUhO2gxAQNJiIAKSFgMRmNQZhMCkziAEJTUGIyipMRjBSZkhCE7KDEFIUmTeGCHJxWz0zXaE0GTCG8ZFtEaS347r/1fe11YyHYVfubxayfjoHmc0YYwmmmiiiSaaaKLJ7ckyz5ve+dw3Xw2emdwm9xSbAAAAAElFTkSuQmCC', |
| | | base64ArrowWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEVHcEz///////////////////+IGTx/AAAABnRSTlMA/dAkXZOhASU/AAABYElEQVRYw+2YwXLCIBCGsdAHWGbyAKZ4zxi9O017rxLf/1UaWFAgA1m8dcpedNSPf/l/Vh0Ya/Wn6hN0JcGvoCqRM4C8VBFiDwBqqNuJKV0rAnCgy3AUqZE57x0iqTL8Br4U3WBf/YWaIlTKfAcELU/h9w72CSVPa3C3OCDvhpHbRp/s2vq4fHhCeiCl2A3m4Qd71DQR257mFBlMcTlbFnFWzNtHxewYEfSiaLS4el8d8nyhmKJd1CF4eOS0keLMAuSxubLBIeIGQW8YHCFFo7EH9+YDcQt9FMZEswTheaNxTHwHT8SZorJjMrEVwo4Zo0U8HSEyZvJMOg4RjnmmRr8nDYeIz3OMkbfE/QhBo+U9RnZJxjGCRh/WKmHEMWLNkfPKsGh/CWJk1JjG0kcuJggTt34VDP8aWAFhp4nybVb5+9qQhjSkIQ1pSEMa8k+Q5U9rV3dF8MpFBK+/7miVq1/HZ2qmo9D+pAAAAABJRU5ErkJggg==', |
| | | base64Flower: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAKlBMVEVHcEzDw8Ovr6+pqamUlJTCwsKenp61tbWxsbGysrLNzc2bm5u5ubmjo6MpovhuAAAACnRSTlMA/P79/sHDhiZS0DxZowAABBBJREFUWMPtl89rE0EUx7ctTXatB3MI1SWnDbUKPUgXqh4ED8Uf7KUVSm3ooVSpSii0Fn/gD4j4o+APiEoVmos9FO2celiqZVgwgaKHPQiCCkv+F99kM7Ozm5kxq1dfD91k9pPve9/3ZjbRNHHok/mKli4eIPNgSuRObuN9SqSEzM20iGnm0yIbqCuV7NSSSIV7uyPM6JMBYdeTOanh/QihJYZsUCSby+VkMj2AvOt0rAeQAwqE3lfKMZVlQCZk1QOCKkkVPadITCfIRNKxfoJI5+0OIFtJx14CMSg1mRSDko7VAfksRQzEbGYqxOJcVTWMCH2I1/IACNW0PWU2M8cmAVHtnH5mM1VRWtwKZjOd5JbF6s1IbaYqaotjNlPHgDAnlAizubTR6ovMYn052g/U5qcmOpi0WL8xTS/3IfSet5m8MEr5ajjF5le6dq/OJpobrdY0t3i9QgefWrxW9/1BLhk0E9m8FeUMhhXal499iD0eQRfDF+ts/tttORRerfp+oV7f4xJj82iUYm1Yzod+ZQEAlS/8mMBwKebVmCVp1f0JLS6zKd17+iwRKTARVg2SHtz3iEbBH+Q+U28zW2Jiza8Tjb1YFoYZMsJyjDqp3M9XBQdSdPLFdxEpvOB37JrHcmR/y9+LgoTlCFGZEa2sc6d4PGlweEa2JSVPoVm+IfGG3ZL037iV9oH+P+Jxc4HGVflNq1M0pivao/EopO4b/ojVCP9GjmiXOeS0DOn1o/iiccT4ORnyvBGF3yUywkQajW4Ti0SGuiy/wVSg/L8w+X/8Q+hvUx8Xd90z4oV5a1i88MbFWHz0WZZ1UrTwBGPX3Rat9AFiXRMRjoMdIdJLEOt2h7jrYOzgOamKZSWSNspOS0X8SAqRYmxRL7sg4eLzYmNehcxh3uoyud/BH2Udux4ywxFTc1xC7Mgf4vMhc5S+kSH3Y7yj+qpwIWSoPTVCOOPVthGx9FbGqrwFw6wSFxJr+17zeKcztt3u+2roAEVgUjDd+AHGuxHy2rZHaa8JMkTHEeyi85ANPO9j9BVuBRD2FY5LDMo/Sz/2hReqGIs/KiFin+CsPsYO/yvM3jL2vE8EbX7/Bf8ejtr2GLN65bioAdgLd8Bis/mD5GmP2qeqyo2ZwQEOtAjRIDH7mBKpUcMoApbZJ5UIxkEwxyMZyMxW/uKFvHCFR3SSmerHyDNQ2dF4JG6zIMpBgLfjSF9x1D6smFcYnGApjmSLICO3ecCDWrQ48geba9DI3STy2i7ax6WIB62fSyIZIiO3GFQqSURp8wCo7GhJBGwuSovJBNjb7kT6FPVnIa9qJ2Ko+l9mefGIdinaMp0yC1URYiwsdfNE45EuA5Cx9EhalfvN5s+UyItm81vaB3p4joniN+SCP7Qc1hblAAAAAElFTkSuQmCC', |
| | | base64FlowerWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEX///9HcEz///////////////84chYNAAAABnRSTlP/AGzCOYZj5g1nAAACfklEQVRYw+2YTVPDIBCGtza9Jw25a0bvcax30o73OOr//yvma2F3YWlpPTijXNpAHrK8LLALVPFium2vNIFSbwGKTGQA2GUiHcD29yDNy3sMIdUBQl7r2H8mOEVqAHgPkYZUS6Qc2zYhQqtjyDZEximCZwWZLIBeIgYShs2NzxKpSUehYpMJhURGb+O+w5BpMCAREKPnCDHbIY20SzhM5yxziAXpOiBXydrekT9i5XDEq4NIIHHgyU5mRGqviII4mREJJA4QJzMiILwlRJzpKxJKvCBm8OsBBbLux0tsPl4RKYm5aPu6jw1U4mGxEUR9g8M1PcqBEp/WJliNgYOXueBzS4jZSIcgY5lCtevgDSgyzE+rAfuOTQMq0yzvoGH18qju27Mayzs4fPyMziCx81NJa5RNfW7vPYK9KOfDiVkBxFHG8hAj9txuoBuSWORsFfkpBf7xKFLSeaOefEojh5jz22DJEqMP8fUyaKdQx+RnG+yXMpe8Aars8ueR1pVH/bW3FyyvPRw90upLDHwpgBDtg4aUBNkxRLXMAi03IhcZtr1m+FeI/O/JNyDmmL1djLOauSlNflBpW18RQ2bPqXI22MXXEk75KRHTnkPkYbESbdKP2ZFk0r5sIwffAjy1lx+vx7NLjB6/E7Jfv5ERKhzpN0w8IDE8IGFDv5dhz10s7GFiXRZcUeLCEG5P5nDq9k4PFDcoMpE3GY4OuxuCXhmuyNB6k0RsLIAvqp9NE5r8ZCSS8gxnUp7ODdYhZTqxuiJ9uyJJtPmpqJ7wVj+XVieS903iViHziqAhchLEJAyb7jWU647EpUofQ0ziUuXXXhDddtlllSwjgSQu7r4BRWhQqfDPMVwAAAAASUVORK5CYII=', |
| | | base64Success: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAElBMVEVRUVFHcExTU1NRUVFRUVFRUVFOSlSUAAAABnRSTlP/AI6+VySB3ZENAAACcElEQVRYw+2YyYKCMAyGI8hdpdxdZu7gcpdZ7jL6/s8yYheSNi0aPdqbwOffpGmaFOYPD3gj4bisN7vddv17N/JVgxn5x12IWgIaWTuO/IE3PseQbwjGPo2cgRmHFLJwdm/X643zwiqOKPPJ1nj3sjEP2iiifZWj5bhopSyGaEO2HX5fbQJzwJ+W7x/jw5ZFjsEU0PMph9xE8i5EqprKALW95eJQURkgzw98uJ/JvwGecR7bIjWWsUgVrrIfFZ2HlLy3sKETD1mmRLRMRhGVssRa0xJkdn3SpJBymBkM8+pSSDXMDNyDaToVHd2fgpNt0sjwiUZO19+jGQ+gQEg9Oq+bufmAVGihomNmjQG7UG3020vrlm7lkFnKFGU3kZ0KGAdmKe821pipQ+qEKcrZeTL2g5FsUks4cStjEZWwXg0b0n4GxmEpkWwIs5VBynjgK7xZaz1/0D7OxkVuLpsY5BQNFyLS84VBjjbg0iL2r2EQHBOxBhikuUOkdxODVF1cxHoWtPPsiyXO455Iv34hssCO8EV4ZIYTjS8SR4qYSHRiTiYQ4ZFbHi0iIhhBTi6dTCgSWRcnw4h4yGTuyTAiOGBIWGoZTgSHJQl+LcOJ4OCnW6yX2bMnJ9pidCOXtkTkTrIGpYuOynAiOF14SamMiOCk5Ke+mq8BcOrrvym8d0zKIQnWT+M1WwOQNO4fFiWb18hhERxJPx2fblbPHHyC41VyiAtKBUFBIih7JMWVoIQTFIr3lKPN80WvoLSWFPC653ioTZA0I0FrQ7qU6asaK0H7JmkSJa2ooOGVtNUsc3j9FYHkIkJy3SG6VHnfXKXGP9t4N9Q4Ye98AAAAAElFTkSuQmCC', |
| | | base64SuccessWhite: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAGFBMVEVHcEz///////////////////////////8dS1W+AAAAB3RSTlMAiVYk6KvDHLfaegAAAo1JREFUWMPtWEtzmzAQNhCTq910ytXpiyvxTNOr60zrayepx9d02gnX4sTm7xcEiJX2gdnkGJ1A4tOnfWqXyeR1vMRYzrcPD9v5h5MBl3/Ldvx4cxIg/FWC8X0xjLjalM54uhhCfCrRuJURX0pi3EmIqZV7O59vrRZmguStHL9b7S7ftfLwOtiZDw7AHMtmquAQ12b5Wwbnordm8g9zLLO49qc/m2n6aKnhwPOGZ08hAiNHhheiHae1lOUPGZpQkPKa3q0mOUjaRzSRaGUjpy/mmWSwySSpllcEteBKAT52KEnSbblA51pJEPxBQoiH1FP4E3s5+FJv07h6/ylD6ui7B+9fq/ehrFB98ghec9EoVtyjK8pqCHLmCBOwMWSCeWFNN4MbPAk55NhsvoFHSSVR0k5TCTTEzlUGcqV/nVp7n9oIVkmtaqbAEqEgfdgHJPwsEAyZ9r4VAZXFjpEwyaw3+H2v42KYxKhs1XvY/gSSGv+IHyUSuHXCeZhLAgVI3EjgSGo1Fb3xO0tGGU9S2/KAIbtjxpJASG73qox6w5LUq0cEOa+iIONIWIilQSQ0pPa2jgaRQAgQP7c0mITRWGxpMAmEQFN2NAQJNCV0mI6GIIEO47hlQ0ORQLd0nL+hoUjg1m6I1TRr8uYEAriBHLcVFQ5UEMiBe3XkTBEG04WXlGKGxPnMS305XQPA1Ocn2JiuAZwE66fxnKwBnDTuXxZTMq85lwW6kt5ndLqZPefiU1yvmktcUSooChJF2aMprhQlnKJQ5FxRKkcVRa+itNYU8Io2oVkY14w0NMWYlqft91Bj9VHq+ca3b43BxjWJmla0sfKohlfTVpPN+93L/yLQ/IjQ/O5Q/VR5HdL4D7mlxmjwVdELAAAAAElFTkSuQmCC', |
| | | base64Empty: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAMAAAAL34HQAAALeGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI0LTAxLTEzVDE5OjA5OjQwKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wMS0xM1QxOTowOTo0MCswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ZWQwMWYzNWQtOWRjOC00MDBiLWEyMmQtNjM5OGZiNzVhNGRiIiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZDhlMzQ3ZmEtMDY2My1jYTRiLTgzNTctNTk4YjBkNGIzOTU2IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjMwMCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjMwMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBzdEV2dDp3aGVuPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQwNjg2NzJkLWY5NDMtOTU0Mi1iMDBiLTVlMDExNmE1NmIzZSIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxMDoyNjoxNiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDphYmJkZmUyZC0xY2Q2LTJiNDgtYjUyNS05YzlhZjdlNjA4NDMiIHN0RXZ0OndoZW49IjIwMjQtMDEtMTNUMTE6MjM6NDArMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YTQ5MjM5MDAtNDhiZC03YTQ1LWI4NGItYmVlZTVjOWUxYTM1IiBzdEV2dDp3aGVuPSIyMDI0LTAxLTEzVDExOjIzOjQwKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmVkMDFmMzVkLTlkYzgtNDAwYi1hMjJkLTYzOThmYjc1YTRkYiIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxOTowOTo0MCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmFiYmRmZTJkLTFjZDYtMmI0OC1iNTI1LTljOWFmN2U2MDg0MyIgc3RSZWY6ZG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjM2ZGQ4NTQxLWQ0MWEtYmY0Yy1iZjA3LWNmNjZhNjZhMDg2MSIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmQwODAyODAyLTM1MmEtODU0YS05MWI3LTZkZTZkNTJlYjNkMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pm30U/gAAAAJcEhZcwAALiMAAC4jAXilP3YAAAA/UExURUdwTODg4O3t7e7u7unp6d7e3uTk5M/Pz8nJyePj4+jo6Pj4+MrKyszMzO7u7unp6fb29vLy8vr6+v7+/sHBweag3xAAAAAOdFJOUwAxia5pF0n+/vzX3KbULQ2DYQAACG1JREFUeNrtm4l2o7gShi20IWFrAd7/WUc7EosDWKZ976Hc7WTmdMKXv0qlqpLyeNx222233Xbbbbfddtv/mOHn8xexSNsiRH5PrbFtW4p+DetpsF4v8Gs+HA3WEwOAfwzriYxaLTVsP8X1QK0z+vqQCzewYogi60aL9SEX5oyxphYVCFTGjfSJCTmN1jBruN5KTGCUS8bhySQGHRaohmW4glwtldbOeYJYKlgvbyUuA8aFFEKc++aIM4hrRnyiMnIZKq1PrihcM3GNKboMF1Naa9X9+8T1KrxIlVbGjv3cAEHOYYMqqgUsVuJqqehV3+sjDwB+DTJp0lYtMCyZpxqjF4e+74+sRcQSFZO8UonUSEFzuUY+DKo59A2kZDatGCjzCauy/2AmhSyCq0WHEj0KTNJDmVeNhErMt1Q8W4xti4/FwMJ4jaxl05TKFiNtD3kBGrHnhiph9V0eXQc6DkyE2xX830AlKshFTErXeuCZXK/9m41wFsGSfZ4lcGeyZ98PrylJ7MWCojQZ3qSukL2QslgdngqJnTEPdTJhXvbNBoR/+7wabIxWduN/Ja5dWEivm4XSZ2uQckNzmRlHrn2lc6eiafvS4V2Hd12tesau8toZW0CtWoZYb9t+OqxdCYKYjVPF16pVbILIy/gR7MVaWMHYPCoa2VkzkX4Iry2rirXbumGyAjGC1h62YLw6ApsNKZph3fpIWHt08JovRWD62sejpXhTrhWrPpl6zZ6PW2oTG5ltlvgtF6weNYCWKeJJSfg4W6PNJlj3sVZgOXV4lc8n4RlkMTLEBDVoYc3nI09kpyzzfgWsjyzBZSNDKF2/wjh+sxYvn8Y1scxlfLF9T1RBO3wVHsnq8Fk4oGkEh/0KJPSa8T2CeWE5X9BPmgLsaRIGeNL2kshCsWoLBmdPJW5Wbz1ndAKUXjPwxXYAUpSV3fy5BJg1aa1tyVXHHMgVH31ewDVrleHr9XqC684SUF4mecR3+wW5SC2QNvxUizRv98mLDhPgYiMDb+v8g0OADxqxcnf9w01mZYJF0fUVP5LcdswbsMmy1DVs5PlE5NpNiTR8M8qAWZkOy6aN13VcoOF2/s3xn3Mes8Xza05tgR/BuNz69nlNzMR0fH45p+G4R9oxh2mKt9MF4J7K/lvWUojwF5nCgCpuRUptnZMQ3au0nSo2UsHgV3xpmeLYzGml3ZFBBzYGPCpOQRwXs1/GG1J74dlZc6JKUOtjBAz9XjVxucGWHbZVJDPJQGYDRl1Qmf1ovk2Sbghb6MQlnF7mBzM1bgOqJAPpoOQaVe+4Skcit3uqHMyG/Sh1rHNN0gAfM0nnPrmulfLVBSm20TSZSdWa0LJl2ukVyE4vTYCgP3uQkwv1TKtQWgxDzBSg80OQjCs4klKvuUzHLCfIbDKIE/S5VIGqD1iD2819pkAqTWdmeina+oZABi7X5B1MGoTJqJSchuk6JNHcgUPAcsVFk0+N0oDN68Vo7FQSmCXjx46OEtUk1lpY2ZFQGr/AcpqVato4wPUD+RhfAeyQI5sJ6l2sDwnKqNFSJvpiyJbFl3kTOjZ2ievwCR7hkUoWeV2vOLAXvB39AJoyqYa81A5cvaAidXYTFTycKDBcalVK5f3XS89kzLVl9txfL+K+p6NUnitz5KkKm7D3DrRPNq4bk7l20aFRppNilmuQI+uzTtj9wPBkTsVwM7HbJ5pwGgujyRyZDzQLNoiRFluRtQ+GzEguqRxUL+ZMFqulMzIfaP3ARj2k/txB8c+2HyjmDizCaVWtNoE5MvMlKs/4VQ7HUJZCrU6qCKcNJ2aSWUZhJZu4VI0LB4CHFdj77DRuGi28WKAxoRyZyzGVrmc0jmk1nP5QaxZo1puqq1YIAqgZb8e/rABZJWNCNxV7DSTpOO7Aail9J9nYHtua/4ouE/aS0X1qtXQzwGx+rnbi2vhF/TfZG52oc6DPo1WCi3RTDnRk7TEntoEp38gg+DjYs2opkR3JW5EpL9rU0XSK5/6LOTAVS+72x7pm60zSf5HMdldjhzJqw1FRcxXdS3ZNZp0s92FiyluUvBPoD9ynZNkBiu2NF11ofnlnQbZgKqvusj9R/f6DOzgVsahbNlXxlsxU8y7qrbTupitRyxFBKG6H3aEPUqj7YrzAymq41FXlZLlO4WLbvG2Kg4vYB+wPfWS2B5Rq8TW9ROpAZbiF6MmCTsx1NLLsx7NOoOiZup2CNbZ36xc96ErcxzuILGrmmFhimjtwKo/yTm7feTVwB61IzbnW4967Kt3cDDotGt8JKrTiUyO3Uy2PZZt9tapXEfXhWmTgcoB+JchFWsiCKvYnhmn/tKuJDbgly897FnFfkE1rQLKy810OU7xW3bEJHCD5gERtuTGuxoJqA6qI9TNMa6MbvZomsiubbPYx78YXDaaRqqsyqfSaLZdjYGHLu65rDgydXCWm1P5EvcQ828f9pcBapTILSMv1nZCAc0WzFIFsGfUi/kmAxc6cFqDSYuPSMIbs1OVrwITTQM9HVRFJ5JL56qcoFzzT1uVcd2v9jFw8BHlcWtmEI86hp5Dy/zOlK8cUp/rVseRUBqawz6kmAcPLM9l5m8h4V53Iz/2mFJaTCvF8JbsMvPjU/7crbUXart0v4WyE0LnDPcAX95Knj4VUE8HCdNdUP8BDcOXKdPl4uSWbh4LfOV0HDdfipOmu+eIRrDsNPkIT7np/8ZAzVdOd1u8wHIqeXt8VqtgiO50ePeNaGG+uO9rHiKdL71pnIun8jxEKXv2r2HYBzO/mz96vFKoMM5WLk7tQXS9U5kwCu5lk7n6++kdCFWRaTUzm0/5fClWGWTrM/AGhCrJO/ZBQhTPFLwmV7ebgcdttt91222233Xbbbf+H9h+2WEtdHVinLAAAAABJRU5ErkJggg==', |
| | | base64Error: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAMAAAAL34HQAAALeGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDg4LCAyMDIwLzA3LzEwLTIyOjA2OjUzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIiB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI0LTAxLTEzVDE5OjEwOjEwKzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyNC0wMS0xM1QxOToxMDoxMCswODowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTQ3NTExNjAtZDY5MC00ZTkzLWFhNGUtNGMwYTViNGU1ZGFjIiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6YzRiNzlkYWMtZTJmYS1iNzQ0LWIxM2ItOWU1N2VjMDhhM2YwIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0ic1JHQiBJRUM2MTk2Ni0yLjEiIHRpZmY6T3JpZW50YXRpb249IjEiIHRpZmY6WFJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6WVJlc29sdXRpb249IjMwMDAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIGV4aWY6Q29sb3JTcGFjZT0iMSIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjMwMCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjMwMCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZDA4MDI4MDItMzUyYS04NTRhLTkxYjctNmRlNmQ1MmViM2QwIiBzdEV2dDp3aGVuPSIyMDIyLTAyLTIyVDIxOjIxOjQ1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQwNjg2NzJkLWY5NDMtOTU0Mi1iMDBiLTVlMDExNmE1NmIzZSIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxMDoyNjoxNiswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpjZjk1NTE1OC04MjFiLTA4NDUtYWJmNS05YTE1NGM1ZTY4NjEiIHN0RXZ0OndoZW49IjIwMjQtMDEtMTNUMTE6MDQ6MDQrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvcG5nIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIHRvIGltYWdlL3BuZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZGM1Y2IyNWItZDZlNC0yZjQ2LTgyODQtZmUwOTNlY2M2ZTkxIiBzdEV2dDp3aGVuPSIyMDI0LTAxLTEzVDExOjA0OjA0KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjE0NzUxMTYwLWQ2OTAtNGU5My1hYTRlLTRjMGE1YjRlNWRhYyIgc3RFdnQ6d2hlbj0iMjAyNC0wMS0xM1QxOToxMDoxMCswODowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjAgKE1hY2ludG9zaCkiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOmNmOTU1MTU4LTgyMWItMDg0NS1hYmY1LTlhMTU0YzVlNjg2MSIgc3RSZWY6ZG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjM2ZGQ4NTQxLWQ0MWEtYmY0Yy1iZjA3LWNmNjZhNjZhMDg2MSIgc3RSZWY6b3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOmQwODAyODAyLTM1MmEtODU0YS05MWI3LTZkZTZkNTJlYjNkMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ph2LDQsAAAAJcEhZcwAACxMAAAsTAQCanBgAAAA5UExURUdwTNra2s7Ozq2tre3t7dPT087OzuPj4+3t7dbW1u/v79bW1vz8/MrKytDQ0Nzc3MPDw/X19bi4uMZQDnEAAAAKdFJOUwBqEPywotz+wzqApqiTAAAHW0lEQVR42u1b25akIAwcbx2UFoj//7HLTQVBRcSZfTDnbM/uTl/KSlEkwf75eeONN95444033njjjTduR9/0/yOsbqoevObL7101tYX1HFs9QFtfZalRP+rpQVgdAFx990ZnT8L6eZItUl99jeGpf1DxdV/VP9fV1f/PFlF1bYHoVFSRC60IyVjrFRnuB8IoxpExSrstsErKHpJw1eqybNLbAQvAYkKjUrjoBgKRqAaeIjG5+qaps6hKcMWmcdSwqAJWBbAgCZZaIYbsqggqqlHNbFFa5yVR4jKvrKEErOEjNCqNSwHrfE8lpLsod/u+cOPPMPBJ+Gz5dM0cXNgclre+pSxhYI1WW5Tf9ENSMIdLCiWs6q9hwQprBVYKFqyPlx4WtoSvrT9lC/wkGt8qlkQooC3hi6sgW3Bb8gtdpSV/za/mn49pC0oYhONbfyd5hzDLFivKFpTS1gKM0we0tQCEncfgQn7Rt+DC/299i1MSRJcBC0r7VviG5KZvwV5WIUobxHyrJKy8VRjXVgFYsPu5kOtbxdhycCDuihziXVLoW7xwEiUmDgd544B46luWLW+nugMLB2BimmC3cxTNxCDg8xFtuUSNqoFsDKzY8psa+XtBNWXr74N6qxwsS5T6VL5robKl10+ZRu5S9qBvUYuJwVHzjwjrE3G33qKh+WXBgmkmCvHYquTvZ8oo7rLFA4PJgYW0MdePIRQIGUPNbSMw5lubJMKtJI6+Wk6cVFMmACO+VVryeL7ZgI8MhwS2fnNPPK0geHBRd11eJSiyL4KjrL2umm1XIpRii1MKB/mU/iCZwF+pt5z3UJ7UiF3nQqadAXC3T3xEW2IyuDBe3yDTe0+A64it2WTyYSGVHymUI/EduvSWKJ80Dtv2NbYSoQxbMkVC7yzNGIWFvDF7gRD79RYrWW/BDGti4wwLtgvO7gWKUZ8Mt94qX8vLJE70+xVNwzDm9ghNM+FX7p/jlZUId2HJD+Tf79hMe3WNrAK/30E+C8/6xOCqbqxE5JNMYrNbnaLUvJAewfCg8zF0Ba/tbviWLvPYfsGFA1PVD8ZdnjlVc/DS/o7LK4NHjOjKKbfCTSCo5XmwKbaZM4jlc9NGEYd9Ijd0QS5ZGaOR2O+DPlGyRb2nXZzgnI1GdFWF+0gh3ifyTRqvzpXI2eElk58FeHziCF5hY+hSMV9Ge/mohUTGuQ4vzHYe8bW5sNdFQ58St22Vcf5zzJbtcGT4iYQ7iz8dFuxoWRYMjAM7KCnypHOTLSqdUwYIFpndOD/6B2FBzNQxYmW/zxYE4j8yLHga1s2Rbm/O5PXtGcuNDIW1dTj5hpjGsO+7z2Kk9NP1JWDlnWKAM4H6zCUNM05KyVPHBclYzUbgjE3N3tP2JWHBmbqD4GLeCs2jhMT13lMVljwcEbetwZgtHUxVQ21ho3fE7inf2s8vzMWq0EWpfOBg5hcDSGwaF2+LaysRIzNFqRgBv2sMhi/Ix0WiW8rBKNBv4ExBI7eorx9ANazsPCb5FkSNH+Reacos+AYxaFzX76KMH65c8ytzZ40YvpFAqtgC/otn1eCmMI5K8yVRQVVwq3aVtU+jJktwjyP7x+BKv8vtoH098vXYSJcrWGJcAW11r8WVRxe5vgcuFbXqwnaEZejS6mrLwYKUg1ch2RJswTFYgMOwoau+AQsSp/FuDhVZi7J402ifgGla/GJIzGLYG5H4rnKMCUydL9wcsmZSuPikR2QmjQbWqaV2ob2RdMvaLEvFlRiXpYeTwqVOtMZF+qi0dS4uEjJKMvWuYK3S0jHZwaq7BylYp/O2uu3q04lNqudLWEJQd/3paTBz12IaLIPtzE5P1AUuW9TB8NVzaG9/TIfV+eXsWeezz6HWlptEbo4SIAeWur/Y/RZC/gmZTiLzUY2j5ct6fjKsFvxqgyQxE9sbmfYtnJMIciEKo6+FL0wziJmtkzspIcUl0PgWrL7VCKP7hl61U4WLeN+7Ieli2vZhmq0VgjDOgIyhJ62sSpDkWNZa1wiB8WoLlxzy29XpGVPgn1ut5VYcGyRLK7OCiJaDYMrAneJUkZWdw0yDgNm5nDowqLc0Kp581FO7QS4pC9S/YRW9xkVdNOj0ZHCp9anEZw3VEK/fopiDrkMObkcdJtT1g6+uzQ60bIdUPztdWZWy53m+v/zFYPOGHO4AZsalmtJNkyHrCAx1RXX7mt5g1L1pDezpkXv8wJwpVRSSaf2c26Y0rrXXxyWBptu/ovdak+VhkqjGBZUdvKygqANKA/MqZ/36kcGwFn90RnWp66ksKuHgitLFY8BU+F2ZvqpxpMY9qR3YwOUJ12fc0KUHVKdswcKXuwetErCnwvMKuXxfc/3RVJ2yFc+iosQd3X+WGSVz1UiuN2J156FyVyHbsOUp3krezaPUT/VxXqdfwvknb/Zgp+idTxTbrkLqYuKreRnhy65Gf4W0NsDoYiqf6uZsvr8V9eo6XWc5+3TVf/3N1TfeeOONN95444033njjjTfeSI1/IeOYOeO4fGAAAAAASUVORK5CYII=', |
| | | base64BackToTop: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIBAMAAABfdrOtAAAAElBMVEVRUVH+/v5HcEyZmZlRUVFRUVGm1ByOAAAABnRSTlPMzADMTZAJBBGsAAAEnElEQVR42t2cS27jMAyGf7/2U+QCQeDsbeQCgZDujaC5/1UmkzaJn+JDFGcw3LdfflKibJkkDnxrL7dbg7sNt6+L4O8OYBM+B0ys+QrGkHZG+OEEQ8g6go8Bx1GIGMdpNOQyIG6XdMgnSPtKhLQDGEZFBgYMkhKFtGBb0EIEjDgFRowoBVaMGAWpMedEfxMiZtwpUsgZCqtlkCNUdpVAWigtCCCDFtLwIWeoreZCWiRYYEKGFEjDg+yRZCUH0iLRAgNyToXUNCRZyMqWhGnUN2IPm3wSlwJ7IUspyCBkIQUZhCykIIeQuRTkEDKXAuM9srrtYbrZN7Y98giZSoFd+t1OxmMITG0dcrSFXFchZ1tIvQZpYWxhBbK3hpQrkMEa0iwh5t4a+QvZvDXyF7J5a+Qv5PPW21/I5623v5DPW29/IaO3Xv5Clrw1y1/Ikrdm+Qs5svw83yNnSJ5BQb4F/F7EIEJSnThGBAXxkFQfLOviQUE8JAUPsosHBfGQfDAtHhREQ1JxIV00KIgmrnRI84S0yAd5BAXxxJUck0f6Qnwr9qmr6xF5xLMjcwn/iudIEAdWnyjkEXlQKZiRVzoqRyLbgeUKKR8Q4alY7cSnoxzSf2ggsqehKr6YVpcXpOd7H93f60cKhOd7Re2LteUF4eLqiVS1mr0ge4io6C2+soaFkJ7MuuuQs1yITEp9hwwKISIpzR2iESKSIoT0rLNwuVHQqoSIpAQJpGce60vIUSdEIuUqgPTsJ5QFZK8UIpBS8iG94GFrDjlrhfCl8CG96Llxmle4kEr6vKWBPIVo9kqDQSRk9/3cWoikcCFPAd33v4dIChPyEvLzBA6RlEYWke4JEUnhKXkLeUEKxRHJFfKCQHGucIW8IdZSRkLeEGMpYyEjiK2UsZARxFTKRMgYYillImQMMZQyFTKB2EmZCplAuFLIHT8TMoWwpQwiIVMIUwqpZP5bp5CCvCTiQKr5f5lCQN+tPCBn2ZvVDFJwIDUP0m1BYAfZYRNSsCB7BqTbhoARePIxtZ9tgwWkoJcwCalmv3MBAemtO4R6dah2HaKQqj8Zvp9sQDjvJ21+SPCBHPJDDk6QITekEV7gqCC19CpKAym9IMfckKv4olMBCeIrWwVEfvkshzQekO9r9P1/ALk+IG1eSPCDiCJfyG+FyU+A6ZCa/piZDinpz7LpkCv5gdkAEshP5emQhv7onw6pGeULyZCSUYiRDAmMkpJkCKs4JhFSq8p8hJBSVbAkhARV6ZUQoisik0FqXTmcDHLVFfbJIEFXoiiCNMpiSxGkVJaNiiBBWQArgTTaUl4JpNQWJUsgQVteXQg+AKkLxQWFGKW+5J2+eVp4S168X3CF1CltCKdTJ8lb84YK2bUBO+wZW0Pqv9nk4tKu49N45NJC5dMM5tLW5tOg59Jq6NM06dL+abFXwr/RkuvTXJwae1abtE/Dt0/ruksTvs84AZ/BCC4jHnyGVfiM3VBQFANEXEah+Ax18RlP4zNox2dkkM/wI58xTn8yDCXGYCDV3W5RGSajtXyGhG1jbpbjzpwGt/0MJft8jqC7iUbQ/QZaxdnKqcIftwAAAABJRU5ErkJggg==', |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]å·¥å
·ç±» |
| | | |
| | | import zLocalConfig from '../config/index' |
| | | import c from './z-paging-constant' |
| | | |
| | | const storageKey = 'Z-PAGING-REFRESHER-TIME-STORAGE-KEY'; |
| | | let config = null; |
| | | let configLoaded = false; |
| | | let cachedSystemInfo = null; |
| | | const timeoutMap = {}; |
| | | |
| | | // è·åé»è®¤é
ç½®ä¿¡æ¯ |
| | | function gc(key, defaultValue) { |
| | | // è¿éreturnä¸ä¸ªå½æ°ä»¥è§£å³å¨vue3+appvueä¸ï¼propsé»è®¤é
置读åå¨main.jsä¹åæ§è¡å¯¼è´uni.$zpå
¨å±é
ç½®æ æçé®é¢ãç¸å½äºpropsçdefaultä¸ä¼ å
¥ä¸ä¸ªå¸¦æè¿åå¼ç彿° |
| | | return () => { |
| | | // å¤çz-pagingå
¨å±é
ç½® |
| | | _handleDefaultConfig(); |
| | | // 妿å
¨å±é
ç½®ä¸åå¨ï¼åè¿åé»è®¤å¼ |
| | | if (!config) return defaultValue; |
| | | const value = config[key]; |
| | | // 妿å
¨å±é
ç½®åå¨ä½å¯¹åºçé
置项ä¸åå¨ï¼åè¿åé»è®¤å¼ï¼åä¹è¿åé
置项 |
| | | return value === undefined ? defaultValue : value; |
| | | }; |
| | | } |
| | | |
| | | // è·åæç»çtouchä½ç½® |
| | | function getTouch(e) { |
| | | let touch = null; |
| | | if (e.touches && e.touches.length) { |
| | | touch = e.touches[0]; |
| | | } else if (e.changedTouches && e.changedTouches.length) { |
| | | touch = e.changedTouches[0]; |
| | | } else if (e.datail && e.datail != {}) { |
| | | touch = e.datail; |
| | | } else { |
| | | return { touchX: 0, touchY: 0 } |
| | | } |
| | | return { |
| | | touchX: touch.clientX, |
| | | touchY: touch.clientY |
| | | }; |
| | | } |
| | | |
| | | // 夿å½åæå¿æ¯å¦å¨z-pagingå
触å |
| | | function getTouchFromZPaging(target) { |
| | | if (target && target.tagName && target.tagName !== 'BODY' && target.tagName !== 'UNI-PAGE-BODY') { |
| | | const classList = target.classList; |
| | | if (classList && classList.contains('z-paging-content')) { |
| | | // æ¤å¤é¢å¤è®°å½å½åz-pagingæ¯å¦æ¯é¡µé¢æ»å¨ãæ¯å¦æ»å¨å°äºé¡¶é¨ãæ¯å¦æ¯èå¤©è®°å½æ¨¡å¼ä»¥ä¼ ç»renderjsãé¿å
ä¸åz-pagingç»ä»¶renderjså
é¨å¤ææ°æ®äºç¸å½±å导è´çåç§é®é¢ |
| | | return { |
| | | isFromZp: true, |
| | | isPageScroll: classList.contains('z-paging-content-page'), |
| | | isReachedTop: classList.contains('z-paging-reached-top'), |
| | | isUseChatRecordMode: classList.contains('z-paging-use-chat-record-mode') |
| | | }; |
| | | } else { |
| | | return getTouchFromZPaging(target.parentNode); |
| | | } |
| | | } else { |
| | | return { isFromZp: false }; |
| | | } |
| | | } |
| | | |
| | | // éå½è·åz-pagingæå¨çparentï¼å¦ææ¥æ¾ä¸å°åè¿ånull |
| | | function getParent(parent) { |
| | | if (!parent) return null; |
| | | if (parent.$refs.paging) return parent; |
| | | return getParent(parent.$parent); |
| | | } |
| | | |
| | | // æå°éè¯¯ä¿¡æ¯ |
| | | function consoleErr(err) { |
| | | console.error(`[z-paging]${err}`); |
| | | } |
| | | |
| | | // å»¶æ¶æä½ï¼å¦ækeyåå¨ï¼è°ç¨æ¶æ¸
é¤å¯¹åºkeyä¹åçå»¶æ¶æä½ |
| | | function delay(callback, ms = c.delayTime, key) { |
| | | const timeout = setTimeout(callback, ms);; |
| | | if (!!key) { |
| | | timeoutMap[key] && clearTimeout(timeoutMap[key]); |
| | | timeoutMap[key] = timeout; |
| | | } |
| | | return timeout; |
| | | } |
| | | |
| | | // è®¾ç½®ä¸æå·æ°æ¶é´ |
| | | function setRefesrherTime(time, key) { |
| | | const datas = getRefesrherTime() || {}; |
| | | datas[key] = time; |
| | | uni.setStorageSync(storageKey, datas); |
| | | } |
| | | |
| | | // è·å䏿巿°æ¶é´ |
| | | function getRefesrherTime() { |
| | | return uni.getStorageSync(storageKey); |
| | | } |
| | | |
| | | // éè¿ä¸æå·æ°æ è¯keyè·å䏿巿°æ¶é´ |
| | | function getRefesrherTimeByKey(key) { |
| | | const datas = getRefesrherTime(); |
| | | return datas && datas[key] ? datas[key] : null; |
| | | } |
| | | |
| | | // éè¿ä¸æå·æ°æ è¯keyè·å䏿巿°æ¶é´(æ ¼å¼åä¹å) |
| | | function getRefesrherFormatTimeByKey(key, textMap) { |
| | | const time = getRefesrherTimeByKey(key); |
| | | const timeText = time ? _timeFormat(time, textMap) : textMap.none; |
| | | return `${textMap.title}${timeText}`; |
| | | } |
| | | |
| | | // å°ææ¬çpxæè
rpx转为pxçå¼ |
| | | function convertToPx(text) { |
| | | const dataType = Object.prototype.toString.call(text); |
| | | if (dataType === '[object Number]') return text; |
| | | let isRpx = false; |
| | | if (text.indexOf('rpx') !== -1 || text.indexOf('upx') !== -1) { |
| | | text = text.replace('rpx', '').replace('upx', ''); |
| | | isRpx = true; |
| | | } else if (text.indexOf('px') !== -1) { |
| | | text = text.replace('px', ''); |
| | | } |
| | | if (!isNaN(text)) { |
| | | if (isRpx) return Number(rpx2px(text)); |
| | | return Number(text); |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | // rpx => pxï¼é¢ççå
¼å®¹å¤ç |
| | | function rpx2px(rpx) { |
| | | return uni.upx2px(rpx); |
| | | } |
| | | |
| | | // 忥è·åç³»ç»ä¿¡æ¯ï¼å
¼å®¹ä¸åå¹³å° |
| | | function getSystemInfoSync(useCache = false) { |
| | | if (useCache && cachedSystemInfo) { |
| | | return cachedSystemInfo; |
| | | } |
| | | // ç®ååªç¨å°äºdeviceInfoãappBaseInfoåwindowInfoä¸çä¿¡æ¯ï¼å æ¤ä»
æ´åè¿ä¸¤ä¸ªä¿¡æ¯æ°æ® |
| | | const infoTypes = ['DeviceInfo', 'AppBaseInfo', 'WindowInfo']; |
| | | const { deviceInfo, appBaseInfo, windowInfo } = infoTypes.reduce((acc, key) => { |
| | | const method = `get${key}`; |
| | | if (uni[method] && uni.canIUse(method)) { |
| | | acc[key.charAt(0).toLowerCase() + key.slice(1)] = uni[method](); |
| | | } |
| | | return acc; |
| | | }, {}); |
| | | // 妿deviceInfoãappBaseInfoåwindowInfoé½å¯ä»¥ä»åèªä¸å±çapiä¸è·åï¼åæ´åå®ä»¬çæ°æ® |
| | | if (deviceInfo && appBaseInfo && windowInfo) { |
| | | cachedSystemInfo = { ...deviceInfo, ...appBaseInfo, ...windowInfo }; |
| | | } else { |
| | | // 使ç¨uni.getSystemInfoSyncå
åºï¼ç¡®ä¿è½è·åå°æç»çç³»ç»ä¿¡æ¯ |
| | | cachedSystemInfo = uni.getSystemInfoSync(); |
| | | } |
| | | return cachedSystemInfo; |
| | | } |
| | | |
| | | // è·åå½åæ¶é´ |
| | | function getTime() { |
| | | return (new Date()).getTime(); |
| | | } |
| | | |
| | | // è·åz-pagingå®ä¾idï¼éæºçæ10使°å+忝 |
| | | function getInstanceId() { |
| | | const s = []; |
| | | const hexDigits = "0123456789abcdef"; |
| | | for (let i = 0; i < 10; i++) { |
| | | s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); |
| | | } |
| | | return s.join('') + getTime(); |
| | | } |
| | | |
| | | // çå¾
䏿®µæ¶é´ |
| | | function wait(ms) { |
| | | return new Promise(resolve => { |
| | | setTimeout(resolve, ms); |
| | | }); |
| | | } |
| | | |
| | | // æ¯å¦æ¯promise |
| | | function isPromise(func) { |
| | | return Object.prototype.toString.call(func) === '[object Promise]'; |
| | | } |
| | | |
| | | // æ·»å åä½ |
| | | function addUnit(value, unit) { |
| | | if (Object.prototype.toString.call(value) === '[object String]') { |
| | | let tempValue = value; |
| | | tempValue = tempValue.replace('rpx', '').replace('upx', '').replace('px', ''); |
| | | if (value.indexOf('rpx') === -1 && value.indexOf('upx') === -1 && value.indexOf('px') !== -1) { |
| | | tempValue = parseFloat(tempValue) * 2; |
| | | } |
| | | value = tempValue; |
| | | } |
| | | return unit === 'rpx' ? value + 'rpx' : (value / 2) + 'px'; |
| | | } |
| | | |
| | | // æ·±æ·è´ |
| | | function deepCopy(obj) { |
| | | if (typeof obj !== 'object' || obj === null) return obj; |
| | | let newObj = Array.isArray(obj) ? [] : {}; |
| | | for (let key in obj) { |
| | | if (obj.hasOwnProperty(key)) { |
| | | newObj[key] = deepCopy(obj[key]); |
| | | } |
| | | } |
| | | return newObj; |
| | | } |
| | | |
| | | // ------------------ ç§ææ¹æ³ ------------------------ |
| | | // å¤çå
¨å±é
ç½® |
| | | function _handleDefaultConfig() { |
| | | // ç¡®ä¿åªå è½½ä¸æ¬¡å
¨å±é
ç½® |
| | | if (configLoaded) return; |
| | | // ä¼å
ä»config.jsä¸è¯»å |
| | | if (zLocalConfig && Object.keys(zLocalConfig).length) { |
| | | config = zLocalConfig; |
| | | } |
| | | // 妿å¨config.jsä¸è¯»åä¸å°ï¼åå°è¯å°uni.$zp读å |
| | | if (!config && uni.$zp) { |
| | | config = uni.$zp.config; |
| | | } |
| | | // å°configä¸ççæ¨ªçº¿åæ³å
¨é¨è½¬ä¸ºé©¼å³°åæ³ï¼ä½¿å¾è¯»åé
ç½®æ¶å¯ä»¥ç´æ¥éè¿keyå»å¹é
ï¼èéè¯»åæ¯ä¸ªé
ç½®æ¶ååå»è½¬ï¼åå°ä¸å¿
è¦çæ§è½å¼æ¯ |
| | | config = config ? Object.keys(config).reduce((result, key) => { |
| | | result[_toCamelCase(key)] = config[key]; |
| | | return result; |
| | | }, {}) : null; |
| | | configLoaded = true; |
| | | } |
| | | |
| | | // æ¶é´æ ¼å¼å |
| | | function _timeFormat(time, textMap) { |
| | | const date = new Date(time); |
| | | const currentDate = new Date(); |
| | | // 设置time对åºç天ï¼å»é¤æ¶åç§ï¼ä½¿å¾å¯ä»¥ç´æ¥æ¯è¾æ¥æ |
| | | const dateDay = new Date(time).setHours(0, 0, 0, 0); |
| | | // 设置å½åç天ï¼å»é¤æ¶åç§ï¼ä½¿å¾å¯ä»¥ç´æ¥æ¯è¾æ¥æ |
| | | const currentDateDay = new Date().setHours(0, 0, 0, 0); |
| | | const disTime = dateDay - currentDateDay; |
| | | let dayStr = ''; |
| | | const timeStr = _dateTimeFormat(date); |
| | | if (disTime === 0) { |
| | | dayStr = textMap.today; |
| | | } else if (disTime === -86400000) { |
| | | dayStr = textMap.yesterday; |
| | | } else { |
| | | dayStr = _dateDayFormat(date, date.getFullYear() !== currentDate.getFullYear()); |
| | | } |
| | | return `${dayStr} ${timeStr}`; |
| | | } |
| | | |
| | | // dateæ ¼å¼åä¸ºå¹´ææ¥ |
| | | function _dateDayFormat(date, showYear = true) { |
| | | const year = date.getFullYear(); |
| | | const month = date.getMonth() + 1; |
| | | const day = date.getDate(); |
| | | return showYear ? `${year}-${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}` : `${_fullZeroToTwo(month)}-${_fullZeroToTwo(day)}`; |
| | | } |
| | | |
| | | // dataæ ¼å¼å为æ¶å |
| | | function _dateTimeFormat(date) { |
| | | const hour = date.getHours(); |
| | | const minute = date.getMinutes(); |
| | | return `${_fullZeroToTwo(hour)}:${_fullZeroToTwo(minute)}`; |
| | | } |
| | | |
| | | // 䏿»¡2ä½å¨åé¢å¡«å
0 |
| | | function _fullZeroToTwo(str) { |
| | | str = str.toString(); |
| | | return str.length === 1 ? '0' + str : str; |
| | | } |
| | | |
| | | // é©¼å³°è½¬çæ¨ªçº¿ |
| | | function _toKebab(value) { |
| | | return value.replace(/([A-Z])/g, "-$1").toLowerCase(); |
| | | } |
| | | |
| | | // çæ¨ªçº¿è½¬é©¼å³° |
| | | function _toCamelCase(value) { |
| | | return value.replace(/-([a-z])/g, (_, group1) => group1.toUpperCase()); |
| | | } |
| | | |
| | | |
| | | export default { |
| | | gc, |
| | | setRefesrherTime, |
| | | getRefesrherFormatTimeByKey, |
| | | getTouch, |
| | | getTouchFromZPaging, |
| | | getParent, |
| | | convertToPx, |
| | | getTime, |
| | | getInstanceId, |
| | | consoleErr, |
| | | delay, |
| | | wait, |
| | | isPromise, |
| | | addUnit, |
| | | deepCopy, |
| | | rpx2px, |
| | | getSystemInfoSync |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]使ç¨renderjså¨app-vueåh5ä¸å¯¹touchmoveäºä»¶å泡è¿è¡å¤ç |
| | | |
| | | import u from '../js/z-paging-utils' |
| | | const data = { |
| | | startY: 0, |
| | | isTouchFromZPaging: false, |
| | | isUsePageScroll: false, |
| | | isReachedTop: true, |
| | | isIosAndH5: false, |
| | | useChatRecordMode: false, |
| | | appLaunched: false |
| | | } |
| | | |
| | | export default { |
| | | mounted() { |
| | | if (window) { |
| | | this._handleTouch(); |
| | | // #ifdef APP-VUE |
| | | this.$ownerInstance.callMethod('_handlePageLaunch'); |
| | | // #endif |
| | | } |
| | | }, |
| | | methods: { |
| | | // æ¥æ¶é»è¾å±åéçæ°æ®ï¼æ¯å¦æ¯ios+h5ï¼ |
| | | renderPropIsIosAndH5Change(newVal) { |
| | | if (newVal === -1) return; |
| | | data.isIosAndH5 = newVal; |
| | | }, |
| | | |
| | | // æ¦æªå¤çtouchäºä»¶ |
| | | _handleTouch() { |
| | | if (!window.$zPagingRenderJsInited) { |
| | | window.$zPagingRenderJsInited = true; |
| | | window.addEventListener('touchstart', this._handleTouchstart, { passive: true }) |
| | | window.addEventListener('touchmove', this._handleTouchmove, { passive: false }) |
| | | } |
| | | }, |
| | | // å¤çtouchå¼å§ |
| | | _handleTouchstart(e) { |
| | | const touch = u.getTouch(e); |
| | | data.startY = touch.touchY; |
| | | const touchResult = u.getTouchFromZPaging(e.target); |
| | | data.isTouchFromZPaging = touchResult.isFromZp; |
| | | data.isUsePageScroll = touchResult.isPageScroll; |
| | | data.isReachedTop = touchResult.isReachedTop; |
| | | data.useChatRecordMode = touchResult.isUseChatRecordMode; |
| | | }, |
| | | // å¤çtouchä¸ |
| | | _handleTouchmove(e) { |
| | | const touch = u.getTouch(e); |
| | | const moveY = touch.touchY - data.startY; |
| | | // 妿æ¯å¨z-pagingå
触æ¸å¹¶ä¸ï¼æ¯å¨é¡¶é¨ä½ç½®ä¸æ¯ä¸æçæ
åµä¸ï¼æä¸æ¯èå¤©è®°å½æ»å¨æ¨¡å¼å¹¶ä¸å¨iOS+h5+scroll-view并䏿¯å¾ä¸æçæ
åµï¼é¿å
卿¤å¹³å°ä¸æ»å¨å°åºé¨å䏿æä¸ªç³»ç»ç°è²é®ç½©å¯¼è´å表被çæéå®çé®é¢ï¼ï¼ |
| | | // (data.useChatRecordMode ? moveY < 0 : moveY > 0)æ¯ä¸ºäºå¤ææ¯å¦æ¯ä¸æçæ
åµï¼èå¤©è®°å½æ¨¡å¼å表åç½®ï¼å æ¤moveY < 0ä¸ºä¸æ |
| | | if (data.isTouchFromZPaging && ((data.isReachedTop && (data.useChatRecordMode ? moveY < 0 : moveY > 0)) || (!data.useChatRecordMode && data.isIosAndH5 && !data.isUsePageScroll && moveY < 0))) { |
| | | if (e.cancelable && !e.defaultPrevented) { |
| | | // 黿¢äºä»¶å泡ï¼ä»¥é¿å
å¨ä¸äºå¹³å°ä¸ä¸æå·æ°æ¶æ´ä¸ªpageè·çä¸èµ·ä¸æ&å¨iOS+h5+scroll-viewä¸å¨åºé¨ä¸ææä¸ªç³»ç»ç°è²é®ç½©å¯¼è´å表被çæéå®çé®é¢ |
| | | e.preventDefault(); |
| | | } |
| | | } |
| | | }, |
| | | // ç§»é¤touchç¸å
³äºä»¶çå¬ |
| | | _removeAllEventListener(){ |
| | | window.removeEventListener('touchstart'); |
| | | window.removeEventListener('touchmove'); |
| | | } |
| | | } |
| | | }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // [z-paging]微信å°ç¨åºãQQå°ç¨åºãapp-vueãh5ä¸ä½¿ç¨wxså®ç°èªå®ä¹ä¸æå·æ°ï¼éä½é»è¾å±ä¸è§å¾å±çéä¿¡ææï¼æåæ§è½ |
| | | |
| | | var currentDis = 0; |
| | | var isPCFlag = -1; |
| | | var startY = -1; |
| | | |
| | | // çå¬jså±ä¼ è¿æ¥çæ°æ® |
| | | function propObserver(newVal, oldVal, ownerIns, ins) { |
| | | var state = ownerIns.getState() || {}; |
| | | state.currentIns = ins; |
| | | var dataset = ins.getDataset(); |
| | | var loading = dataset.loading == true; |
| | | // 妿æ¯ä¸æå·æ°ç»æï¼æ´æ°transform |
| | | if (newVal && newVal.indexOf('end') != -1) { |
| | | var transition = newVal.split('end')[0]; |
| | | _setTransform('translateY(0px)', ins, false, transition); |
| | | state.moveDis = 0; |
| | | state.oldMoveDis = 0; |
| | | currentDis = 0; |
| | | } else if (newVal && newVal.indexOf('begin') != -1) { |
| | | // 妿æ¯ä¸æå·æ°å¼å§ï¼æ´æ°transform |
| | | var refresherThreshold = ins.getDataset().refresherthreshold; |
| | | _setTransformValue(refresherThreshold, ins, state, false); |
| | | } |
| | | } |
| | | |
| | | // touchå¼å§ |
| | | function touchstart(e, ownerIns) { |
| | | var ins = _getIns(ownerIns); |
| | | var state = {}; |
| | | var dataset = {}; |
| | | ownerIns.callMethod('_handleListTouchstart'); |
| | | if (ins) { |
| | | state = ins.getState(); |
| | | dataset = ins.getDataset(); |
| | | if (_touchDisabled(e, ins, 0)) return; |
| | | } |
| | | var isTouchEnded = state.isTouchEnded; |
| | | state.oldMoveDis = 0; |
| | | var touch = _getTouch(e); |
| | | var loading = _isTrue(dataset.loading); |
| | | state.startY = touch.touchY; |
| | | startY = state.startY; |
| | | state.lastTouch = touch; |
| | | if (!loading && isTouchEnded) { |
| | | state.isTouchmoving = false; |
| | | } |
| | | state.isTouchEnded = false; |
| | | // éç¥jså±touchå¼å§ |
| | | ownerIns.callMethod('_handleRefresherTouchstart', touch); |
| | | } |
| | | |
| | | // touchä¸ |
| | | function touchmove(e, ownerIns) { |
| | | var touch = _getTouch(e); |
| | | var ins = _getIns(ownerIns); |
| | | var dataset = ins.getDataset(); |
| | | var refresherThreshold = dataset.refresherthreshold; |
| | | var refresherF2Threshold = dataset.refresherf2threshold; |
| | | var refresherF2Enabled = _isTrue(dataset.refresherf2enabled); |
| | | var isIos = _isTrue(dataset.isios); |
| | | var state = ins.getState(); |
| | | var watchTouchDirectionChange = _isTrue(dataset.watchtouchdirectionchange); |
| | | var moveDisObj = {}; |
| | | var moveDis = 0; |
| | | var prevent = false; |
| | | // 妿éè¦çå¬touchæ¹åçæ¹å |
| | | if (watchTouchDirectionChange) { |
| | | moveDisObj = _getMoveDis(e, ins); |
| | | moveDis = moveDisObj.currentDis; |
| | | prevent = moveDisObj.isDown; |
| | | var direction = prevent ? 'top' : 'bottom'; |
| | | // ç¡®ä¿åªå¨touchæ¹åæ¹åæ¶éç¥ä¸æ¬¡jså±ï¼è䏿¯touchmove䏿ç»éç¥ |
| | | if (prevent == state.oldTouchDirection && prevent != state.oldEmitedTouchDirection) { |
| | | ownerIns.callMethod('_handleTouchDirectionChange', { direction: direction }); |
| | | state.oldEmitedTouchDirection = prevent; |
| | | } |
| | | state.oldTouchDirection = prevent; |
| | | } |
| | | // 夿æ¯å¦å
è®¸ä¸æå·æ° |
| | | if (_touchDisabled(e, ins, 1)) { |
| | | _handlePullingDown(state, ownerIns, false); |
| | | return true; |
| | | } |
| | | // 夿䏿巿°çè§åº¦æ¯å¦å¨è¦æ±èå´å
|
| | | if (!_getAngleIsInRange(e, touch, state, dataset)) { |
| | | _handlePullingDown(state, ownerIns, false); |
| | | return true; |
| | | } |
| | | moveDisObj = _getMoveDis(e, ins); |
| | | moveDis = moveDisObj.currentDis; |
| | | prevent = moveDisObj.isDown; |
| | | if (moveDis < 0) { |
| | | // moveDiså°äº0ï¼å°transformé置为0 |
| | | _setTransformValue(0, ins, state, false); |
| | | _handlePullingDown(state, ownerIns, false); |
| | | return true; |
| | | } |
| | | if (prevent && !state.disabledBounce) { |
| | | // 妿æ¯ç¨æ·ä¸æå¹¶ä¸éè¦è§¦å䏿巿°ï¼éè¦éç¥jså±å°åè¡¨ç¦æ¢æ»å¨ï¼é²æ¢å¨ä¸æå·æ°è¿ç¨ä¸å表ä¹å¯ä»¥æ»å¨å¯¼è´ç䏿巿°åç§»è¿å¤§çé®é¢ï¼å¨ä¸æå·æ°è¿ç¨ä¸ä»
éç¥ä¸æ¬¡ï¼ |
| | | ownerIns.callMethod('_handleScrollViewBounce', { bounce: false }); |
| | | state.disabledBounce = true; |
| | | _handlePullingDown(state, ownerIns, prevent); |
| | | return !prevent; |
| | | } |
| | | // æ´æ°transform |
| | | _setTransformValue(moveDis, ins, state, false); |
| | | var oldRefresherStatus = state.refresherStatus; |
| | | var oldIsTouchmoving = _isTrue(dataset.oldistouchmoving); |
| | | var hasTouchmove = _isTrue(dataset.hastouchmove); |
| | | var isTouchmoving = state.isTouchmoving; |
| | | state.refresherStatus = moveDis >= refresherThreshold ? (refresherF2Enabled && moveDis > refresherF2Threshold ? 'goF2' : 'releaseToRefresh') : 'default'; |
| | | if (!isTouchmoving) { |
| | | state.isTouchmoving = true; |
| | | isTouchmoving = true; |
| | | } |
| | | if (state.isTouchEnded) { |
| | | state.isTouchEnded = false; |
| | | } |
| | | // 妿éè¦å®æ¶çå¬ä¸æä½ç½®åç§»ï¼åéè¦å®æ¶éç¥jså±ï¼æ¤æä½ä¼ä½¿wxså±ä¸jså±é¢ç¹éä¿¡ä»è导è´å¨ä¸äºæ§è½è¾å·®è®¾å¤ä¸ä¸æå·æ°å¡é¡¿ |
| | | if (hasTouchmove) { |
| | | ownerIns.callMethod('_handleWxsPullingDown', { moveDis: moveDis, diffDis: moveDisObj.diffDis }); |
| | | } |
| | | // å¨ä¸æå·æ°ç¶ææ¹åæ¶éç¥jså± |
| | | if (oldRefresherStatus == undefined || oldRefresherStatus != state.refresherStatus || oldIsTouchmoving != isTouchmoving) { |
| | | ownerIns.callMethod('_handleRefresherTouchmove', moveDis, touch); |
| | | } |
| | | _handlePullingDown(state, ownerIns, prevent); |
| | | return !prevent; |
| | | } |
| | | |
| | | // touchç»æ |
| | | function touchend(e, ownerIns) { |
| | | var touch = _getTouch(e); |
| | | var ins = _getIns(ownerIns); |
| | | var dataset = ins.getDataset(); |
| | | var state = ins.getState(); |
| | | if (state.disabledBounce) { |
| | | // éç¥jså
许å表æ»å¨ |
| | | ownerIns.callMethod('_handleScrollViewBounce', { bounce: true }); |
| | | state.disabledBounce = false; |
| | | } |
| | | if (_touchDisabled(e, ins, 2)) return; |
| | | state.reachMaxAngle = true; |
| | | state.hitReachMaxAngleCount = 0; |
| | | state.fixedIsTopHitCount = 0; |
| | | if (!state.isTouchmoving) return; |
| | | var oldRefresherStatus = state.refresherStatus; |
| | | var oldMoveDis = state.moveDis; |
| | | var refresherThreshold = ins.getDataset().refresherthreshold; |
| | | var moveDis = _getMoveDis(e, ins).currentDis; |
| | | if (!(moveDis >= refresherThreshold && oldRefresherStatus === 'releaseToRefresh')) { |
| | | state.isTouchmoving = false; |
| | | } |
| | | // éç¥jså±touchç»æ |
| | | ownerIns.callMethod('_handleRefresherTouchend', moveDis); |
| | | state.isTouchEnded = true; |
| | | if (oldMoveDis < refresherThreshold) return; |
| | | var animate = false; |
| | | if (moveDis >= refresherThreshold) { |
| | | moveDis = refresherThreshold; |
| | | animate = true; |
| | | } |
| | | _setTransformValue(moveDis, ins, state, animate); |
| | | } |
| | | |
| | | // #ifdef H5 |
| | | // 夿æ¯å¦æ¯pcå¹³å° |
| | | function isPC() { |
| | | if (!navigator) return false; |
| | | if (isPCFlag != -1) return isPCFlag; |
| | | var agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; |
| | | isPCFlag = agents.every(function(item) { return navigator.userAgent.indexOf(item) < 0 }); |
| | | return isPCFlag; |
| | | } |
| | | |
| | | var movable = false; |
| | | |
| | | // å¨pcå¹³å°çå¬mousedownãmousemoveãmouseupçç¸å
³äºä»¶å¹¶è½¬ä¸ºå¯¹åºtouchäºä»¶å¤çï¼ä½¿å¾å¨pcå¹³å°ä¹æ¯æéè¿é¼ æ è¿è¡ä¸æå·æ° |
| | | |
| | | function mousedown(e, ins) { |
| | | if (!isPC()) return; |
| | | touchstart(e, ins); |
| | | movable = true; |
| | | } |
| | | |
| | | function mousemove(e, ins) { |
| | | if (!isPC() || !movable) return; |
| | | touchmove(e, ins); |
| | | } |
| | | |
| | | function mouseup(e, ins) { |
| | | if (!isPC()) return; |
| | | touchend(e, ins); |
| | | movable = false; |
| | | } |
| | | |
| | | function mouseleave(e, ins) { |
| | | if (!isPC()) return; |
| | | movable = false; |
| | | } |
| | | // #endif |
| | | |
| | | |
| | | // ä¿®æ¹è§å¾å±transform |
| | | function _setTransformValue(value, ins, state, animate) { |
| | | value = value || 0; |
| | | if (state.moveDis == value) return; |
| | | state.moveDis = value; |
| | | _setTransform('translateY(' + value + 'px)', ins, animate, ''); |
| | | } |
| | | |
| | | // 设置è§å¾å±transformï¼ç´æ¥å¨è§å¾å±æä½ä¸æå·æ°ï¼ä½¿å¾jså±ä¸éè¦é¢ç¹åè§å¾å±éä¿¡ï¼ä»è大大æå䏿巿°æ§è½ |
| | | function _setTransform(transform, ins, animate, transition) { |
| | | var dataset = ins.getDataset(); |
| | | if (_isTrue(dataset.refreshernotransform)) return; |
| | | transform = transform == 'translateY(0px)' ? 'none' : transform; |
| | | ins.requestAnimationFrame(function() { |
| | | var stl = { 'transform': transform }; |
| | | if (animate) { |
| | | stl['transition'] = 'transform .1s linear'; |
| | | } |
| | | if (transition.length) { |
| | | stl['transition'] = transition; |
| | | } |
| | | ins.setStyle(stl); |
| | | }) |
| | | } |
| | | |
| | | // è¿ä¸æ¥å¤ç䏿巿°çåç§»æ°æ® |
| | | function _getMoveDis(e, ins) { |
| | | var state = ins.getState(); |
| | | var refresherThreshold = parseFloat(ins.getDataset().refresherthreshold); |
| | | var refresherOutRate = parseFloat(ins.getDataset().refresheroutrate); |
| | | var refresherPullRate = parseFloat(ins.getDataset().refresherpullrate); |
| | | var touch = _getTouch(e); |
| | | var currentStartY = !state.startY || state.startY == 'NaN' ? startY : state.startY; |
| | | var moveDis = touch.touchY - currentStartY; |
| | | var oldMoveDis = state.oldMoveDis || 0; |
| | | state.oldMoveDis = moveDis; |
| | | // è·åå½å䏿巿°ä½ç½®ä¸ä¸æ¬¡çåç§»é |
| | | var diffDis = moveDis - oldMoveDis; |
| | | if (diffDis > 0) { |
| | | // 对åç§»éè¿è¡è¿ä¸æ¥å¤çï¼éè¿refresherPullRateçé
ç½®è¿è¡çº¦æ |
| | | diffDis = diffDis * refresherPullRate; |
| | | if (currentDis > refresherThreshold) { |
| | | diffDis = diffDis * (1 - refresherOutRate); |
| | | } |
| | | } |
| | | // æ§å¶diffDisè¿å¤§çæ
åµï¼æ¯å¦è¿å
¥é¡µé¢çªç¶çç¶ä¸æï¼æ¤æ¶diffDisä¸åºè¿è¡å¤ªå¤§çåç§» |
| | | diffDis = diffDis > 100 ? diffDis / 100 : (diffDis > 20 ? diffDis / 2.2 : diffDis); |
| | | currentDis += diffDis; |
| | | currentDis = Math.max(0, currentDis); |
| | | return { |
| | | currentDis: currentDis, |
| | | diffDis: diffDis, |
| | | isDown: diffDis > 0 |
| | | }; |
| | | } |
| | | |
| | | // è·åç»è¿ç»ä¸æ ¼å¼å
è£
çå½åtouch对象 |
| | | function _getTouch(e) { |
| | | var touch = e; |
| | | if (e.touches && e.touches.length) { |
| | | touch = e.touches[0]; |
| | | } else if (e.changedTouches && e.changedTouches.length) { |
| | | touch = e.changedTouches[0]; |
| | | } else if (e.datail && e.datail != {}) { |
| | | touch = e.datail; |
| | | } |
| | | return { |
| | | touchX: touch.clientX, |
| | | touchY: touch.clientY |
| | | }; |
| | | } |
| | | |
| | | // è·åå½åcurrentIns |
| | | function _getIns(ownerIns) { |
| | | var ins = ownerIns.getState().currentIns; |
| | | if (!ins) { |
| | | ownerIns.callMethod('_handlePropUpdate'); |
| | | } |
| | | return ins; |
| | | } |
| | | |
| | | // 夿å½åç¶ææ¯å¦å
è®¸ä¸æå·æ° |
| | | function _touchDisabled(e, ins, processTag) { |
| | | var dataset = ins.getDataset(); |
| | | var state = ins.getState(); |
| | | var loading = _isTrue(dataset.loading); |
| | | var useChatRecordMode = _isTrue(dataset.usechatrecordmode); |
| | | var refresherEnabled = _isTrue(dataset.refresherenabled); |
| | | var useCustomRefresher = _isTrue(dataset.usecustomrefresher); |
| | | var usePageScroll = _isTrue(dataset.usepagescroll); |
| | | var pageScrollTop = parseFloat(dataset.pagescrolltop); |
| | | var scrollTop = parseFloat(dataset.scrolltop); |
| | | var finalScrollTop = usePageScroll ? pageScrollTop : scrollTop; |
| | | var fixedIsTop = false; |
| | | // æ¯å¦è¦å¤çæ»å¨å°é¡¶é¨scrollTopä¸ä¸º0æ¶åç容éï¼ä¸ºè§£å³å¨å®åä¸scroll-viewææ¦çæ»å¨å°é¡¶é¨æ¶scrollTopä¸ä¸º0导è´ä¸æå·æ°å¤æå¼å¸¸ï¼ä½æ¤æ¹æ¡ä¼å¯¼è´æäºæ
åµï¼ä¾å¦æ»å¨å°è·ç¦»é¡¶é¨10pxå¤ï¼ä¸ææå¨ï¼å æ¤æ¹ä¸ºéè¿è·åzp-scroll-viewçèç¹ä¿¡æ¯ä¸çscrollTopè¿è¡éªè¯çæ¹æ¡ |
| | | var handleFaultTolerantMove = false; |
| | | if (handleFaultTolerantMove && finalScrollTop == (state.startScrollTop || 0) && finalScrollTop <= 105) { |
| | | fixedIsTop = true; |
| | | } |
| | | var fixedIsTopHitCount = state.fixedIsTopHitCount || 0; |
| | | if (fixedIsTop) { |
| | | fixedIsTopHitCount ++; |
| | | if (fixedIsTopHitCount <= 2) { |
| | | fixedIsTop = false; |
| | | } |
| | | state.fixedIsTopHitCount = fixedIsTopHitCount; |
| | | } else { |
| | | state.fixedIsTopHitCount = 0; |
| | | } |
| | | if (handleFaultTolerantMove && processTag === 0) { |
| | | state.startScrollTop = finalScrollTop || 0; |
| | | } |
| | | if (handleFaultTolerantMove && processTag === 2) { |
| | | fixedIsTop = true; |
| | | } |
| | | return loading || useChatRecordMode || !refresherEnabled || !useCustomRefresher || |
| | | ((usePageScroll && useCustomRefresher && pageScrollTop > 5) && !fixedIsTop) || |
| | | ((!usePageScroll && useCustomRefresher && scrollTop > 5) && !fixedIsTop); |
| | | } |
| | | |
| | | // 夿䏿巿°çè§åº¦æ¯å¦å¨è¦æ±èå´å
|
| | | function _getAngleIsInRange(e, touch, state, dataset) { |
| | | var maxAngle = dataset.refreshermaxangle; |
| | | var refresherAecc = _isTrue(dataset.refresheraecc); |
| | | var lastTouch = state.lastTouch; |
| | | var reachMaxAngle = state.reachMaxAngle; |
| | | var moveDis = state.oldMoveDis; |
| | | if (!lastTouch) return true; |
| | | if (maxAngle >= 0 && maxAngle <= 90 && lastTouch) { |
| | | // èè䏿巿°æå¿ç±æ°´å¹³ç§»å¨è½¬ä¸ºåç´æ¹åç§»å¨çæ
åµï¼æ¤æ¶ä¸åºå½åªå¤æåç´æ¹åè§åº¦æ¯å¦ç¬¦åè¦æ±ï¼åºå½ç´æ¥ç¦æ¢ä»¥é¿å
å¨swiperä¸ä½¿ç¨ä¸æå·æ°æ¶ï¼æ¨ªå忢swiperé䏿æªç¦»å¼å±å¹è¿å¯ä»¥ä¸æå·æ°çé®é¢ |
| | | if ((!moveDis || moveDis < 1) && !refresherAecc && reachMaxAngle != null && !reachMaxAngle) return false; |
| | | var x = Math.abs(touch.touchX - lastTouch.touchX); |
| | | var y = Math.abs(touch.touchY - lastTouch.touchY); |
| | | var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); |
| | | if ((x || y) && x > 1) { |
| | | // è·å䏿巿°åå两次ä½ç§»çè§åº¦ |
| | | var angle = Math.asin(y / z) / Math.PI * 180; |
| | | if (angle < maxAngle) { |
| | | // 妿è§åº¦å°äºé
ç½®è¦æ±ï¼åreturnï¼åæ¶éè¿hitReachMaxAngleCountæ§å¶è§åº¦å¤æççµæç¨åº¦ä»¥æå¤§ç¨åº¦å
¼å®¹åç§ä½¿ç¨åºæ¯ |
| | | var hitReachMaxAngleCount = state.hitReachMaxAngleCount || 0; |
| | | state.hitReachMaxAngleCount = ++hitReachMaxAngleCount; |
| | | if (state.hitReachMaxAngleCount > 2) { |
| | | state.lastTouch = touch; |
| | | state.reachMaxAngle = false; |
| | | } |
| | | return false; |
| | | } |
| | | } |
| | | } |
| | | state.lastTouch = touch; |
| | | return true; |
| | | } |
| | | |
| | | // è¿ä¸æ¥å¤çæ¯å¦å¨ä¸æå·æ°å¹¶éç¥jså± |
| | | function _handlePullingDown(state, ins, onPullingDown) { |
| | | var oldOnPullingDown = state.onPullingDown || false; |
| | | if (oldOnPullingDown != onPullingDown) { |
| | | ins.callMethod('_handleWxsPullingDownStatusChange', onPullingDown); |
| | | } |
| | | state.onPullingDown = onPullingDown; |
| | | } |
| | | |
| | | // 夿jså±ä¼ è¿æ¥ç弿¯å¦ä¸ºtrue |
| | | function _isTrue(value) { |
| | | value = (typeof(value) === 'string' ? JSON.parse(value) : value) || false; |
| | | return value == true || value == 'true'; |
| | | } |
| | | |
| | | module.exports = { |
| | | touchstart: touchstart, |
| | | touchmove: touchmove, |
| | | touchend: touchend, |
| | | mousedown: mousedown, |
| | | mousemove: mousemove, |
| | | mouseup: mouseup, |
| | | mouseleave: mouseleave, |
| | | propObserver: propObserver |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <!-- _ |
| | | ____ _ __ __ _ __ _(_)_ __ __ _ |
| | | |_ /____| '_ \ / _` |/ _` | | '_ \ / _` | |
| | | / /_____| |_) | (_| | (_| | | | | | (_| | |
| | | /___| | .__/ \__,_|\__, |_|_| |_|\__, | |
| | | |_| |___/ |___/ |
| | | v2.8.6 (2025-03-17) |
| | | @author ZXLee <admin@zxlee.cn> |
| | | --> |
| | | <!-- ææ¡£å°åï¼https://z-paging.zxlee.cn --> |
| | | <!-- githubå°åï¼https://github.com/SmileZXLee/uni-z-paging --> |
| | | <!-- dcloudå°åï¼https://ext.dcloud.net.cn/plugin?id=3935 --> |
| | | <!-- åé¦QQ群ï¼343409055 --> |
| | | |
| | | <template name="z-paging"> |
| | | <!-- #ifndef APP-NVUE --> |
| | | <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]"> |
| | | <!-- #ifndef APP-PLUS --> |
| | | <view v-if="cssSafeAreaInsetBottom===-1" class="zp-safe-area-inset-bottom"></view> |
| | | <!-- #endif --> |
| | | <!-- äºæ¥¼view --> |
| | | <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}]"> |
| | | <slot name="f2"/> |
| | | </view> |
| | | <!-- é¡¶é¨åºå®çslot --> |
| | | <slot v-if="!usePageScroll&&zSlots.top" name="top" /> |
| | | <view class="zp-page-top" @touchmove.stop.prevent v-else-if="usePageScroll&&zSlots.top" :style="[{'top':`${windowTop}px`,'z-index':topZIndex}]"> |
| | | <slot name="top" /> |
| | | </view> |
| | | <view :class="{'zp-view-super':true,'zp-scroll-view-super':!usePageScroll}" :style="[finalScrollViewStyle]"> |
| | | <view v-if="zSlots.left" :class="{'zp-page-left':true,'zp-absoulte':finalIsOldWebView}"> |
| | | <slot name="left" /> |
| | | </view> |
| | | <view :class="{'zp-scroll-view-container':true,'zp-absoulte':finalIsOldWebView}" :style="[scrollViewContainerStyle]"> |
| | | <scroll-view |
| | | ref="zp-scroll-view" :class="{'zp-scroll-view':true,'zp-scroll-view-absolute':!usePageScroll,'zp-scroll-view-hide-scrollbar':!showScrollbar}" :style="[chatRecordRotateStyle]" |
| | | :scroll-top="scrollTop" :scroll-left="scrollLeft" :scroll-x="scrollX" |
| | | :scroll-y="finalScrollable" :enable-back-to-top="finalEnableBackToTop" |
| | | :show-scrollbar="showScrollbar" :scroll-with-animation="finalScrollWithAnimation" |
| | | :scroll-into-view="scrollIntoView" :lower-threshold="finalLowerThreshold" :upper-threshold="5" |
| | | :refresher-enabled="finalRefresherEnabled&&!useCustomRefresher" :refresher-threshold="finalRefresherThreshold" |
| | | :refresher-default-style="finalRefresherDefaultStyle" :refresher-background="refresherBackground" |
| | | :refresher-triggered="finalRefresherTriggered" @scroll="_scroll" @scrolltolower="_onScrollToLower" |
| | | @scrolltoupper="_onScrollToUpper" @refresherrestore="_onRestore" @refresherrefresh="_onRefresh(true)" |
| | | > |
| | | <view class="zp-paging-touch-view" |
| | | <!-- #ifndef APP-VUE || MP-WEIXIN || MP-QQ || H5 --> |
| | | @touchstart="_refresherTouchstart" @touchmove="_refresherTouchmove" @touchend="_refresherTouchend" @touchcancel="_refresherTouchend" |
| | | <!-- #endif --> |
| | | <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 --> |
| | | @touchstart="pagingWxs.touchstart" @touchmove="pagingWxs.touchmove" @touchend="pagingWxs.touchend" @touchcancel="pagingWxs.touchend" |
| | | @mousedown="pagingWxs.mousedown" @mousemove="pagingWxs.mousemove" @mouseup="pagingWxs.mouseup" @mouseleave="pagingWxs.mouseleave" |
| | | <!-- #endif --> |
| | | > |
| | | <view v-if="finalRefresherFixedBacHeight>0" class="zp-fixed-bac-view" :style="[{'background': refresherFixedBackground,'height': `${finalRefresherFixedBacHeight}px`}]"></view> |
| | | <view class="zp-paging-main" :style="[scrollViewInStyle,{'transform': finalRefresherTransform,'transition': refresherTransition}]" |
| | | <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 --> |
| | | :change:prop="pagingWxs.propObserver" :prop="wxsPropType" |
| | | :data-refresherThreshold="finalRefresherThreshold" :data-refresherF2Enabled="refresherF2Enabled" :data-refresherF2Threshold="finalRefresherF2Threshold" :data-isIos="isIos" |
| | | :data-loading="loading||isRefresherInComplete" :data-useChatRecordMode="useChatRecordMode" |
| | | :data-refresherEnabled="refresherEnabled" :data-useCustomRefresher="useCustomRefresher" :data-pageScrollTop="wxsPageScrollTop" |
| | | :data-scrollTop="wxsScrollTop" :data-refresherMaxAngle="refresherMaxAngle" :data-refresherNoTransform="refresherNoTransform" |
| | | :data-refresherAecc="refresherAngleEnableChangeContinued" :data-usePageScroll="usePageScroll" :data-watchTouchDirectionChange="watchTouchDirectionChange" |
| | | :data-oldIsTouchmoving="isTouchmoving" :data-refresherOutRate="finalRefresherOutRate" :data-refresherPullRate="finalRefresherPullRate" :data-hasTouchmove="hasTouchmove" |
| | | <!-- #endif --> |
| | | <!-- #ifdef APP-VUE || H5 --> |
| | | :change:renderPropIsIosAndH5="pagingRenderjs.renderPropIsIosAndH5Change" :renderPropIsIosAndH5="isIosAndH5" |
| | | <!-- #endif --> |
| | | > |
| | | <view v-if="showRefresher" class="zp-custom-refresher-view" :style="[{'margin-top': `-${finalRefresherThreshold+refresherThresholdUpdateTag}px`,'background': refresherBackground,'opacity': isTouchmoving ? 1 : 0}]"> |
| | | <view class="zp-custom-refresher-container" :style="[{'height': `${finalRefresherThreshold}px`,'background': refresherBackground}]"> |
| | | <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" /> |
| | | <!-- 䏿巿°view --> |
| | | <view class="zp-custom-refresher-slot-view"> |
| | | <slot v-if="!(zSlots.refresherComplete&&refresherStatus===R.Complete)&&!(zSlots.refresherF2&&refresherStatus===R.GoF2)" :refresherStatus="refresherStatus" name="refresher" /> |
| | | </view> |
| | | <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" /> |
| | | <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" /> |
| | | <z-paging-refresh ref="refresh" v-else-if="!showCustomRefresher" class="zp-custom-refresher-refresh" :style="[{'height': `${finalRefresherThreshold - finalRefresherThresholdPlaceholder}px`}]" :status="refresherStatus" |
| | | :defaultThemeStyle="finalRefresherThemeStyle" :defaultText="finalRefresherDefaultText" :isIos="isIos" |
| | | :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text" |
| | | :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated" |
| | | :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap" |
| | | :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" /> |
| | | </view> |
| | | </view> |
| | | <view class="zp-paging-container" :style="[{justifyContent:useChatRecordMode?'flex-end':'flex-start'}]"> |
| | | <!-- å
¨å±Loading --> |
| | | <slot v-if="showLoading&&zSlots.loading&&!loadingFullFixed" name="loading" /> |
| | | <!-- 主ä½å
容 --> |
| | | <view class="zp-paging-container-content" :style="[finalPlaceholderTopHeightStyle,finalPagingContentStyle]"> |
| | | <!-- #ifdef VUE3 --> |
| | | <!-- èæå表顶é¨å ä½view --> |
| | | <view v-if="useVirtualList" class="zp-virtual-placeholder" :style="[{height:virtualPlaceholderTopHeight+'px'}]"/> |
| | | <!-- #endif --> |
| | | <slot /> |
| | | <!-- å
ç½®å表&èæå表 --> |
| | | <template v-if="finalUseInnerList"> |
| | | <slot name="header"/> |
| | | <view class="zp-list-container" :style="[innerListStyle]"> |
| | | <template v-if="finalUseVirtualList"> |
| | | <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)"> |
| | | <view v-if="useCompatibilityMode">使ç¨å
¼å®¹æ¨¡å¼è¯·å¨ç»ä»¶æºç z-paging.vue第103è¡ä¸æ³¨éè¿ä¸è¡ï¼å¹¶æå¼ä¸é¢ä¸è¡æ³¨é</view> |
| | | <!-- <zp-public-virtual-cell v-if="useCompatibilityMode" :extraData="extraData" :item="item" :index="virtualTopRangeIndex+index" /> --> |
| | | <slot v-else name="cell" :item="item" :index="virtualTopRangeIndex+index"/> |
| | | </view> |
| | | </template> |
| | | <template v-else> |
| | | <view class="zp-list-cell" v-for="(item,index) in realTotalData" :key="index" @click="_innerCellClick(item,index)"> |
| | | <slot name="cell" :item="item" :index="index"/> |
| | | </view> |
| | | </template> |
| | | </view> |
| | | <slot name="footer"/> |
| | | </template> |
| | | <!-- èå¤©è®°å½æ¨¡å¼å è½½æ´å¤loading --> |
| | | <template v-if="useChatRecordMode&&realTotalData.length>=defaultPageSize&&(loadingStatus!==M.NoMore||zSlots.chatNoMore)&&(realTotalData.length||(showChatLoadingWhenReload&&showLoading))&&!isFirstPageAndNoMore"> |
| | | <view :style="[chatRecordRotateStyle]"> |
| | | <slot v-if="loadingStatus===M.NoMore&&zSlots.chatNoMore" name="chatNoMore" /> |
| | | <template v-else> |
| | | <slot v-if="zSlots.chatLoading" :loadingMoreStatus="loadingStatus" name="chatLoading" /> |
| | | <z-paging-load-more v-else @doClick="_onLoadingMore('click')" :zConfig="zLoadMoreConfig" /> |
| | | </template> |
| | | </view> |
| | | </template> |
| | | <!-- èæå表åºé¨å ä½view --> |
| | | <view v-if="useVirtualList" class="zp-virtual-placeholder" :style="[{height:virtualPlaceholderBottomHeight+'px'}]"/> |
| | | <!-- 䏿å è½½æ´å¤view --> |
| | | <!-- #ifndef MP-ALIPAY --> |
| | | <slot v-if="showLoadingMoreDefault" name="loadingMoreDefault" /> |
| | | <slot v-else-if="showLoadingMoreLoading" name="loadingMoreLoading" /> |
| | | <slot v-else-if="showLoadingMoreNoMore" name="loadingMoreNoMore" /> |
| | | <slot v-else-if="showLoadingMoreFail" name="loadingMoreFail" /> |
| | | <z-paging-load-more @doClick="_onLoadingMore('click')" v-else-if="showLoadingMoreCustom" :zConfig="zLoadMoreConfig" /> |
| | | <!-- #endif --> |
| | | <!-- #ifdef MP-ALIPAY --> |
| | | <slot v-if="loadingStatus===M.Default&&zSlots.loadingMoreDefault&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode" name="loadingMoreDefault" /> |
| | | <slot v-else-if="loadingStatus===M.Loading&&zSlots.loadingMoreLoading&&showLoadingMore&&loadingMoreEnabled" name="loadingMoreLoading" /> |
| | | <slot v-else-if="loadingStatus===M.NoMore&&zSlots.loadingMoreNoMore&&showLoadingMore&&showLoadingMoreNoMoreView&&loadingMoreEnabled&&!useChatRecordMode" name="loadingMoreNoMore" /> |
| | | <slot v-else-if="loadingStatus===M.Fail&&zSlots.loadingMoreFail&&showLoadingMore&&loadingMoreEnabled&&!useChatRecordMode" name="loadingMoreFail" /> |
| | | <z-paging-load-more @doClick="_onLoadingMore('click')" v-else-if="showLoadingMore&&showDefaultLoadingMoreText&&!(loadingStatus===M.NoMore&&!showLoadingMoreNoMoreView)&&loadingMoreEnabled&&!useChatRecordMode" :zConfig="zLoadMoreConfig" /> |
| | | <!-- #endif --> |
| | | <view v-if="safeAreaInsetBottom&&useSafeAreaPlaceholder&&!useChatRecordMode" class="zp-safe-area-placeholder" :style="[{height:safeAreaBottom+'px'}]" /> |
| | | </view> |
| | | <!-- ç©ºæ°æ®å¾ --> |
| | | <view v-if="showEmpty" :class="{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}" :style="[emptyViewSuperStyle,chatRecordRotateStyle]"> |
| | | <slot v-if="zSlots.empty" name="empty" :isLoadFailed="isLoadFailed"/> |
| | | <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" :emptyViewFixed="emptyViewFixed" :unit="unit" |
| | | @reload="_emptyViewReload" @viewClick="_emptyViewClick" /> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </scroll-view> |
| | | </view> |
| | | <view v-if="zSlots.right" :class="{'zp-page-right':true,'zp-absoulte zp-right':finalIsOldWebView}"> |
| | | <slot name="right" /> |
| | | </view> |
| | | </view> |
| | | <!-- åºé¨åºå®çslot --> |
| | | <view class="zp-page-bottom-container" :style="{'background': bottomBgColor}"> |
| | | <slot v-if="!usePageScroll&&zSlots.bottom" name="bottom" /> |
| | | <view class="zp-page-bottom" @touchmove.stop.prevent v-else-if="usePageScroll&&zSlots.bottom" :style="[{'bottom': `${windowBottom}px`}]"> |
| | | <slot name="bottom" /> |
| | | </view> |
| | | <!-- èå¤©è®°å½æ¨¡å¼åºé¨å ä½ --> |
| | | <template v-if="useChatRecordMode&&autoAdjustPositionWhenChat"> |
| | | <view :style="[{height:chatRecordModeSafeAreaBottom+'px'}]" /> |
| | | <view class="zp-page-bottom-keyboard-placeholder-animate" :style="[{height:keyboardHeight+'px'}]" /> |
| | | </template> |
| | | </view> |
| | | <!-- ç¹å»è¿åé¡¶é¨view --> |
| | | <view v-if="showBackToTopClass" :class="finalBackToTopClass" :style="[finalBackToTopStyle]" @click.stop="_backToTopClick"> |
| | | <slot v-if="zSlots.backToTop" name="backToTop" /> |
| | | <image v-else class="zp-back-to-top-img" :class="{'zp-back-to-top-img-inversion': useChatRecordMode&&!backToTopImg.length}" :src="backToTopImg.length?backToTopImg:base64BackToTop" /> |
| | | </view> |
| | | <!-- å
¨å±Loading(éºæ»¡z-pagingå¹¶åºå®) --> |
| | | <view v-if="showLoading&&zSlots.loading&&loadingFullFixed" class="zp-loading-fixed"> |
| | | <slot name="loading" /> |
| | | </view> |
| | | </view> |
| | | <!-- #endif --> |
| | | <!-- #ifdef APP-NVUE --> |
| | | <component ref="z-paging-content" :is="finalNvueSuperListIs" :style="[finalPagingStyle]" :class="{'z-paging-content-fixed':fixed&&!usePageScroll}" :scrollable="false"> |
| | | <!-- äºæ¥¼view --> |
| | | <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}]"> |
| | | <slot name="f2"/> |
| | | </view> |
| | | <!-- é¡¶é¨åºå®çslot --> |
| | | <view ref="zp-page-top" v-if="zSlots.top" :class="{'zp-page-top':usePageScroll}" :style="[usePageScroll?{'top':`${windowTop}px`,'z-index':topZIndex}:{}]"> |
| | | <slot name="top" /> |
| | | </view> |
| | | <!-- èå¤©è®°å½æ¨¡å¼å è½½æ´å¤loadingï¼loadingæ¶åæ¾ç¤ºï¼ --> |
| | | <view v-if="useChatRecordMode&&loadingStatus!==M.NoMore&&showChatLoadingWhenReload&&showLoading"> |
| | | <slot v-if="zSlots.chatLoading" :loadingMoreStatus="loadingStatus" name="chatLoading" /> |
| | | <z-paging-load-more v-else @doClick="_onLoadingMore('click')" :zConfig="zLoadMoreConfig" /> |
| | | </view> |
| | | <component :is="finalNvueSuperListIs" class="zp-n-list-container" :scrollable="false"> |
| | | <view v-if="zSlots.left" class="zp-page-left"> |
| | | <slot name="left" /> |
| | | </view> |
| | | <component :is="finalNvueListIs" ref="zp-n-list" :id="nvueListId" :style="[{'flex': 1,'top':isIos?'0px':'-1px'},usePageScroll?scrollViewStyle:{},chatRecordRotateStyle]" :alwaysScrollableVertical="true" |
| | | :fixFreezing="nFixFreezing" :show-scrollbar="showScrollbar" :loadmoreoffset="finalLowerThreshold" :enable-back-to-top="enableBackToTop" |
| | | :scrollable="finalScrollable" :bounce="nvueBounce" :column-count="nWaterfallColumnCount" :column-width="nWaterfallColumnWidth" |
| | | :column-gap="nWaterfallColumnGap" :left-gap="nWaterfallLeftGap" :right-gap="nWaterfallRightGap" :pagingEnabled="nvuePagingEnabled" :offset-accuracy="offsetAccuracy" |
| | | @loadmore="_nOnLoadmore" @scroll="_nOnScroll" @scrollend="_nOnScrollend"> |
| | | <refresh v-if="(zSlots.top?cacheTopHeight!==-1:true)&&finalNvueRefresherEnabled" class="zp-n-refresh" :style="[nvueRefresherStyle]" :display="nRefresherLoading?'show':'hide'" @refresh="_nOnRrefresh" @pullingdown="_nOnPullingdown"> |
| | | <view ref="zp-n-refresh-container" class="zp-n-refresh-container" :style="[{background:refresherBackground,width:nRefresherWidth}]" id="zp-n-refresh-container"> |
| | | <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" /> |
| | | <!-- 䏿巿°view --> |
| | | <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" /> |
| | | <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" /> |
| | | <slot v-else-if="(nScopedSlots?nScopedSlots:zSlots).refresher" :refresherStatus="refresherStatus" name="refresher" /> |
| | | <z-paging-refresh ref="refresh" v-else :status="refresherStatus" :defaultThemeStyle="finalRefresherThemeStyle" :isIos="isIos" |
| | | :defaultText="finalRefresherDefaultText" :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text" |
| | | :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated" |
| | | :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap" |
| | | :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" /> |
| | | </view> |
| | | </refresh> |
| | | <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> |
| | | <component :is="nViewIs" v-if="nShowRefresherReveal" ref="zp-n-list-refresher-reveal" :style="[{transform:`translateY(-${nShowRefresherRevealHeight}px)`},{background:refresherBackground}]"> |
| | | <view v-if="useRefresherStatusBarPlaceholder" class="zp-custom-refresher-status-bar-placeholder" :style="[{'height': `${statusBarHeight}px`}]" /> |
| | | <!-- 䏿巿°view --> |
| | | <slot v-if="zSlots.refresherComplete&&refresherStatus===R.Complete" name="refresherComplete" /> |
| | | <slot v-else-if="zSlots.refresherF2&&refresherStatus===R.GoF2" name="refresherF2" /> |
| | | <slot v-else-if="(nScopedSlots?nScopedSlots:$slots).refresher" :refresherStatus="R.Loading" name="refresher" /> |
| | | <z-paging-refresh ref="refresh" v-else :status="R.Loading" :defaultThemeStyle="finalRefresherThemeStyle" :isIos="isIos" |
| | | :defaultText="finalRefresherDefaultText" :pullingText="finalRefresherPullingText" :refreshingText="finalRefresherRefreshingText" :completeText="finalRefresherCompleteText" :goF2Text="finalRefresherGoF2Text" |
| | | :defaultImg="refresherDefaultImg" :pullingImg="refresherPullingImg" :refreshingImg="refresherRefreshingImg" :completeImg="refresherCompleteImg" :refreshingAnimated="refresherRefreshingAnimated" |
| | | :showUpdateTime="showRefresherUpdateTime" :updateTimeKey="refresherUpdateTimeKey" :updateTimeTextMap="finalRefresherUpdateTimeTextMap" |
| | | :imgStyle="refresherImgStyle" :titleStyle="refresherTitleStyle" :updateTimeStyle="refresherUpdateTimeStyle" :unit="unit" /> |
| | | </component> |
| | | <!-- å
ç½®å表 --> |
| | | <template v-if="finalUseInnerList"> |
| | | <component :is="nViewIs"> |
| | | <slot name="header"/> |
| | | </component> |
| | | <component :is="nViewIs" class="zp-list-cell" v-for="(item,index) in realTotalData" :key="finalCellKeyName.length?item[finalCellKeyName]:index"> |
| | | <slot name="cell" :item="item" :index="index"/> |
| | | </component> |
| | | <component :is="nViewIs"> |
| | | <slot name="footer"/> |
| | | </component> |
| | | </template> |
| | | <template v-else> |
| | | <slot /> |
| | | </template> |
| | | <!-- å
¨å±Loading --> |
| | | <component :is="nViewIs" v-if="showLoading&&zSlots.loading&&!loadingFullFixed" :class="{'z-paging-content-fixed':usePageScroll}" style="flex:1" :style="[chatRecordRotateStyle]"> |
| | | <slot name="loading" /> |
| | | </component> |
| | | <!-- 䏿å è½½æ´å¤view --> |
| | | <component :is="nViewIs" v-if="!refresherOnly&&loadingMoreEnabled&&!showEmpty"> |
| | | <!-- èå¤©è®°å½æ¨¡å¼å è½½æ´å¤loadingï¼æ»å¨å°é¡¶é¨å è½½æ´å¤ææ æ´å¤æ°æ®æ¶æ¾ç¤ºï¼ --> |
| | | <template v-if="useChatRecordMode&&realTotalData.length>=defaultPageSize&&(loadingStatus!==M.NoMore||zSlots.chatNoMore)&&realTotalData.length&&isChatRecordModeAndInversion"> |
| | | <view :style="[chatRecordRotateStyle]"> |
| | | <slot v-if="loadingStatus===M.NoMore&&zSlots.chatNoMore" name="chatNoMore" /> |
| | | <template v-else> |
| | | <slot v-if="zSlots.chatLoading" :loadingMoreStatus="loadingStatus" name="chatLoading" /> |
| | | <z-paging-load-more v-else @doClick="_onLoadingMore('click')" :zConfig="zLoadMoreConfig" /> |
| | | </template> |
| | | </view> |
| | | </template> |
| | | |
| | | <view :style="nLoadingMoreFixedHeight?{height:loadingMoreCustomStyle&&loadingMoreCustomStyle.height?loadingMoreCustomStyle.height:loadingMoreFixedHeight}:{}"> |
| | | <slot v-if="showLoadingMoreDefault" name="loadingMoreDefault" /> |
| | | <slot v-else-if="showLoadingMoreLoading" name="loadingMoreLoading" /> |
| | | <slot v-else-if="showLoadingMoreNoMore" name="loadingMoreNoMore" /> |
| | | <slot v-else-if="showLoadingMoreFail" name="loadingMoreFail" /> |
| | | <z-paging-load-more @doClick="_onLoadingMore('click')" v-else-if="showLoadingMoreCustom" :zConfig="zLoadMoreConfig" /> |
| | | <view v-if="safeAreaInsetBottom&&useSafeAreaPlaceholder&&!useChatRecordMode" class="zp-safe-area-placeholder" :style="[{height:safeAreaBottom+'px'}]" /> |
| | | </view> |
| | | </component> |
| | | <!-- ç©ºæ°æ®å¾ --> |
| | | <component :is="nViewIs" v-if="showEmpty" :class="{'z-paging-content-fixed':usePageScroll}" :style="[{flex:emptyViewCenter?1:0},emptyViewSuperStyle,chatRecordRotateStyle]"> |
| | | <view :class="{'zp-empty-view':true,'zp-empty-view-center':emptyViewCenter}"> |
| | | <slot v-if="zSlots.empty" name="empty" :isLoadFailed="isLoadFailed" /> |
| | | <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" :emptyViewFixed="emptyViewFixed" :unit="unit" |
| | | @reload="_emptyViewReload" @viewClick="_emptyViewClick" /> |
| | | </view> |
| | | </component> |
| | | <component :is="nViewIs" v-if="!hideNvueBottomTag" ref="zp-n-list-bottom-tag" class="zp-n-list-bottom-tag"></component> |
| | | </component> |
| | | <view v-if="zSlots.right" class="zp-page-right"> |
| | | <slot name="right" /> |
| | | </view> |
| | | </component> |
| | | <!-- åºé¨åºå®çslot --> |
| | | <view class="zp-page-bottom-container" :style="{'background': bottomBgColor}"> |
| | | <slot name="bottom" /> |
| | | <!-- èå¤©è®°å½æ¨¡å¼åºé¨å ä½ --> |
| | | <template v-if="useChatRecordMode&&autoAdjustPositionWhenChat"> |
| | | <view :style="[{height:chatRecordModeSafeAreaBottom+'px'}]" /> |
| | | <view class="zp-page-bottom-keyboard-placeholder-animate" :style="[{height:keyboardHeight+'px'}]" /> |
| | | </template> |
| | | </view> |
| | | <!-- ç¹å»è¿åé¡¶é¨view --> |
| | | <view v-if="showBackToTopClass" :class="finalBackToTopClass" :style="[finalBackToTopStyle]" @click.stop="_backToTopClick"> |
| | | <slot v-if="zSlots.backToTop" name="backToTop" /> |
| | | <image v-else class="zp-back-to-top-img" :class="{'zp-back-to-top-img-inversion': useChatRecordMode&&!backToTopImg.length}" :src="backToTopImg.length?backToTopImg:base64BackToTop" /> |
| | | </view> |
| | | <!-- å
¨å±Loading(éºæ»¡z-pagingå¹¶åºå®) --> |
| | | <view v-if="showLoading&&zSlots.loading&&loadingFullFixed" class="zp-loading-fixed"> |
| | | <slot name="loading" /> |
| | | </view> |
| | | </component> |
| | | <!-- #endif --> |
| | | </template> |
| | | <script module="pagingRenderjs" lang="renderjs"> |
| | | import pagingRenderjs from './wxs/z-paging-renderjs.js'; |
| | | /** |
| | | * z-paging å页ç»ä»¶ |
| | | * @description z-paging å页ç»ä»¶ï¼é«æ§è½ï¼å
¨å¹³å°å
¼å®¹ãæ¯æèªå®ä¹ä¸æå·æ°ã䏿å è½½æ´å¤ãèæå表ã䏿è¿å
¥äºæ¥¼ãèªå¨ç®¡çç©ºæ°æ®å¾ãå
¨èªå¨åé¡µãæ éªå¨è天åé¡µãæ¬å°å页çï¼ä¹æ¯æä½ä¸ºåºæ¬å¸å±å®¹å¨ä½¿ç¨ |
| | | * @tutorial https://z-paging.zxlee.cn |
| | | * @property {Array} value ç¶ç»ä»¶v-modelæç»å®çlistçå¼ï¼é»è®¤ä¸º[] |
| | | * @property {Number|String} defaultPageNo èªå®ä¹åå§çpageNoï¼é»è®¤ä¸º1 |
| | | * @property {Number|String} defaultPageSize èªå®ä¹pageSize(æ¯é¡µæ¾ç¤ºå¤å°æ¡)ï¼é»è®¤ä¸º10 |
| | | * @property {Boolean} fixed z-pagingæ¯å¦ä½¿ç¨fixedå¸å±ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} safeAreaInsetBottom æ¯å¦å¼å¯åºé¨å®å
¨åºåéé
ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} useSafeAreaPlaceholder å¼å¯åºé¨å®å
¨åºåéé
åï¼æ¯å¦ä½¿ç¨placeholderå½¢å¼å®ç°ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} usePageScroll 使ç¨é¡µé¢æ»å¨ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} autoFullHeight 使ç¨é¡µé¢æ»å¨æ¶ï¼æ¯å¦å¨ä¸æ»¡å±æ¶èªå¨å¡«å
满å±å¹ï¼é»è®¤ä¸ºtrue |
| | | * @property {String} defaultThemeStyle loading(䏿巿°ã䏿å è½½æ´å¤)ç䏻颿 ·å¼ï¼æ¯æblackï¼whiteï¼é»è®¤ä¸ºblack |
| | | * @property {Object} pagingStyle 设置z-pagingçstyleï¼é¨åå¹³å°(å¦å¾®ä¿¡å°ç¨åº)æ æ³ç´æ¥ä¿®æ¹ç»ä»¶çstyleï¼å¯ä½¿ç¨æ¤å±æ§ä»£æ¿ |
| | | * @property {String} height z-pagingçé«åº¦ï¼ä¼å
级ä½äºpagingStyleä¸è®¾ç½®çheightï¼ä¼ å符串ï¼å¦100pxã100rpxã100% |
| | | * @property {String} width z-pagingç宽度ï¼ä¼å
级ä½äºpagingStyleä¸è®¾ç½®çwidthï¼ä¼ å符串ï¼å¦100pxã100rpxã100% |
| | | * @property {String} maxWidth z-pagingçæå¤§å®½åº¦ï¼ä¼å
级ä½äºpagingStyleä¸è®¾ç½®çmax-widthï¼é»è®¤ä¸ºç©º |
| | | * @property {String} bgColor z-pagingçèæ¯è²(为cssä¸çbackgroundï¼å æ¤ä¹å¯ä»¥è®¾ç½®æ¸åï¼èæ¯å¾çç)ï¼ä¼å
级ä½äºpagingStyleä¸è®¾ç½®çbackground-color |
| | | * @property {Boolean} watchTouchDirectionChange æ¯å¦çå¬åè¡¨è§¦æ¸æ¹åæ¹åï¼é»è®¤ä¸ºfalse |
| | | * @property {Number|String} delay è°ç¨completeåå»¶è¿å¤ççæ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼ä¼å
级é«äºmin-delayï¼é»è®¤ä¸º0 |
| | | * @property {Number|String} minDelay 触å@queryåæå°å»¶è¿å¤ççæ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼ä¼å
级ä½äºdelayï¼é»è®¤ä¸º0 |
| | | * @property {Boolean} callNetworkReject 请æ±å¤±è´¥æ¯å¦è§¦årejectï¼é»è®¤ä¸ºtrue |
| | | * @property {String} unit z-pagingä¸é»è®¤å¸å±çåä½ï¼é»è®¤ä¸ºrpx |
| | | * @property {Boolean} concat èªå¨æ¼æ¥completeä¸ä¼ è¿æ¥çæ°ç»ï¼é»è®¤ä¸ºtrue |
| | | * @property {Number|String|Object} dataKey 为ä¿è¯æ°æ®ä¸è´ï¼è®¾ç½®å½åtab忢æ¶çæ è¯keyï¼å¹¶å¨completeä¸ä¼ éç¸åkeyï¼è¥äºè
ä¸ä¸è´ï¼åcompleteå°ä¸ä¼çæ |
| | | * @property {String} autowireListName ãæç®åæ³ãèªå¨æ³¨å
¥çliståï¼å¯èªå¨ä¿®æ¹ç¶view(å
å«ref="paging")ä¸å¯¹åºnameçlistå¼ |
| | | * @property {String} autowireQueryName ãæç®åæ³ãèªå¨æ³¨å
¥çqueryåï¼å¯èªå¨è°ç¨ç¶view(å
å«ref="paging")ä¸çqueryæ¹æ³ |
| | | * @property {Function} fetch ãæç®åæ³ãè·ååé¡µæ°æ®Functionï¼åè½ä¸@query类似ãè¥è®¾ç½®äºfetchå@queryå°ä¸å触å |
| | | * @property {Object} fetchParams fetchçéå åæ°ï¼fetché
ç½®åææ |
| | | * @property {Boolean} auto [z-paging]mounted忝å¦èªå¨è°ç¨reloadæ¹æ³(mountedåèªå¨è°ç¨æ¥å£)ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} autoScrollToTopWhenReload reloadæ¶èªå¨æ»å¨å°é¡¶é¨ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} autoCleanListWhenReload reloadæ¶ç«å³èªå¨æ¸
空ålistï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} showRefresherWhenReload åè¡¨å·æ°æ¶èªå¨æ¾ç¤ºä¸æå·æ°viewï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} showLoadingMoreWhenReload åè¡¨å·æ°æ¶èªå¨æ¾ç¤ºå è½½æ´å¤viewï¼ä¸ä¸ºå è½½ä¸ç¶æï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} createdReload ç»ä»¶createdæ¶ç«å³è§¦åreloadï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} refresherEnabled æ¯å¦å¼å¯ä¸æå·æ°ï¼é»è®¤ä¸ºtrue |
| | | * @property {Number|String} refresherThreshold 设置èªå®ä¹ä¸æå·æ°éå¼ï¼é»è®¤åä½ä¸ºpxï¼é»è®¤ä¸º80rpx |
| | | * @property {Boolean} useRefresherStatusBarPlaceholder æ¯å¦å¼å¯ä¸æå·æ°ç¶ææ å ä½ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} refresherOnly æ¯å¦åªä½¿ç¨ä¸æå·æ°ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} useCustomRefresher æ¯å¦ä½¿ç¨èªå®ä¹ç䏿巿°ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} reloadWhenRefresh ç¨æ·ä¸æå·æ°æ¶æ¯å¦è§¦åreloadæ¹æ³ï¼é»è®¤ä¸ºtrue |
| | | * @property {String} refresherThemeStyle 䏿巿°ç䏻颿 ·å¼ï¼æ¯æblackï¼whiteï¼é»è®¤ä¸ºblack |
| | | * @property {Object} refresherImgStyle èªå®ä¹ä¸æå·æ°ä¸å·¦ä¾§å¾æ çæ ·å¼ |
| | | * @property {Object} refresherTitleStyle èªå®ä¹ä¸æå·æ°ä¸å³ä¾§ç¶ææè¿°æåçæ ·å¼ |
| | | * @property {Object} refresherUpdateTimeStyle èªå®ä¹ä¸æå·æ°ä¸å³ä¾§æåæ´æ°æ¶é´æåçæ ·å¼ |
| | | * @property {Boolean} watchRefresherTouchmove æ¯å¦å®æ¶çå¬ä¸æå·æ°ä¸è¿åº¦ï¼å¹¶éè¿@refresherTouchmoveä¼ éç»ç¶ç»ä»¶ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} showRefresherUpdateTime æ¯å¦æ¾ç¤ºæåæ´æ°æ¶é´ï¼é»è®¤ä¸ºfalse |
| | | * @property {String|Object} refresherDefaultText èªå®ä¹ä¸æå·æ°é»è®¤ç¶æä¸çæå |
| | | * @property {String|Object} refresherPullingText èªå®ä¹ä¸æå·æ°æ¾æç«å³å·æ°ç¶æä¸çæå |
| | | * @property {String|Object} refresherRefreshingText èªå®ä¹ä¸æå·æ°å·æ°ä¸ç¶æä¸çæå |
| | | * @property {String|Object} refresherCompleteText èªå®ä¹ä¸æå·æ°å·æ°ç»æç¶æä¸çæå |
| | | * @property {String} refresherDefaultImg èªå®ä¹ä¸æå·æ°é»è®¤ç¶æä¸çå¾ç |
| | | * @property {String} refresherPullingImg èªå®ä¹ä¸æå·æ°æ¾æç«å³å·æ°ç¶æä¸çå¾ç |
| | | * @property {String} refresherRefreshingImg èªå®ä¹ä¸æå·æ°å·æ°ä¸ç¶æä¸çå¾ç |
| | | * @property {String} refresherCompleteImg èªå®ä¹ä¸æå·æ°å·æ°ç»æç¶æä¸çå¾ç |
| | | * @property {Boolean} refresherRefreshingAnimated èªå®ä¹ä¸æå·æ°å·æ°ä¸ç¶æä¸æ¯å¦å±ç¤ºæè½¬å¨ç»ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} refresherEndBounceEnabled æ¯å¦å¼å¯èªå®ä¹ä¸æå·æ°å·æ°ç»æåå¼¹å¨ç»ææï¼é»è®¤ä¸ºtrue |
| | | * @property {String} refresherDefaultStyle 设置系ç»ä¸æå·æ°é»è®¤æ ·å¼ï¼æ¯æè®¾ç½®blackï¼whiteï¼noneï¼é»è®¤ä¸ºblack |
| | | * @property {String} refresherBackground 设置èªå®ä¹ä¸æå·æ°åºåèæ¯é¢è²ï¼é»è®¤ä¸º#FFFFFF00 |
| | | * @property {String} refresherFixedBackground 设置åºå®çèªå®ä¹ä¸æå·æ°åºåèæ¯é¢è²ï¼é»è®¤ä¸º#FFFFFF00 |
| | | * @property {Number|String} refresherFixedBacHeight 设置åºå®çèªå®ä¹ä¸æå·æ°åºåé«åº¦ï¼é»è®¤ä¸º0 |
| | | * @property {Number|String} refresherDefaultDuration 设置èªå®ä¹ä¸æå·æ°é»è®¤ç¶æä¸åå¼¹å¨ç»æ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤ä¸º100 |
| | | * @property {Number|String} refresherCompleteDelay èªå®ä¹ä¸æå·æ°ç»æä»¥åå»¶è¿æ¶åçæ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤ä¸º0 |
| | | * @property {Number|String} refresherCompleteDuration èªå®ä¹ä¸æå·æ°ç»ææ¶åå¨ç»æ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤ä¸º300 |
| | | * @property {Boolean} refresherVibrate 䏿巿°æ¶ä¸æå°âæ¾æç«å³å·æ°âç¶ææ¶æ¯å¦ä½¿ææºçæ¯å¨ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} refresherRefreshingScrollable èªå®ä¹ä¸æå·æ°å·æ°ä¸ç¶ææ¯å¦å
许å表æ»å¨ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} refresherCompleteScrollable èªå®ä¹ä¸æå·æ°ç»æç¶æä¸æ¯å¦å
许å表æ»å¨ï¼é»è®¤ä¸ºfalse |
| | | * @property {Number} refresherOutRate 设置èªå®ä¹ä¸æå·æ°ä¸æè¶
åºéå¼åç»§ç»ä¸æä½ç§»è¡°åçæ¯ä¾ï¼é»è®¤ä¸º0.65 |
| | | * @property {Boolean} refresherF2Enabled æ¯å¦å¼å¯ä¸æè¿å
¥äºæ¥¼åè½ï¼é»è®¤ä¸ºfalse |
| | | * @property {Number|String} refresherF2Threshold 䏿è¿å
¥äºæ¥¼éå¼ï¼é»è®¤ä¸º200rpx |
| | | * @property {Number|String} refresherF2Duration 䏿è¿å
¥äºæ¥¼å¨ç»æ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤ä¸º200 |
| | | * @property {Boolean} showRefresherF2 䏿è¿å
¥äºæ¥¼ç¶ææ¾æåæ¯å¦å¼¹åºäºæ¥¼ï¼é»è®¤ä¸ºtrue |
| | | * @property {Number} refresherPullRate 设置èªå®ä¹ä¸æå·æ°ä¸ææ¶å®é
䏿ä½ç§»ä¸ç¨æ·ä¸æè·ç¦»çæ¯å¼ï¼é»è®¤ä¸º0.75 |
| | | * @property {Number|String} refresherFps èªå®ä¹ä¸æå·æ°ä¸æå¸§çï¼é»è®¤ä¸º40 |
| | | * @property {Number|String} refresherMaxAngle èªå®ä¹ä¸æå·æ°å
许触åçæå¤§ä¸æè§åº¦ï¼é»è®¤ä¸º40度 |
| | | * @property {Boolean} refresherAngleEnableChangeContinued èªå®ä¹ä¸æå·æ°çè§åº¦ç±æªè¾¾å°æå¤§è§åº¦åå°è¾¾å°æå¤§è§åº¦æ¶ï¼æ¯å¦ç»§ç»ä¸æå·æ°æå¿ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} refresherNoTransform 䏿巿°æ¶æ¯å¦ç¦æ¢ä¸æå·æ°viewè·éç¨æ·è§¦æ¸ç«ç´ç§»å¨ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} loadingMoreEnabled æ¯å¦å¯ç¨å è½½æ´å¤æ°æ®(嫿»å¨å°åºé¨å è½½æ´å¤æ°æ®åç¹å»å è½½æ´å¤æ°æ®)ï¼é»è®¤ä¸ºtrue |
| | | * @property {Number|String} lowerThreshold è·åºé¨/å³è¾¹å¤è¿æ¶ï¼è§¦åscrolltoloweräºä»¶ï¼é»è®¤åä½ä¸ºpxï¼é»è®¤ä¸º100rpx |
| | | * @property {Boolean} toBottomLoadingMoreEnabled æ¯å¦å¯ç¨æ»å¨å°åºé¨å è½½æ´å¤æ°æ®ï¼é»è®¤ä¸ºtrue |
| | | * @property {String} loadingMoreThemeStyle åºé¨å è½½æ´å¤ç䏻颿 ·å¼ï¼æ¯æblackï¼whiteï¼é»è®¤ä¸ºblack |
| | | * @property {Object} loadingMoreCustomStyle èªå®ä¹åºé¨å è½½æ´å¤æ ·å¼ |
| | | * @property {Object} loadingMoreTitleCustomStyle èªå®ä¹åºé¨å è½½æ´å¤æåæ ·å¼ |
| | | * @property {Object} loadingMoreLoadingIconCustomStyle èªå®ä¹åºé¨å è½½æ´å¤å è½½ä¸å¨ç»æ ·å¼ |
| | | * @property {String} loadingMoreLoadingIconType èªå®ä¹åºé¨å è½½æ´å¤å è½½ä¸å¨ç»å¾æ ç±»åï¼å¯éfloweræcircleï¼é»è®¤ä¸ºflower |
| | | * @property {String} loadingMoreLoadingIconCustomImage èªå®ä¹åºé¨å è½½æ´å¤å è½½ä¸å¨ç»å¾æ å¾ç |
| | | * @property {Boolean} loadingMoreLoadingAnimated åºé¨å è½½æ´å¤å è½½ä¸viewæ¯å¦å±ç¤ºæè½¬å¨ç»ï¼é»è®¤ä¸ºtrue |
| | | * @property {String|Object} loadingMoreDefaultText æ»å¨å°åºé¨"é»è®¤"æå |
| | | * @property {String|Object} loadingMoreLoadingText æ»å¨å°åºé¨"å è½½ä¸"æå |
| | | * @property {String|Object} loadingMoreNoMoreText æ»å¨å°åºé¨"æ²¡ææ´å¤"æå |
| | | * @property {String|Object} loadingMoreFailText æ»å¨å°åºé¨"å 载失败"æå |
| | | * @property {Boolean} hideNoMoreInside 彿²¡ææ´å¤æ°æ®ä¸å页å
容æªè¶
åºz-pagingæ¶æ¯å¦éèæ²¡ææ´å¤æ°æ®çviewï¼é»è®¤ä¸ºfalse |
| | | * @property {Number} hideNoMoreByLimit 彿²¡ææ´å¤æ°æ®ä¸å页æ°ç»é¿åº¦å°äºè¿ä¸ªå¼æ¶ï¼éèæ²¡ææ´å¤æ°æ®çviewï¼é»è®¤ä¸º0 |
| | | * @property {Boolean} insideMore å½åé¡µæªæ»¡ä¸å±æ¶ï¼æ¯å¦èªå¨å è½½æ´å¤ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} loadingMoreDefaultAsLoading æ»å¨å°åºé¨ç¶æä¸ºé»è®¤ç¶ææ¶ï¼ä»¥å è½½ä¸çç¶æå±ç¤ºï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} showLoadingMoreNoMoreView æ¯å¦æ¾ç¤ºæ²¡ææ´å¤æ°æ®çviewï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} showDefaultLoadingMoreText æ¯å¦æ¾ç¤ºé»è®¤çå è½½æ´å¤textï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} showLoadingMoreNoMoreLine æ¯å¦æ¾ç¤ºæ²¡ææ´å¤æ°æ®çåå²çº¿ï¼é»è®¤ä¸ºtrue |
| | | * @property {Object} loadingMoreNoMoreLineCustomStyle èªå®ä¹åºé¨æ²¡ææ´å¤æ°æ®çåå²çº¿æ ·å¼ |
| | | * @property {Boolean} hideEmptyView æ¯å¦å¼ºå¶éèç©ºæ°æ®å¾ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} emptyViewFixed ç©ºæ°æ®å¾çæ¯å¦éºæ»¡z-pagingï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} emptyViewCenter ç©ºæ°æ®å¾çæ¯å¦åç´å±
ä¸ï¼é»è®¤ä¸ºtrue |
| | | * @property {String|Object} emptyViewText ç©ºæ°æ®å¾æè¿°æå |
| | | * @property {String} emptyViewImg ç©ºæ°æ®å¾å¾ç |
| | | * @property {String} emptyViewErrorImg ç©ºæ°æ®å¾âå 载失败âå¾ç |
| | | * @property {String|Object} emptyViewReloadText ç©ºæ°æ®å¾ç¹å»éæ°å è½½æå |
| | | * @property {String|Object} emptyViewErrorText ç©ºæ°æ®å¾âå 载失败âæè¿°æå |
| | | * @property {Object} emptyViewSuperStyle ç©ºæ°æ®å¾ç¶viewæ ·å¼ |
| | | * @property {Object} emptyViewStyle ç©ºæ°æ®å¾æ ·å¼ |
| | | * @property {Object} emptyViewImgStyle ç©ºæ°æ®å¾imgæ ·å¼ |
| | | * @property {Object} emptyViewTitleStyle ç©ºæ°æ®å¾æè¿°æåæ ·å¼ |
| | | * @property {Object} emptyViewReloadStyle ç©ºæ°æ®å¾éæ°å è½½æé®æ ·å¼ |
| | | * @property {Boolean} showEmptyViewReload æ¯å¦æ¾ç¤ºç©ºæ°æ®å¾éæ°å è½½æé®(æ æ°æ®æ¶)ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} showEmptyViewReloadWhenError å è½½å¤±è´¥æ¶æ¯å¦æ¾ç¤ºç©ºæ°æ®å¾éæ°å è½½æé®ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} autoHideEmptyViewWhenLoading å è½½ä¸æ¶æ¯å¦èªå¨éèç©ºæ°æ®å¾ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} autoHideEmptyViewWhenPull ç¨æ·ä¸æå表触å䏿巿°å è½½ä¸æ¶æ¯å¦èªå¨éèç©ºæ°æ®å¾ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} autoHideLoadingAfterFirstLoaded ç¬¬ä¸æ¬¡å è½½åèªå¨éèloading slotï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} loadingFullFixed loading slotçç¶viewæ¯å¦éºæ»¡å±å¹å¹¶åºå®ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} autoShowSystemLoading æ¯å¦èªå¨æ¾ç¤ºç³»ç»Loadingï¼å³uni.showLoadingï¼é»è®¤ä¸ºfalse |
| | | * @property {String|Object} systemLoadingText æ¾ç¤ºç³»ç»Loadingæ¶æ¾ç¤ºçæå |
| | | * @property {Boolean} systemLoadingMask æ¾ç¤ºç³»ç»Loadingæ¶æ¯å¦æ¾ç¤ºéæèå±ï¼é²æ¢è§¦æ¸ç©¿éï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} autoShowBackToTop èªå¨æ¾ç¤ºç¹å»è¿å顶鍿é®ï¼é»è®¤ä¸ºfalse |
| | | * @property {Number|String} backToTopThreshold ç¹å»è¿å顶鍿鮿¾ç¤º/éèçéå¼(æ»å¨è·ç¦»)ï¼é»è®¤åä½ä¸ºpxï¼é»è®¤ä¸º400rpx |
| | | * @property {String} backToTopImg ç¹å»è¿å顶鍿é®çèªå®ä¹å¾çå°å |
| | | * @property {Boolean} backToTopWithAnimate ç¹å»è¿å顶鍿é®è¿åå°é¡¶é¨æ¶æ¯å¦å±ç¤ºè¿æ¸¡å¨ç»ï¼é»è®¤ä¸ºtrue |
| | | * @property {Number|String} backToTopBottom ç¹å»è¿å顶鍿é®ä¸åºé¨çè·ç¦»ï¼é»è®¤åä½ä¸ºpxï¼é»è®¤ä¸º160rpx |
| | | * @property {Object} backToTopStyle ç¹å»è¿å顶鍿é®çèªå®ä¹æ ·å¼ |
| | | * @property {Boolean} useVirtualList æ¯å¦ä½¿ç¨èæå表ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} useCompatibilityMode å¨ä½¿ç¨èæå表æ¶ï¼æ¯å¦ä½¿ç¨å
¼å®¹æ¨¡å¼ï¼é»è®¤ä¸ºfalse |
| | | * @property {Object} extraData 使ç¨å
¼å®¹æ¨¡å¼æ¶ä¼ éçéå æ°æ® |
| | | * @property {String} cellHeightMode èæå表cellé«åº¦æ¨¡å¼ï¼é»è®¤ä¸ºfixed |
| | | * @property {Number|String} preloadPage é¢å è½½çå表å¯è§èå´(å表é«åº¦)页æ°ï¼é»è®¤ä¸º12 |
| | | * @property {Number|String} fixedCellHeight åºå®çcellé«åº¦ï¼`cell-height-mode=fixed`æææï¼é»è®¤ä¸ºç©º |
| | | * @property {Number|String} virtualListCol èæåè¡¨åæ°ï¼é»è®¤ä¸º1 |
| | | * @property {Number|String} virtualScrollFps èæå表scrollåæ ·å¸§çï¼é»è®¤ä¸º80 |
| | | * @property {String} virtualCellIdPrefix èæå表cell idçåç¼ |
| | | * @property {Boolean} useInnerList æ¯å¦å¨z-pagingå
é¨å¾ªç¯æ¸²æå表(使ç¨å
ç½®å表)ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} forceCloseInnerList 强å¶å
³éinner-listï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} virtualInSwiperSlot èæå表æ¯å¦ä½¿ç¨swiper-itemå
裹ï¼é»è®¤ä¸ºfalse |
| | | * @property {String} cellKeyName å
ç½®å表cellçkeyåç§°(ä»
nvueææ) |
| | | * @property {Object} innerListStyle innerListæ ·å¼ |
| | | * @property {Object} innerCellStyle innerCellæ ·å¼ |
| | | * @property {Number|String} localPagingLoadingTime æ¬å°å页æ¶ä¸æå è½½æ´å¤å»¶è¿æ¶é´ï¼åä½ä¸ºæ¯«ç§ï¼é»è®¤ä¸º200 |
| | | * @property {Boolean} useChatRecordMode 使ç¨èå¤©è®°å½æ¨¡å¼ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} autoHideKeyboardWhenChat 使ç¨èå¤©è®°å½æ¨¡å¼æ¶æ¯å¦èªå¨éèé®çï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} autoAdjustPositionWhenChat 使ç¨èå¤©è®°å½æ¨¡å¼ä¸é®çå¼¹åºæ¶æ¯å¦èªå¨è°æ´slot="bottom"é«åº¦ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} autoToBottomWhenChat 使ç¨èå¤©è®°å½æ¨¡å¼ä¸é®çå¼¹åºæ¶æ¯å¦èªå¨æ»å¨å°åºé¨ï¼é»è®¤ä¸ºfalse |
| | | * @property {String} chatAdjustPositionOffset 使ç¨èå¤©è®°å½æ¨¡å¼ä¸é®çå¼¹åºæ¶å ä½é«åº¦åç§»è·ç¦»ï¼é»è®¤ä¸º0px |
| | | * @property {Boolean} showChatLoadingWhenReload 使ç¨èå¤©è®°å½æ¨¡å¼ä¸`reload`æ¶æ¯å¦æ¾ç¤º`chatLoading`ï¼é»è®¤ä¸ºfalse |
| | | * @property {String} bottomBgColor `bottom`çèæ¯è²ï¼é»è®¤éæ |
| | | * @property {Boolean} chatLoadingMoreDefaultAsLoading å¨èå¤©è®°å½æ¨¡å¼ä¸æ»å¨å°é¡¶é¨ç¶æä¸ºé»è®¤ç¶ææ¶ï¼æ¯å¦ä»¥å è½½ä¸çç¶æå±ç¤ºï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} showScrollbar æ§å¶æ¯å¦åºç°æ»å¨æ¡ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} scrollable æ¯å¦å¯ä»¥æ»å¨ï¼ä½¿ç¨å
ç½®scroll-viewånvueæ¶ææï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} scrollX æ¯å¦å
è®¸æ¨ªåæ»å¨ï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} scrollToTopBounceEnabled iOS设å¤ä¸æ»å¨å°é¡¶é¨æ¶æ¯å¦å
许åå¼¹ææï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} scrollToBottomBounceEnabled iOS设å¤ä¸æ»å¨å°åºé¨æ¶æ¯å¦å
许åå¼¹ææï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} scrollWithAnimation å¨è®¾ç½®æ»å¨æ¡ä½ç½®æ¶ä½¿ç¨å¨ç»è¿æ¸¡ï¼é»è®¤ä¸ºfalse |
| | | * @property {String} scrollIntoView å¼åºä¸ºæåå
ç´ idï¼idä¸è½ä»¥æ°åå¼å¤´ï¼ã设置åªä¸ªæ¹å坿»å¨ï¼åå¨åªä¸ªæ¹åæ»å¨å°è¯¥å
ç´ |
| | | * @property {Boolean} enableBackToTop iOSç¹å»é¡¶é¨ç¶ææ ãå®åå廿 颿 æ¶ï¼æ»å¨æ¡è¿åé¡¶é¨ï¼é»è®¤ä¸ºtrue |
| | | * @property {String} nvueListIs nvueä¸ä¿®æ¹å表类åï¼é»è®¤ä¸ºlist |
| | | * @property {Object} nvueWaterfallConfig waterfallé
ç½®ï¼ä»
å¨nvueä¸ä¸nvueListIs=waterfallæ¶ææ |
| | | * @property {Boolean} nvueBounce nvueæ§å¶æ¯å¦åå¼¹ææï¼iOS䏿¯æå¨æä¿®æ¹ï¼é»è®¤ä¸ºtrue |
| | | * @property {Boolean} nvueFastScroll nvueä¸éè¿ä»£ç æ»å¨å°é¡¶é¨/åºé¨æ¶ï¼æ¯å¦å å¿«å¨ç»ææï¼é»è®¤ä¸ºfalse |
| | | * @property {String} nvueListId nvueä¸listçid |
| | | * @property {Boolean} hideNvueBottomTag æ¯å¦éènvueå表åºé¨çtagViewï¼é»è®¤ä¸ºfalse |
| | | * @property {Boolean} nvuePagingEnabled 设置nvue䏿¯å¦æå页模å¼(类似ç«åswiper)æ¾ç¤ºListï¼é»è®¤ä¸ºfalse |
| | | * @property {Number} offsetAccuracy nvue䏿§å¶onscrolläºä»¶è§¦åçé¢çï¼é»è®¤ä¸ºç©º |
| | | * @property {Boolean} useCache æ¯å¦ä½¿ç¨ç¼åï¼é»è®¤ä¸ºfalse |
| | | * @property {String} cacheKey 使ç¨ç¼åæ¶ç¼åçkey |
| | | * @property {String} cacheMode ç¼å模å¼ï¼é»è®¤ä¸ºdefault |
| | | * @property {Number} topZIndex slot="top"çviewçz-indexï¼é»è®¤ä¸º99 |
| | | * @property {Number} superContentZIndex z-pagingå
容容å¨ç¶viewçz-indexï¼é»è®¤ä¸º1 |
| | | * @property {Number} contentZIndex z-pagingå
容容å¨é¨åçz-indexï¼é»è®¤ä¸º1 |
| | | * @property {Number} emptyViewZIndex ç©ºæ°æ®viewçz-indexï¼é»è®¤ä¸º9 |
| | | * @property {Boolean} autoHeight z-pagingæ¯å¦èªå¨é«åº¦ï¼é»è®¤ä¸ºfalse |
| | | * @property {Number|String} autoHeightAddition z-pagingèªå¨é«åº¦æ¶çéå é«åº¦ï¼é»è®¤ä¸º0px |
| | | * @event {Function} input ç¶ç»ä»¶v-modelæç»å®çlistç弿¹åæ¶è§¦åæ¤äºä»¶ |
| | | * @event {Function} query 䏿巿°ææ»å¨å°åºé¨æ¶ä¼èªå¨è§¦åæ¤æ¹æ³ãz-pagingå è½½æ¶ä¹ä¼è§¦å(è¥è¦ç¦æ¢ï¼è¯·è®¾ç½®:auto="false")ãpageNoåpageSizeä¼èªå¨è®¡ç®å¥½ï¼ç´æ¥ä¼ ç»æå¡å¨å³å¯ã |
| | | * @event {Function} listChange å页渲æçæ°ç»æ¹åæ¶è§¦å |
| | | * @event {Function} refresherStatusChange èªå®ä¹ä¸æå·æ°ç¶ææ¹å |
| | | * @event {Function} refresherTouchstart èªå®ä¹ä¸æå·æ°ä¸æå¼å§ |
| | | * @event {Function} refresherTouchmove èªå®ä¹ä¸æå·æ°ä¸ææå¨ä¸ |
| | | * @event {Function} refresherTouchend èªå®ä¹ä¸æå·æ°ä¸æç»æ |
| | | * @event {Function} refresherF2Change 䏿è¿å
¥äºæ¥¼ç¶ææ¹å |
| | | * @event {Function} refresh èªå®ä¹ä¸æå·æ°è¢«è§¦å |
| | | * @event {Function} restore èªå®ä¹ä¸æå·æ°è¢«å¤ä½ |
| | | * @event {Function} loadingStatusChange èªå®ä¹ä¸æå·æ°ç¶ææ¹å |
| | | * @event {Function} emptyViewReload ç¹å»äºç©ºæ°æ®å¾ä¸çéæ°å è½½æé® |
| | | * @event {Function} emptyViewClick ç¹å»äºç©ºæ°æ®å¾view |
| | | * @event {Function} isLoadFailedChange z-paging请æ±å¤±è´¥ç¶ææ¹å |
| | | * @event {Function} backToTopClick ç¹å»äºè¿åé¡¶é¨æé® |
| | | * @event {Function} virtualListChange èæå表å½å渲æçæ°ç»æ¹åæ¶è§¦å |
| | | * @event {Function} innerCellClick 使ç¨èæå表æå
ç½®å表æ¶ç¹å»äºcell |
| | | * @event {Function} virtualPlaceholderTopHeight èæå表顶é¨å ä½é«åº¦æ¹å |
| | | * @event {Function} hidedKeyboard å¨èå¤©è®°å½æ¨¡å¼ä¸ï¼è§¦æ¸å表éèäºé®ç |
| | | * @event {Function} keyboardHeightChange é®çé«åº¦æ¹å |
| | | * @event {Function} scroll z-pagingå表æ»å¨æ¶è§¦å |
| | | * @event {Function} scrollTopChange scrollTopæ¹åæ¶è§¦å |
| | | * @event {Function} scrolltolower z-pagingå
ç½®çscroll-view/list-view/waterfallæ»å¨åºé¨æ¶è§¦å |
| | | * @event {Function} scrolltoupper z-pagingå
ç½®çscroll-view/list-view/waterfallæ»å¨é¡¶é¨æ¶è§¦å |
| | | * @event {Function} scrollend z-pagingå
ç½®çlistæ»å¨ç»ææ¶è§¦å |
| | | * @event {Function} contentHeightChanged z-pagingä¸å
容é«åº¦æ¹åæ¶è§¦å |
| | | * @event {Function} touchDirectionChange çå¬åè¡¨è§¦æ¸æ¹åæ¹å |
| | | * @example <z-paging ref="paging" v-model="dataList" @query="queryList"></z-paging> |
| | | */ |
| | | export default { |
| | | name:"z-paging", |
| | | // #ifdef APP-VUE || H5 |
| | | mixins: [pagingRenderjs], |
| | | // #endif |
| | | } |
| | | </script> |
| | | |
| | | <script src="./js/z-paging-main.js" /> |
| | | <!-- #ifdef APP-VUE || MP-WEIXIN || MP-QQ || H5 --> |
| | | <script src="./wxs/z-paging-wxs.wxs" module="pagingWxs" lang="wxs"></script> |
| | | <!-- #endif --> |
| | | |
| | | |
| | | <style scoped> |
| | | @import "./css/z-paging-main.css"; |
| | | @import "./css/z-paging-static.css"; |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | export function useZebraScan() { |
| | | // pdaçç¹è²è®¾ç½®ä¸éè¦å
³é-ç¦æ¢å°æ«ææé®çé®å¼ä¼ éç»åºç¨çå¼å
³ |
| | | const mainActivity = ref(); // è¿è¡æ¶çä¸»è¦æ´»å¨activity |
| | | const intentFilter = ref(); // å®ä¾åçæå¾è¿æ»¤å¨ |
| | | const broadcastReceiver = ref(); // å¹¿ææ¥æ¶å¨ |
| | | const repeatFlag = ref<boolean>(false); |
| | | |
| | | const init = (onReceiveCallback: any) => { |
| | | console.log("åå§åzebraæ«æ"); |
| | | /* #ifdef APP-PLUS */ |
| | | // è·åactivity |
| | | mainActivity.value = plus.android.runtimeMainActivity(); |
| | | // 导å
¥ç±» |
| | | const IntentFilter = plus.android.importClass("android.content.IntentFilter"); |
| | | //å®ä¾åä¸ä¸ªæå¾è¿æ»¤å¨ |
| | | intentFilter.value = new IntentFilter(); |
| | | // addActionæ·»å å¨ä½, com.android.server.scannerservice.broadcast为设å¤é
ç½®ç广æåç§° |
| | | intentFilter.value.addAction("com.dwexample.ACTION"); |
| | | // BroadcastReceiverå¹¿ææ¥æ¶å¨æ¥å£:implements å®ç°æ¥å£ onReceiveå®ç°æ¥å£çæ¹æ³ |
| | | broadcastReceiver.value = plus.android.implements( |
| | | "io.dcloud.feature.internal.reflect.BroadcastReceiver", |
| | | { |
| | | onReceive: (context: any, intent: any) => { |
| | | plus.android.importClass(intent); |
| | | // æ«æè®¾ç½®çå¼åè
é项--æææºpdaç广æé®å¼scannerdata |
| | | const code = intent.getStringExtra("com.motorolasolutions.emdk.datawedge.data_string"); |
| | | console.log("pdaåå§æ«ææ°æ®:", code); |
| | | //é²éå¤ |
| | | if (repeatFlag.value) return; |
| | | repeatFlag.value = true; |
| | | setTimeout(() => { |
| | | repeatFlag.value = false; |
| | | }, 150); |
| | | // å°è¿éæ«ææå,è·åç»æï¼å¯ä»¥è°ç¨èªå·±çä¸å¡é»è¾ |
| | | onReceiveCallback(code); |
| | | }, |
| | | } |
| | | ); |
| | | console.log("注å广ææå"); |
| | | /* #endif */ |
| | | }; |
| | | const start = () => { |
| | | console.log("å¼å§æ«æ"); |
| | | mainActivity.value.registerReceiver(broadcastReceiver, intentFilter); |
| | | }; |
| | | const stop = () => { |
| | | console.log("åæ¢æ«æ"); |
| | | mainActivity.value.unregisterReceiver(broadcastReceiver); |
| | | }; |
| | | //æ¯å¦å¼å¯æ¿å
红å¤çº¿æ«æï¼trueå¼å¯ï¼falseå
³é |
| | | const triggerScan = () => { |
| | | console.log("è§¦åæ«æ"); |
| | | // è·åAndroidæå¾ç±» |
| | | let Intent = plus.android.importClass("android.content.Intent"); |
| | | // å®ä¾åæå¾ |
| | | let intent = new Intent(); |
| | | // å®ä¹æå¾ï¼ç±ååæä¾(æ¤å¤è®¾ç½®ä¸ºä¸å¤§çï¼ å¼å§æ«æå¹¿æcom.scan.onStartScanï¼å¯¹åºçåæ¢æ«æå¹¿æä¸ºcom.scan.onEndScan) |
| | | intent.setAction("com.symbol.datawedge.api.ACTION"); |
| | | intent.putExtra("com.symbol.datawedge.api.SOFT_SCAN_TRIGGER", "START_SCANNING"); |
| | | // 广æè¿ä¸ªæå¾ |
| | | mainActivity.value.sendBroadcast(intent); |
| | | }; |
| | | return { init, start, stop, triggerScan }; |
| | | } |
| | |
| | | "autoscan": true, |
| | | "custom": { |
| | | "^wd-(.*)": "wot-design-uni/components/wd-$1/wd-$1.vue", |
| | | "^cu-(.*)": "@/components/cu-$1/index.vue" |
| | | "^cu-(.*)": "@/components/cu-$1/index.vue", |
| | | } |
| | | }, |
| | | |
| | |
| | | url="/pages/production/twist/report/index" |
| | | text="æ¥å·¥" |
| | | /> |
| | | <wd-grid-item |
| | | <!-- <wd-grid-item |
| | | icon="chart" |
| | | text="èªæ£" |
| | | link-type="navigateTo" |
| | | url="/pages/production/twist/selfInspect/index" |
| | | /> |
| | | /> --> |
| | | <wd-grid-item |
| | | icon="tips" |
| | | link-type="navigateTo" |
| | |
| | | url="/pages/production/wire/report/wire" |
| | | text="æ¥å·¥" |
| | | /> |
| | | <wd-grid-item |
| | | <!-- <wd-grid-item |
| | | icon="chart" |
| | | text="èªæ£" |
| | | link-type="navigateTo" |
| | | url="/pages/production/wire/selfInspect/index" |
| | | /> |
| | | /> --> |
| | | <wd-grid-item |
| | | icon="tips" |
| | | link-type="navigateTo" |
| | |
| | | <view class="page"> |
| | | <CardTitle title="åä¸é¢ç¨" :hideAction="false"> |
| | | <template #action> |
| | | <wd-button type="icon" icon="scan" color="#0D867F" @click="scanCode"></wd-button> |
| | | <wd-button type="icon" icon="scan" color="#0D867F" @click="openScan"></wd-button> |
| | | </template> |
| | | </CardTitle> |
| | | <view class="list_box"> |
| | | <MonofilCard v-for="(item, index) in 4" :key="index" /> |
| | | <MonofilCard v-for="(item, index) in cardList" :key="index" /> |
| | | </view> |
| | | <scan /> |
| | | <Scan ref="scanRef" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import CardTitle from "@/components/card-title/index.vue"; |
| | | import MonofilCard from "../components/MonofilCard.vue"; |
| | | import scan from "@/components/scan/index.vue"; |
| | | import { onLoad, onUnload } from "@dcloudio/uni-app"; |
| | | import { onLoad, onUnload, onShow, onHide } from "@dcloudio/uni-app"; |
| | | import Scan from "@/components/scan/index.vue"; |
| | | // import { useZebraScan } from "@/hooks/useZebraScan"; |
| | | |
| | | // const { init, start, stop, triggerScan } = useZebraScan(); |
| | | |
| | | const scanRef = ref(); |
| | | const cardList = ref<any[]>([]); |
| | | |
| | | const BroadcastScanningToObtainData = (res: any) => { |
| | | console.log("è·å次æ°", res.code); |
| | | let barcode = res.code; |
| | | console.log("æå°æ°æ®", barcode); |
| | | const getScanCode = (code: any) => { |
| | | // let parseData = code.trim(); |
| | | console.log("èªå®ä¹æ«æçç»æåè°å½æ°:", code); |
| | | cardList.value.push({}); |
| | | }; |
| | | |
| | | const scanCode = () => { |
| | | uni.scanCode({ |
| | | onlyFromCamera: true, |
| | | success: (res) => { |
| | | console.log("æ¡ç ç±»åï¼" + res.scanType); |
| | | console.log("æ¡ç å
容ï¼" + res.result); |
| | | cardList.value.push(res.result); |
| | | }, |
| | | }); |
| | | const openScan = () => { |
| | | // uni.scanCode({ |
| | | // onlyFromCamera: true, |
| | | // success: (res) => { |
| | | // console.log("æ¡ç ç±»åï¼" + res.scanType); |
| | | // console.log("æ¡ç å
容ï¼" + res.result); |
| | | // cardList.value.push(res.result); |
| | | // }, |
| | | // }); |
| | | // triggerScan(); |
| | | scanRef.value.triggerScan(); |
| | | }; |
| | | |
| | | onLoad(() => { |
| | | // å¼å¯å¹¿æçå¬äºä»¶ |
| | | uni.$on("scan", BroadcastScanningToObtainData); |
| | | uni.$on("scan", getScanCode); |
| | | // init(getScanCode); |
| | | }); |
| | | onUnload(() => { |
| | | // å¼å¯å¹¿æçå¬äºä»¶ |
| | | uni.$off("scan", BroadcastScanningToObtainData); |
| | | uni.$off("scan", getScanCode); |
| | | // stop(); |
| | | }); |
| | | |
| | | onShow(() => { |
| | | // start(); |
| | | }); |
| | | |
| | | onHide(() => { |
| | | // stop(); |
| | | }); |
| | | </script> |
| | | |
| | |
| | | { |
| | | label: "åå®¶", |
| | | value: "æ±èçåéå¸è¯å¯¼æ°åå", |
| | | span: 14, |
| | | span: 16, |
| | | }, |
| | | ]); |
| | | |
| | |
| | | <template> |
| | | <view class="page pt-2"> |
| | | <CardTitle title="æ¥å·¥ä¿¡æ¯" :hideAction="true" @action="addReport" /> |
| | | <view class="list"> |
| | | <z-paging ref="paging" refresher-only class="list"> |
| | | <template #top> |
| | | <CardTitle title="æ¥å·¥ä¿¡æ¯" :hideAction="true" :full="false" @action="addReport" /> |
| | | </template> |
| | | <wd-card v-for="(item, index) in 6" type="rectangle" custom-class="round"> |
| | | <template #title> |
| | | <view class="flex justify-between"> |
| | |
| | | </view> |
| | | </template> |
| | | <ProductionCard :data="cardAttr" /> |
| | | <template #footer> |
| | | <wd-button size="small" plain @click="toCheck">èªæ£</wd-button> |
| | | </template> |
| | | </wd-card> |
| | | <wd-loadmore custom-class="loadmore" state="loading" /> |
| | | </view> |
| | | </z-paging> |
| | | |
| | | <wd-popup v-model="dialog.visible" position="bottom" custom-class="yl-popup"> |
| | | <view class="action px-3"> |
| | |
| | | toast.show("åæ¶"); |
| | | dialog.visible = false; |
| | | }; |
| | | |
| | | const toCheck = () => { |
| | | uni.navigateTo({ |
| | | url: "/pages/production/twist/selfInspect/index", |
| | | }); |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | |
| | | background: #f3f9f8; |
| | | |
| | | .list { |
| | | height: calc(100vh - 120px); |
| | | margin: 12px; |
| | | overflow: scroll; |
| | | |
| | | :deep() { |
| | | .round { |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import CardTitle from "@/components/card-title/index.vue"; |
| | | import ProductionCard from "../components/ProductionCard.vue"; |
| | | import ProductionCard from "../../components/ProductionCard.vue"; |
| | | import { useToast } from "wot-design-uni"; |
| | | import BackmanForm from "./form.vue"; |
| | | |
| | |
| | | |
| | | const toEdit = () => { |
| | | uni.navigateTo({ |
| | | url: "/pages/production/backman/edit", |
| | | url: "/pages/production/wire/backman/edit", |
| | | }); |
| | | }; |
| | | |
| | |
| | | <template> |
| | | <view class="page pt-2"> |
| | | <CardTitle title="æä¸é¢ç¨" :hideAction="true" @action="addReport" /> |
| | | <view class="list"> |
| | | <z-paging ref="paging" refresher-only class="list"> |
| | | <wd-card type="rectangle" custom-class="round"> |
| | | <template #title> |
| | | <view class="flex justify-between"> |
| | |
| | | </template> |
| | | <ProductionCard :data="cardAttr" color="#0D867F" /> |
| | | </wd-card> |
| | | </view> |
| | | </z-paging> |
| | | <wd-popup v-model="dialog.visible" position="bottom" custom-class="yl-popup"> |
| | | <view class="action px-3"> |
| | | <wd-button type="text" @click="cancel">åæ¶</wd-button> |
| | |
| | | import ProductionCard from "../../components/ProductionCard.vue"; |
| | | import { useToast } from "wot-design-uni"; |
| | | import ReceiveForm from "./form.vue"; |
| | | import zPaging from "@/components/z-paging/z-paging.vue"; |
| | | |
| | | const toast = useToast(); |
| | | const dialog = reactive({ |
| | |
| | | |
| | | const toEdit = () => { |
| | | uni.navigateTo({ |
| | | url: "/pages/production/receive/edit", |
| | | url: "/pages/production/wire/receive/edit", |
| | | }); |
| | | }; |
| | | |
| | |
| | | .list { |
| | | height: calc(100vh - 120px); |
| | | margin: 12px; |
| | | overflow: scroll; |
| | | |
| | | :deep() { |
| | | .round { |
| | |
| | | <template> |
| | | <view class="page pt-2"> |
| | | <CardTitle title="æ¥å·¥ä¿¡æ¯" :hideAction="true" @action="addReport" /> |
| | | <view class="list"> |
| | | <z-paging ref="paging" refresher-only class="list"> |
| | | <template #top> |
| | | <CardTitle title="æ¥å·¥ä¿¡æ¯" :hideAction="true" :full="false" @action="addReport" /> |
| | | </template> |
| | | <wd-card v-for="(item, index) in 6" type="rectangle" custom-class="round"> |
| | | <template #title> |
| | | <view class="flex justify-between"> |
| | |
| | | </view> |
| | | </template> |
| | | <ProductionCard :data="cardAttr" /> |
| | | <template #footer> |
| | | <wd-button size="small" plain @click="toCheck">èªæ£</wd-button> |
| | | </template> |
| | | </wd-card> |
| | | <wd-loadmore custom-class="loadmore" state="loading" /> |
| | | </view> |
| | | </z-paging> |
| | | |
| | | <wd-popup v-model="dialog.visible" position="bottom" custom-class="yl-popup"> |
| | | <view class="action px-3"> |
| | |
| | | import WireForm from "./wireForm.vue"; |
| | | import { useToast } from "wot-design-uni"; |
| | | import ProductionCard from "../../components/ProductionCard.vue"; |
| | | import zPaging from "@/components/z-paging/z-paging.vue"; |
| | | |
| | | const toast = useToast(); |
| | | const dialog = reactive({ |
| | |
| | | |
| | | const toEdit = () => { |
| | | uni.navigateTo({ |
| | | url: "/pages/production/report/wireEdit", |
| | | url: "/pages/production/wire/report/wireEdit", |
| | | }); |
| | | }; |
| | | |
| | |
| | | toast.show("åæ¶"); |
| | | dialog.visible = false; |
| | | }; |
| | | |
| | | const toCheck = () => { |
| | | uni.navigateTo({ |
| | | url: "/pages/production/wire/selfInspect/index", |
| | | }); |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | |
| | | background: #f3f9f8; |
| | | |
| | | .list { |
| | | height: calc(100vh - 120px); |
| | | margin: 12px; |
| | | overflow: scroll; |
| | | background: #f3f9f8; |
| | | |
| | | :deep() { |
| | | .round { |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import CardTitle from "@/components/card-title/index.vue"; |
| | | import ProductionCard from "../components/ProductionCard.vue"; |
| | | import ProductionCard from "../../components/ProductionCard.vue"; |
| | | import { useToast } from "wot-design-uni"; |
| | | import SelfInspectForm from "./form.vue"; |
| | | |
| | |
| | | |
| | | const toEdit = () => { |
| | | uni.navigateTo({ |
| | | url: "/pages/production/selfInspect/edit", |
| | | url: "/pages/production/wire/selfInspect/edit", |
| | | }); |
| | | }; |
| | | const submit = () => { |