| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | 
							- <template>
 
- 	<view class="uni-countdown">
 
- 		<text v-if="showDay" :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ d }}</text>
 
- 		<text v-if="showDay" :style="{ color: splitorColor }" class="uni-countdown__splitor">天</text>
 
- 		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ h }}</text>
 
- 		<text :style="{ color: splitorColor }" class="uni-countdown__splitor">时</text>
 
- 		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ i }}</text>
 
- 		<text :style="{ color: splitorColor }" class="uni-countdown__splitor">分</text>
 
- 		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ s }}</text>
 
- 		<text :style="{ color: splitorColor }" class="uni-countdown__splitor">秒</text>
 
- 	</view>
 
- </template>
 
- <script>
 
- 	/**
 
- 	 * Countdown 倒计时
 
- 	 * @description 倒计时组件
 
- 	 * @tutorial https://ext.dcloud.net.cn/plugin?id=25
 
- 	 * @property {String} backgroundColor 背景色
 
- 	 * @property {String} color 文字颜色
 
- 	 * @property {Number} day 天数
 
- 	 * @property {Number} hour 小时
 
- 	 * @property {Number} minute 分钟
 
- 	 * @property {Number} second 秒
 
- 	 * @property {Number} timestamp 时间戳
 
- 	 * @property {Boolean} showDay = [true|false] 是否显示天数
 
- 	 * @property {Boolean} showColon = [true|false] 是否以冒号为分隔符
 
- 	 * @property {String} splitorColor 分割符号颜色
 
- 	 * @event {Function} timeup 倒计时时间到触发事件
 
- 	 * @example <uni-countdown :day="1" :hour="1" :minute="12" :second="40"></uni-countdown>
 
- 	 */
 
- 	export default {
 
- 		name: 'UniCountdown',
 
- 		props: {
 
- 			showDay: {
 
- 				type: Boolean,
 
- 				default: true
 
- 			},
 
- 			showColon: {
 
- 				type: Boolean,
 
- 				default: true
 
- 			},
 
- 			backgroundColor: {
 
- 				type: String,
 
- 				default: '#FFFFFF'
 
- 			},
 
- 			borderColor: {
 
- 				type: String,
 
- 				default: '#000000'
 
- 			},
 
- 			color: {
 
- 				type: String,
 
- 				default: '#000000'
 
- 			},
 
- 			splitorColor: {
 
- 				type: String,
 
- 				default: '#000000'
 
- 			},
 
- 			day: {
 
- 				type: Number,
 
- 				default: 0
 
- 			},
 
- 			hour: {
 
- 				type: Number,
 
- 				default: 0
 
- 			},
 
- 			minute: {
 
- 				type: Number,
 
- 				default: 0
 
- 			},
 
- 			second: {
 
- 				type: Number,
 
- 				default: 0
 
- 			},
 
- 			timestamp: {
 
- 				type: Number,
 
- 				default: 0
 
- 			}
 
- 		},
 
- 		data() {
 
- 			return {
 
- 				timer: null,
 
- 				syncFlag: false,
 
- 				d: '00',
 
- 				h: '00',
 
- 				i: '00',
 
- 				s: '00',
 
- 				leftTime: 0,
 
- 				seconds: 0
 
- 			}
 
- 		},
 
- 		watch: {
 
- 			day(val) {
 
- 				this.changeFlag()
 
- 			},
 
- 			hour(val) {
 
- 				this.changeFlag()
 
- 			},
 
- 			minute(val) {
 
- 				this.changeFlag()
 
- 			},
 
- 			second(val) {
 
- 				this.changeFlag()
 
- 			}
 
- 		},
 
- 		created: function(e) {
 
- 			this.startData();
 
- 		},
 
- 		beforeDestroy() {
 
- 			clearInterval(this.timer)
 
- 		},
 
- 		methods: {
 
- 			toSeconds(timestamp, day, hours, minutes, seconds) {
 
- 				if (timestamp) {
 
- 					return timestamp - parseInt(new Date().getTime() / 1000, 10)
 
- 				}
 
- 				return day * 60 * 60 * 24 + hours * 60 * 60 + minutes * 60 + seconds
 
- 			},
 
- 			timeUp() {
 
- 				clearInterval(this.timer)
 
- 				this.$emit('timeup')
 
- 			},
 
- 			countDown() {
 
- 				let seconds = this.seconds
 
- 				let [day, hour, minute, second] = [0, 0, 0, 0]
 
- 				if (seconds > 0) {
 
- 					day = Math.floor(seconds / (60 * 60 * 24))
 
- 					hour = Math.floor(seconds / (60 * 60)) - (day * 24)
 
- 					minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60)
 
- 					second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)
 
- 				} else {
 
- 					this.timeUp()
 
- 				}
 
- 				if (day < 10) {
 
- 					day = '0' + day
 
- 				}
 
- 				if (hour < 10) {
 
- 					hour = '0' + hour
 
- 				}
 
- 				if (minute < 10) {
 
- 					minute = '0' + minute
 
- 				}
 
- 				if (second < 10) {
 
- 					second = '0' + second
 
- 				}
 
- 				this.d = day
 
- 				this.h = hour
 
- 				this.i = minute
 
- 				this.s = second
 
- 			},
 
- 			startData() {
 
- 				this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
 
- 				if (this.seconds <= 0) {
 
- 					return
 
- 				}
 
- 				this.countDown()
 
- 				this.timer = setInterval(() => {
 
- 					this.seconds--
 
- 					if (this.seconds < 0) {
 
- 						this.timeUp()
 
- 						return
 
- 					}
 
- 					this.countDown()
 
- 				}, 1000)
 
- 			},
 
- 			changeFlag() {
 
- 				if (!this.syncFlag) {
 
- 					this.seconds = this.toSeconds(this.timestamp, this.day, this.hour, this.minute, this.second)
 
- 					this.startData();
 
- 					this.syncFlag = true;
 
- 				}
 
- 			}
 
- 		}
 
- 	}
 
- </script>
 
- <style scoped>
 
- 	.uni-countdown {
 
- 		/* #ifndef APP-NVUE */
 
- 		display: flex;
 
- 		/* #endif */
 
- 		flex-direction: row;
 
- 		justify-content: flex-start;
 
- 		align-items: center;
 
- 	}
 
- 	.uni-countdown__splitor {
 
- 		/* #ifndef APP-NVUE */
 
- 		display: flex;
 
- 		/* #endif */
 
- 		justify-content: center;
 
- 		line-height: 18rpx;
 
- 		padding: 5rpx 0;
 
- 		font-size: 30rpx;
 
- 		margin: 0rpx 10rpx;
 
- 	}
 
- 	.uni-countdown__number {
 
- 		/* #ifndef APP-NVUE */
 
- 		display: flex;
 
- 		/* #endif */
 
- 		font-size: 30rpx;
 
- 		/* background: #FFFFFF; */
 
- 		border-radius: 12rpx;
 
- 		padding: 10rpx 14rpx;
 
- 	}
 
- </style>
 
 
  |