vue设计一个倒计时秒杀的组件详解
作者:老伴 时间:2024-05-09 10:41:55
简介:
倒计时秒杀组件在电商网站中层出不穷 不过思路万变不离其踪,我自己根据其他资料设计了一个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
标签:vue,倒计时
0
投稿
猜你喜欢
Python初识逻辑与if语句及用法大全
2023-11-21 16:17:24
golang API请求队列的实现
2024-03-11 16:39:50
基于Vue实现简单的贪食蛇游戏
2024-04-27 16:13:17
小型Drupal数据库备份以及大型站点MySQL备份策略分享
2024-01-28 05:32:50
pytest conftest.py文件的使用讲解
2023-10-16 14:22:44
Golang 内存模型The Go Memory Model
2024-05-25 15:16:50
python自动截取需要区域,进行图像识别的方法
2021-05-14 11:04:42
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2022-06-22 11:43:34
Python redis操作实例分析【连接、管道、发布和订阅等】
2022-07-18 17:56:40
python将txt文件读入为np.array的方法
2023-07-23 08:10:29
用Python中的字典来处理索引统计的方法
2022-05-28 19:43:45
nestjs实现图形校验和单点登录的示例代码
2024-04-16 09:49:08
Python关于OS文件目录处理的实例分享
2022-12-29 08:52:07
详解Python Flask框架的安装及应用
2022-06-20 11:12:50
解决django接口无法通过ip进行访问的问题
2023-09-15 14:07:27
基于Python实现自制拼图小游戏
2021-12-01 03:25:01
sqlserver 使用SSMS运行sql脚本的六种方法
2024-01-15 14:51:11
PyCharm 光标变成黑块的解决方式
2023-11-12 11:02:48
PHP引用(&)各种使用方法实例详解
2023-11-01 18:12:43
python访问sqlserver示例
2022-07-15 07:25:01