204 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			204 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <template> | |||
|  | 	<view class="u-load-more-wrap" :style="{ | |||
|  | 		backgroundColor: bgColor, | |||
|  | 		marginBottom: marginBottom + 'rpx', | |||
|  | 		marginTop: marginTop + 'rpx', | |||
|  | 		height: $u.addUnit(height) | |||
|  | 	}"> | |||
|  | 		<u-line color="#d4d4d4" length="50"></u-line> | |||
|  | 		<!-- 加载中和没有更多的状态才显示两边的横线 --> | |||
|  | 		<view :class="status == 'loadmore' || status == 'nomore' ? 'u-more' : ''" class="u-load-more-inner"> | |||
|  | 			<view class="u-loadmore-icon-wrap"> | |||
|  | 				<u-loading class="u-loadmore-icon" :color="iconColor" :mode="iconType == 'circle' ? 'circle' : 'flower'" :show="status == 'loading' && icon"></u-loading> | |||
|  | 			</view> | |||
|  | 			<!-- 如果没有更多的状态下,显示内容为dot(粗点),加载特定样式 --> | |||
|  | 			<view class="u-line-1" :style="[loadTextStyle]" :class="[(status == 'nomore' && isDot == true) ? 'u-dot-text' : 'u-more-text']" @tap="loadMore"> | |||
|  | 				{{ showText }} | |||
|  | 			</view> | |||
|  | 		</view> | |||
|  | 		<u-line color="#d4d4d4" length="50"></u-line> | |||
|  | 	</view> | |||
|  | </template> | |||
|  | 
 | |||
