| 
						 | 
						- <template>
 - 	<view class="yingbing-scroller"
 - 	:refreshState="refreshState" :change:refreshState="pulldownwxs.refreshStateWatcher"
 - 	:pulldownable="pulldownable" :change:pulldownable="pulldownwxs.pulldownableWatcher"
 - 	:pullupable="pullupable" :change:pullupable="pulldownwxs.pullupableWatcher"
 - 	@touchstart="pulldownwxs.touchstart"
 - 	@touchmove="pulldownwxs.touchmove"
 - 	@touchend="pulldownwxs.touchend"
 - 	@touchcancel="pulldownwxs.touchcancel">
 - 		<view class="yingbing-scroller-wrapper">
 - 			<view class="yingbing-scroller-refresh">
 - 				<refresh-loading size="30" :visible="pulldownStatus == 'end' ? false : Boolean(pulldownStatus)" :color="loadingColor"></refresh-loading>
 - 				<text class="yingbing-scroller-refresh-text" :style="{color: loadingColor}">{{ pulldownText }}</text>
 - 			</view>
 - 			<view class="yingbing-scroll">
 - 				<scroll-view
 - 				scroll-anchoing
 - 				class="yingbing-scroll-view"
 - 				scroll-y
 - 				:refresher-enabled="false"
 - 				:scroll-into-view="scrollIntoViewId"
 - 				:scroll-with-animation="scrollWithAnimation"
 - 				:show-scrollbar="false"
 - 				:scroll-top="scrollTop"
 - 				:lower-threshold="100"
 - 				@scroll="handleScroll" @scrolltolower="handleScrolltolower"
 - 				@scrolltoupper="handleScrolltoupper">
 - 					<view :id="'yingbing-scroll-item_' + index" v-for="(item, index) in data" :key="item.index + '_' + item.current">
 - 						<!-- #ifdef MP -->
 - 						<slot :name="'wx:' + index"></slot>
 - 						<!-- #endif -->
 - 						<!-- #ifndef MP -->
 - 						<slot :item="item" :index="index"></slot>
 - 						<!-- #endif -->
 - 					</view>
 - 					<view class="yingbing-scroller-refresh" v-if="loadmoreable" @tap="handleScrolltolower">
 - 						<refresh-loading size="30" :visible="loadmoreStatus == 'end' ? false : Boolean(loadmoreStatus)" :color="loadingColor"></refresh-loading>
 - 						<text class="yingbing-scroller-refresh-text">{{loadmoreText}}</text>
 - 					</view>
 - 				</scroll-view>
 - 			</view>
 - 			<view class="yingbing-scroller-refresh">
 - 				<refresh-loading size="30" :visible="pullupStatus == 'end' ? false : Boolean(pullupStatus)" :color="loadingColor"></refresh-loading>
 - 				<text class="yingbing-scroller-refresh-text" :style="{color: loadingColor}">{{ pullupText }}</text>
 - 			</view>
 - 		</view>
 - 	</view>
 - </template>
 - 
 - <script>
 - 	import RefreshLoading from '../loading/loading.vue'
 - 	const readyHeight = 80
 - 	export default {
 - 		options: {
 - 			addGlobalClass: true,
 - 			virtualHost: true,//将自定义节点设置成虚拟的,更加接近Vue组件的表现。我们不希望自定义组件的这个节点本身可以设置样式、响应 flex 布局等,而是希望自定义组件内部的第一层节点能够响应 flex 布局或者样式由自定义组件本身完全决定
 - 		},
 - 		components: {
 - 			RefreshLoading
 - 		},
 - 		inject: ['getPrevChapterDefaultText', 'getNextChapterDefaultText', 'getChapterReadyText', 'getChapterLoadingText', 'getChapterSuccessText', 'getChapterFailText', 'getPrevChapterEndText', 'getNextChapterEndText'],
 - 		props: {
 - 			data: {
 - 				type: Array,
 - 				default () {
 - 					return new Array
 - 				}
 - 			},
 - 			loadingColor: {
 - 				type: String,
 - 				default: '#333'
 - 			},
 - 			autoplay: {
 - 				type: Boolean,
 - 				default: false
 - 			},
 - 			pulldownable: {
 - 				type: Boolean,
 - 				default: false
 - 			},
 - 			pullupable: {
 - 				type: Boolean,
 - 				default: false
 - 			},
 - 			loadmoreable: {
 - 				type: Boolean,
 - 				default: false
 - 			}
 - 		},
 - 		computed: {
 - 			chapterReadyText () {
 - 				return this.getChapterReadyText()
 - 			},
 - 			chapterLoadingText () {
 - 				return this.getChapterLoadingText()
 - 			},
 - 			chapterSuccessText () {
 - 				return this.getChapterSuccessText()
 - 			},
 - 			chapterFailText () {
 - 				return this.getChapterFailText()
 - 			},
 - 			prevChapterDefaultText () {
 - 				return this.getPrevChapterDefaultText()
 - 			},
 - 			prevChapterEndText() {
 - 				return this.getPrevChapterEndText()
 - 			},
 - 			nextChapterDefaultText() {
 - 				return this.getNextChapterDefaultText()
 - 			},
 - 			nextChapterEndText() {
 - 				return this.getNextChapterEndText()
 - 			},
 - 			pulldownText () {
 - 				return this.pulldownStatus == 'ready' ? this.chapterReadyText : this.pulldownStatus == 'success' ? this.chapterSuccessText : this.pulldownStatus == 'fail' ? this.chapterFailText :  this.pulldownStatus == 'end' ? this.prevChapterEndText : this.prevChapterDefaultText
 - 			},
 - 			pullupText () {
 - 				return this.pullupStatus == 'ready' ? this.chapterReadyText : this.pullupStatus == 'success' ? this.chapterSuccessText : this.pullupStatus == 'fail' ? this.chapterFailText :  this.pullupStatus == 'end' ? this.nextChapterEndText : this.nextChapterDefaultText
 - 			},
 - 			loadmoreText () {
 - 				return this.loadmoreStatus == 'ready' ? this.chapterLoadingText : this.loadmoreStatus == 'success' ? this.chapterSuccessText : this.loadmoreStatus == 'fail' ? this.chapterFailText :  this.loadmoreStatus == 'end' ? this.nextChapterEndText : this.nextChapterDefaultText
 - 			}
 - 		},
 - 		data () {
 - 			return {
 - 				refreshState: '',
 - 				pulldownStatus: '',
 - 				pullupStatus: '',
 - 				loadmoreStatus: '',
 - 				isLoadmore: false,
 - 				scrollIntoViewId: '',
 - 				scrollWithAnimation: false,
 - 				scrollTop: 0,
 - 				scrollTopRecord: 0
 - 			}
 - 		},
 - 		created() {
 - 			this.startAutoplay()
 - 		},
 - 		beforeDestroy() {
 - 			this.stopAutoplay()
 - 		},
 - 		methods: {
 - 			handleScroll (e) {
 - 				this.scrollTopRecord = e.detail.scrollTop
 - 				this.$emit('scroll', e)
 - 			},
 - 			handleScrolltolower (e) {
 - 				if ( !this.loadmoreable || this.isLoadmore || this.loadmoreStatus == 'end' ) return
 - 				this.isLoadmore = true
 - 				this.loadmoreStatus = 'ready'
 - 				this.$emit('loadmore', (state) => {
 - 					this.loadmoreStatus = state
 - 					this.isLoadmore = false
 - 				})
 - 			},
 - 			handleScrolltoupper (e) {
 - 				this.$emit('scrolltoupper', e)
 - 			},
 - 			pulldown () {
 - 				if ( this.pulldownStatus == 'end' ) {
 - 					this.stopRefresh()
 - 					return
 - 				}
 - 				this.$emit('pulldown', (state) => {
 - 					this.pulldownStatus = state
 - 					this.stopRefresh()
 - 				})
 - 			},
 - 			pullup () {
 - 				if ( this.pullupStatus == 'end' ) {
 - 					this.stopRefresh()
 - 					return
 - 				}
 - 				this.$emit('pullup', (state) => {
 - 					this.pullupStatus = state
 - 					this.stopRefresh()
 - 				})
 - 			},
 - 			startPulldown () {
 - 				this.pulldownStatus = 'ready'
 - 				this.refreshState = ''
 - 				this.$nextTick(function () {
 - 					this.refreshState = 'pulldown'
 - 				})
 - 			},
 - 			startPullup () {
 - 				this.pullupStatus = 'ready'
 - 				this.refreshState = ''
 - 				this.$nextTick(function () {
 - 					this.refreshState = 'pullup'
 - 				})
 - 			},
 - 			stopRefresh () {
 - 				this.refreshState = ''
 - 				this.$nextTick(function () {
 - 					this.refreshState = 'stop'
 - 				})
 - 			},
 - 			resetRefresh () {
 - 				this.pulldownStatus = ''
 - 				this.pullupStatus = ''
 - 				this.refreshState = ''
 - 				this.loadmoreState = ''
 - 				this.isLoadmore = false
 - 			},
 - 			scrollToIndex (index, animated = false) {
 - 				this.stopAutoplay()
 - 				this.scrollIntoViewId = ''
 - 				this.scrollWithAnimation = animated
 - 				this.$nextTick(function () {
 - 					this.scrollIntoViewId = 'yingbing-scroll-item_' + index
 - 					this.$nextTick(function () {
 - 						this.scrollWithAnimation = false
 - 						setTimeout(() => {
 - 							this.startAutoplay()
 - 						}, 400)
 - 					})
 - 				})
 - 			},
 - 			getItemRect (index) {
 - 				return new Promise(resolve => {
 - 					uni.createSelectorQuery().in(this).select('#yingbing-scroll-item_' + index).boundingClientRect(data => {
 - 						resolve(data)
 - 					}).exec();
 - 				})
 - 			},
 - 			pullingdown (threshold) {
 - 				if ( this.pulldownStatus != 'end' ) {
 - 					// #ifndef APP-NVUE
 - 					if ( threshold >= readyHeight ) {
 - 						this.pulldownStatus = 'ready'
 - 					} else {
 - 						this.pulldownStatus = 'pull'
 - 					}
 - 					// #endif
 - 					// #ifdef APP-NVUE
 - 					if ( threshold >= 195 ) {
 - 						this.pulldownStatus = 'ready'
 - 					} else {
 - 						this.pulldownStatus = 'pull'
 - 					}
 - 					// #endif
 - 				}
 - 			},
 - 			pullingup (threshold) {
 - 				if ( this.pullupStatus != 'end' ) {
 - 					// #ifndef APP-NVUE
 - 					if ( threshold >= readyHeight ) {
 - 						this.pullupStatus = 'ready'
 - 					} else {
 - 						this.pullupStatus = 'pull'
 - 					}
 - 					// #endif
 - 					// #ifdef APP-NVUE
 - 					if ( threshold >= 195 ) {
 - 						this.pullupStatus = 'ready'
 - 					} else {
 - 						this.pullupStatus = 'pull'
 - 					}
 - 					// #endif
 - 				}
 - 			},
 - 			setScrollTop (top) {
 - 				this.scrollTop = top
 - 				this.scrollTopRecord = top
 - 			},
 - 			startAutoplay () {
 - 				this.stopAutoplay()
 - 				this.scrollTop = this.scrollTopRecord
 - 				if ( this.autoplay && this.data.length > 0 ) {
 - 					this.autoplayTimer = setInterval(() => {
 - 						if ( this.scrollTop - this.scrollTopRecord > 2 ) this.scrollTop = this.scrollTopRecord//如果scrollTop比滚动距离大2像素,说明发生过等待章节加载,需要重新赋值scrollTop真实的滚动距离
 - 						this.scrollTop += 1
 - 					}, 20)
 - 				}
 - 			},
 - 			stopAutoplay () {
 - 				if ( this.autoplayTimer ) {
 - 					clearInterval(this.autoplayTimer)
 - 					this.autoplayTimer = null
 - 				}
 - 			}
 - 		},
 - 		watch: {
 - 			autoplay () {
 - 				this.startAutoplay()
 - 			}
 - 		}
 - 	}
 - </script>
 - <!-- #ifdef APP-VUE || H5 || MP-WEIXIN || MP-QQ -->
 - <script module="pulldownwxs" lang="wxs" src="./pulldown.wxs"></script>
 - <!-- #endif -->
 - 
 - <style scoped>
 - 	/* #ifdef APP-VUE || H5 */
 - 	/deep/ .yingbing-scroll-view .uni-scroll-view::-webkit-scrollbar {
 - 		display: none;
 - 		width: 0 !important;
 - 		height: 0 !important;
 - 		-webkit-appearance: none;
 - 		background: transparent;
 - 	}
 - 	/* #endif */
 - 	/* #ifdef MP */
 - 	/deep/ ::-webkit-scrollbar {
 - 		display: none;
 - 		width: 0 !important;
 - 		height: 0 !important;
 - 		-webkit-appearance: none;
 - 		background: transparent;
 - 	}
 - 	/* #endif */
 - 	.yingbing-scroller {
 - 		/* #ifndef APP-NVUE */
 - 		height: 100%;
 - 		/* #endif */
 - 		/* #ifdef APP-NVUE */
 - 		flex: 1;
 - 		/* #endif */
 - 		position: relative;
 - 		overflow: hidden;
 - 	}
 - 	.yingbing-scroller-wrapper {
 - 		height: calc(100% + 160px);
 - 		position: absolute;
 - 		top: -80px;
 - 		left: 0;
 - 		right: 0;
 - 		display: flex;
 - 		flex-direction: column;
 - 	}
 - 	.yingbing-scroller-refresh {
 - 		height: 80px;
 - 		padding: 20px 0;
 - 		box-sizing: border-box;
 - 		display: flex;
 - 		align-items: center;
 - 		justify-content: center;
 - 	}
 - 	.yingbing-scroller-refresh-text {
 - 		font-size: 13px;
 - 		margin-left: 10px;
 - 	}
 - 	.yingbing-scroll {
 - 		flex: 1;
 - 		position: relative;
 - 	}
 - 	.yingbing-scroll-view {
 - 		position: absolute;
 - 		top: 0;
 - 		left: 0;
 - 		right: 0;
 - 		bottom: 0;
 - 	}
 - </style>
 
 
  |