视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
vue 实现小程序或商品秒杀倒计时
2020-11-27 21:58:53 责编:小采
文档


下面先给大家介绍下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>

用到moment的这个关于时间操作的库

下面紧接着给大家介绍小程序或者vue商品秒杀倒计时

最近做小程序商城。列表秒杀倒计时这个坑死了。还是借鉴网上大佬的方法

let goodsList = [{
 actEndTime: '2018-06-24 10:00:43'
}]
let endTimeList = [];
// 将活动的结束时间参数提成一个单独的数组,方便操作
 this.data.mydata.rush.forEach(o => {
 endTimeList.push(o.actEndTime)
})
 this.setData({
 actEndTimeList: endTimeList
});
 // 执行倒计时函数
 this.countDown();
timeFormat(param) { //小于10的格式化函数
 return param < 10 ? '0' + param : param;
 },
 countDown(it) { //倒计时函数
 // 获取当前时间,同时得到活动结束时间数组
 let newTime = new Date().getTime();
 let endTimeList = this.data.actEndTimeList;
 let countDownArr = [];
 // 对结束时间进行处理渲染到页面
 endTimeList.forEach(o => {
 let endTime = new Date(o).getTime();
 let obj = null;
 // 如果活动未结束,对时间进行处理
 if (endTime - newTime > 0) {
 let time = (endTime - newTime) / 1000;
 // 获取天、时、分、秒
 let day = parseInt(time / (60 * 60 * 24));
 let hou = parseInt(time % (60 * 60 * 24) / 3600);
 let min = parseInt(time % (60 * 60 * 24) % 3600 / 60);
 let sec = parseInt(time % (60 * 60 * 24) % 3600 % 60);
 obj = {
 day: this.timeFormat(day),
 hou: this.timeFormat(hou),
 min: this.timeFormat(min),
 sec: this.timeFormat(sec)
 }
 } else { //活动已结束,全部设置为'00'
 obj = {
 day: '00',
 hou: '00',
 min: '00',
 sec: '00'
 }
 }
 countDownArr.push(obj);
 })
 // 渲染,然后每隔一秒执行一次倒计时函数
 this.setData({
 countDownList: countDownArr
 })
 setTimeout(this.countDown, 1000);
 },
<view class='item-money-name'>
 <view class='item-money'>¥{{item.money}}</view>
 <view class="tui-countdown-content {{(countDownList[index].day && countDownList[index].hou && countDownList[index].min && countDownList[index].sec) == 0?'tibg':''}}">
 <text>剩余</text>
 <text class='tui-conutdown-box'>{{countDownList[index].day}}</text>
 <text>天</text>
 <text class='tui-conutdown-box'>{{countDownList[index].hou}}:</text>
 <text class='tui-conutdown-box'>{{countDownList[index].min}}:</text>
 <text class='tui-conutdown-box'>{{countDownList[index].sec}}</text>
 </view>
 </view>

countDownList: []

主要是将获取到的时间循环出来单独存一个数组。然后再倒计时。获取的时间和计算机的时间对比。

然后再每个商品的index下便可获取到每个倒计时了

总结

以上所述是小编给大家介绍的vue 实现倒计时秒杀的组件,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

下载本文
显示全文
专题