vue 实现小程序或商品秒杀倒计时


Posted in Javascript onApril 14, 2019

下面先给大家介绍下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 实现倒计时秒杀的组件,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
JS继承 笔记
Jul 13 Javascript
js中运算符&amp;&amp; 和 || 的使用记录
Aug 21 Javascript
jquery使用ul模拟select实现表单美化的方法
Aug 18 Javascript
JS实现一个简单的日历
Feb 22 Javascript
js随机生成一个验证码
Jun 01 Javascript
vue项目中使用axios上传图片等文件操作
Nov 02 Javascript
vue中路由参数传递可能会遇到的坑
Dec 07 Javascript
webpack多入口多出口的实现方法
Aug 17 Javascript
jQuery.validate.js表单验证插件的使用代码详解
Oct 22 jQuery
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
Jan 29 Javascript
详解vue中使用protobuf踩坑记
May 07 Javascript
vue项目前端知识点整理【收藏】
May 13 Javascript
js中async函数结合promise的小案例浅析
Apr 14 #Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
Apr 14 #Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
Apr 13 #Javascript
JS+CSS3实现的简易钟表效果示例
Apr 13 #Javascript
JS实现倒序输出的几种常用方法示例
Apr 13 #Javascript
JS实现马赛克图片效果完整示例
Apr 13 #Javascript
ES6入门教程之let、const的使用方法
Apr 13 #Javascript
You might like
PHP下几种删除目录的方法总结
2007/08/19 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
yii操作cookie实例简介
2014/07/09 PHP
php上传文件并显示上传进度的方法
2015/03/24 PHP
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
AngualrJS中的Directive制作一个菜单
2016/01/26 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
vue开发移动端底部导航条功能
2020/04/08 Javascript
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
简单介绍Python中的JSON使用
2015/04/28 Python
简单理解Python中的装饰器
2015/07/31 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
Python连接字符串过程详解
2020/01/06 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
解决Opencv+Python cv2.imshow闪退问题
2020/04/24 Python
Python tkinter制作单机五子棋游戏
2020/09/14 Python
美国最受欢迎的童装品牌之一:The Children’s Place
2016/07/23 全球购物
美国在线家装零售商:Build.com
2016/09/02 全球购物
Paradox London官方网站:英国新娘鞋婚礼鞋品牌
2019/08/29 全球购物
美国职棒大联盟的官方手套、球和头盔:Rawlings
2020/02/15 全球购物
自我鉴定范文200字
2013/10/02 职场文书
寒假实习自荐信
2014/01/26 职场文书
爱国演讲稿500字
2014/05/04 职场文书
销售顾问工作计划书
2014/08/15 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
世界气象日活动总结
2015/02/27 职场文书
签约仪式致辞
2015/07/30 职场文书