|  | <script> | |||
|  | 	/** | |||
|  | 	 * loadmore 加载更多 | |||
|  | 	 * @description 此组件一般用于标识页面底部加载数据时的状态。 | |||
|  | 	 * @tutorial https://www.uviewui.com/components/loadMore.html
 | |||
|  | 	 * @property {String} status 组件状态(默认loadmore) | |||
|  | 	 * @property {String} bg-color 组件背景颜色,在页面是非白色时会用到(默认#ffffff) | |||
|  | 	 * @property {Boolean} icon 加载中时是否显示图标(默认true) | |||
|  | 	 * @property {String} icon-type 加载中时的图标类型(默认circle) | |||
|  | 	 * @property {String} icon-color icon-type为circle时有效,加载中的动画图标的颜色(默认#b7b7b7) | |||
|  | 	 * @property {Boolean} is-dot status为nomore时,内容显示为一个"●"(默认false) | |||
|  | 	 * @property {String} color 字体颜色(默认#606266) | |||
|  | 	 * @property {String Number} margin-top 到上一个相邻元素的距离 | |||
|  | 	 * @property {String Number} margin-bottom 到下一个相邻元素的距离 | |||
|  | 	 * @property {Object} load-text 自定义显示的文字,见上方说明示例 | |||
|  | 	 * @event {Function} loadmore status为loadmore时,点击组件会发出此事件 | |||
|  | 	 * @example <u-loadmore :status="status" icon-type="iconType" load-text="loadText" /> | |||
|  | 	 */ | |||
|  | 	export default { | |||
|  | 		name: "u-loadmore", | |||
|  | 		props: { | |||
|  | 			// 组件背景色
 | |||
|  | 			bgColor: { | |||
|  | 				type: String, | |||
|  | 				default: 'transparent' | |||
|  | 			}, | |||
|  | 			// 是否显示加载中的图标
 | |||
|  | 			icon: { | |||
|  | 				type: Boolean, | |||
|  | 				default: true | |||
|  | 			}, | |||
|  | 			// 字体大小
 | |||
|  | 			fontSize: { | |||
|  | 				type: String, | |||
|  | 				default: '28' | |||
|  | 			}, | |||
|  | 			// 字体颜色
 | |||
|  | 			color: { | |||
|  | 				type: String,  | |||
|  | 				default: '#606266' | |||
|  | 			}, | |||
|  | 			// 组件状态,loadmore-加载前的状态,loading-加载中的状态,nomore-没有更多的状态
 | |||
|  | 			status: { | |||
|  | 				type: String, | |||
|  | 				default: 'loadmore' | |||
|  | 			}, | |||
|  | 			// 加载中状态的图标,flower-花朵状图标,circle-圆圈状图标
 | |||
|  | 			iconType: { | |||
|  | 				type: String, | |||
|  | 				default: 'circle' | |||
|  | 			}, | |||
|  | 			// 显示的文字
 | |||
|  | 			loadText: { | |||
|  | 				type: Object, | |||
|  | 				default () { | |||
|  | 					return { | |||
|  | 						loadmore: '加载更多', | |||
|  | 						loading: '正在加载...', | |||
|  | 						nomore: '没有更多了' | |||
|  | 					} | |||
|  | 				} | |||
|  | 			}, | |||
|  | 			// 在“没有更多”状态下,是否显示粗点
 | |||
|  | 			isDot: { | |||
|  | 				type: Boolean, | |||
|  | 				default: false | |||
|  | 			}, | |||
|  | 			// 加载中显示圆圈动画时,动画的颜色
 | |||
|  | 			iconColor: { | |||
|  | 				type: String, | |||
|  | 				default: '#b7b7b7' | |||
|  | 			}, | |||
|  | 			// 上边距
 | |||
|  | 			marginTop: { | |||
|  | 				type: [String, Number], | |||
|  | 				default: 0 | |||
|  | 			}, | |||
|  | 			// 下边距
 | |||
|  | 			marginBottom: { | |||
|  | 				type: [String, Number], | |||
|  | 				default: 0 | |||
|  | 			}, | |||
|  | 			// 高度,单位rpx
 | |||
|  | 			height: { | |||
|  | 				type: [String, Number], | |||
|  | 				default: 'auto' | |||
|  | 			} | |||
|  | 		}, | |||
|  | 		data() { | |||
|  | 			return { | |||
|  | 				// 粗点
 | |||
|  | 				dotText: "●" | |||
|  | 			} | |||
|  | 		}, | |||
|  | 		computed: { | |||
|  | 			// 加载的文字显示的样式
 | |||
|  | 			loadTextStyle() { | |||
|  | 				return { | |||
|  | 					color: this.color, | |||
|  | 					fontSize: this.fontSize + 'rpx', | |||
|  | 					position: 'relative', | |||
|  | 					zIndex: 1, | |||
|  | 					backgroundColor: this.bgColor, | |||
|  | 					// 如果是加载中状态,动画和文字需要距离近一点
 | |||
|  | 				} | |||
|  | 			}, | |||
|  | 			// 加载中圆圈动画的样式
 | |||
|  | 			cricleStyle() { | |||
|  | 				return { | |||
|  | 					borderColor: `#e5e5e5 #e5e5e5 #e5e5e5 ${this.circleColor}` | |||
|  | 				} | |||
|  | 			}, | |||
|  | 			// 加载中花朵动画形式
 | |||
|  | 			// 动画由base64图片生成,暂不支持修改
 | |||
|  | 			flowerStyle() { | |||
|  | 				return { | |||
|  | 				} | |||
|  | 			}, | |||
|  | 			// 显示的提示文字
 | |||
|  | 			showText() { | |||
|  | 				let text = ''; | |||
|  | 				if(this.status == 'loadmore') text = this.loadText.loadmore; | |||
|  | 				else if(this.status == 'loading') text = this.loadText.loading; | |||
|  | 				else if(this.status == 'nomore' && this.isDot) text = this.dotText; | |||
|  | 				else text = this.loadText.nomore; | |||
|  | 				return text; | |||
|  | 			} | |||
|  | 		}, | |||
|  | 		methods: { | |||
|  | 			loadMore() { | |||
|  | 				// 只有在“加载更多”的状态下才发送点击事件,内容不满一屏时无法触发底部上拉事件,所以需要点击来触发
 | |||
|  | 				if(this.status == 'loadmore') this.$emit('loadmore'); | |||
|  | 			} | |||
|  | 		} | |||
|  | 	} | |||
|  | </script> | |||
|  | 
 | |||
|  | <style scoped lang="scss"> | |||
|  | 	@import "../../libs/css/style.components.scss"; | |||
|  | 	 | |||
|  | 	/* #ifdef MP */ | |||
|  | 	// 在mp.scss中,赋予了u-line为flex: 1,这里需要一个明确的长度,所以重置掉它
 | |||
|  | 	// 在组件内部,把组件名(u-line)当做选择器,在微信开发工具会提示不合法,但不影响使用
 | |||
|  | 	u-line { | |||
|  | 		flex: none; | |||
|  | 	} | |||
|  | 	/* #endif */ | |||
|  | 	 | |||
|  | 	.u-load-more-wrap { | |||
|  | 		@include vue-flex; | |||
|  | 		justify-content: center; | |||
|  | 		align-items: center; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	.u-load-more-inner { | |||
|  | 		@include vue-flex; | |||
|  | 		justify-content: center; | |||
|  | 		align-items: center; | |||
|  | 		padding: 0 12rpx; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	.u-more { | |||
|  | 		position: relative; | |||
|  | 		@include vue-flex; | |||
|  | 		justify-content: center; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	.u-dot-text { | |||
|  | 		font-size: 28rpx; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	.u-loadmore-icon-wrap { | |||
|  | 		margin-right: 8rpx; | |||
|  | 	} | |||
|  | 	 | |||
|  | 	.u-loadmore-icon { | |||
|  | 		@include vue-flex; | |||
|  | 		align-items: center; | |||
|  | 		justify-content: center; | |||
|  | 	} | |||
|  | </style> |