vue设计一个倒计时秒杀的组件详解
作者:老伴 发布时间:2024-05-09 10:41:55
标签:vue,倒计时
简介:
倒计时秒杀组件在电商网站中层出不穷 不过思路万变不离其踪,我自己根据其他资料设计了一个vue版的
核心思路:
1、时间不能是本地客户端的时间 必须是服务器的时间这里用一个settimeout代替 以为时间必须统一
2、开始时间,结束时间通过父组件传入,当服务器时间在这个开始时间和结束时间的范围内 参加活动按钮可以点击,并且参加过活动以后不能再参加,
3、在组件创建的时候 同步得到现在时间服务时间差,并且在这里边设置定时器,每秒都做判断看秒杀是否开始和结束,
4、在更新时间的函数中是否开始和结束,
5、在computed钩子中监听disable 确定按钮是否可点击
6、参加过活动在updated中停止定时器的计时,页面销毁的时候也停止计时
下边是代码
子组件
<template>
<div>
<button @click="handleClick" :disabled="disabled">
{{btnText}}
</button>
<span>{{tip}}</span>
</div>
</template>
<script>
import moment from 'moment'
export default {
name: "Spike",
props: {
startTime: {
required: true,
validator: (val) => {
return moment.isMoment(val)
}
},
endTime: {
required: true,
validator: (val) => {
return moment.isMoment(val)
}
}
},
data() {
return {
start: false,
end: false,
done: false,
tip: '',
timeGap: 0,
btnText:""
}
},
computed: {
disabled() {
//当三个异号的时候disable返回真,不可点击,
// 初始化通过this.updateState确定disable的状态
return !(this.start && !this.end && !this.done);
}
},
async created() {
const serverTime=await this.getServerTime();
this.timeGap=Date.now()-serverTime;//当前时间和服务器时间差
this.updateState();
this.timeInterval=setInterval(()=>{
this.updateState()
},1000)
},
updated(){
if(this.end||this.done){
clearInterval(this.timeInterval)
}
},
methods: {
handleClick() {
alert("提交成功");
this.done=true;
this.btnText="已参加过活动"
},
getServerTime() {
//模拟服务器时间
return new Promise((resolve, reject) => {
setTimeout(() => {
//当前时间慢10秒就是服务器时间
resolve(new Date(Date.now() -10 * 1000).getTime())//跟本地时间差
}, 0)
})
},
updateState() {
const now = moment(new Date(Date.now() - this.timeGap));//当前服务器时间
const diffStart=this.startTime.diff(now);//开始时间和服务器时间之差
const diffEnd=this.endTime.diff(now);//结束时间和服务器时间之差
if(diffStart<0){
this.start=true;
this.tip="秒杀已开始";
this.btnText="参加"
}else{
this.tip=`距离秒杀开始还剩${Math.ceil(diffStart/1000)}秒`;
this.btnText="活动未开始";
}
if(diffEnd<=0){
this.end=true;
if( !this.btnText==="已参加过活动"||this.btnText==="参加"){
this.tip="秒杀已结束";
this.btnText="活动已结束";
}
}
}
},
beforeDestroy() {
clearInterval(this.timeInterval)
}
}
</script>
<style scoped>
button[disabled]{
cursor: not-allowed;
}
</style>
父组件
<template>
<div>
<h1 style="color: red">设计一个秒杀倒计时的组件</h1>
<Spike :startTime="startTime" :endTime="endTime"></Spike>
</div>
</template>
<script>
import Spike from './Spike'
import moment from 'moment'
export default {
name: "index",
components:{
Spike
},
data(){
return{
endTime:moment(new Date(Date.now()+10*1000)),
startTime:moment(new Date(Date.now()))
}
}
}
</script>
<style scoped>
</style>
以上所述是小编给大家介绍的vue设计一个倒计时秒杀的组件详解整合网站的支持!
来源:https://www.cnblogs.com/manIteresting/p/10659660.html


猜你喜欢
- 问题:在Jupyter Notebook中使用args传递参数时出现错误:原始代码:args = parser.parse_args()us
- 官方实现golang 1.8 及以上版本提供了一个创建共享库(shared object)的新工具,称为 Plugins。目前 Plugin
- 我们先来看一个题目:<script> console.log(typeof a)//undefined var a='l
- 第一种,也是我最常用的,第一帧里加上这个比较灵活,想要自定义加入菜单,只要定义drMenu这个对象就可以了var drMenu&n
- 正三角形九九乘法表#正三角形九九乘法表for i in range(1,10): for j in range(1
- 如何做一个只搜索本网站的引擎? 用下面两个文件即可实现:searchfiles.html &l
- 本文为大家分享了PHP微信支付实例,包括PHP微信支付源码,PHP微信退款源码,php微信支付接口,供大家参考,具体内容如下1.JSapi支
- 如果你写一个 bug 管理系统,用了这个 PeriodLimit 你就可以限制每个测试人员每天只能给你提一个 bug。工作是不是就轻松很多了
- 前置从https://studygolang.com/dl下载go1.14.6.windows-amd64.msi安装即可,安装路径选择默认
- 在《多线程与同步》中介绍了多线程及存在的问题,而通过使用多进程而非线程可有效地绕过全局解释器锁。 因此,通过multiprocessing模
- 千图成像也就是用N张图片组成一张图片的效果。制作方法有很多的,最常见的如用ps、懒人图云、foto-mosaik-edda这些制作。千图成像
- python在进行字符串的拼接时,一般有两种方法,一种是使用+直接相加,另一种是使用joina = "tests"b =
- datetime64与unix时间戳互转在用pandas处理数据时,经常要处理一些时间类型数据,经常把pandas时间类型与datetime
- PDO是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么 php
- 本文实例为大家分享了Bootstrap组合上下拉框的具体代码,供大家参考,具体内容如下<html><head><
- 用最新版本(2.1.0)的pyshp解析shp文件的records时:records = sf.records()如果records里面含有
- 1. SELECT…FOR UPDATE 是什么?作用是什么?select for update 即排他锁,排他锁又称
- 本文实例讲述了Python使用re模块实现信息筛选的方法。分享给大家供大家参考,具体如下:背景平时工作中,我们经常会处理大量的元数据(Raw
- 数组是一种有序的集合,可随时添加、删除其中的元素book = ['xiao zhu pei qi','xiao ji
- 动态语句, bulk insert的from &n