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 相关文章推荐
jquery keypress,keyup,onpropertychange键盘事件
Jun 25 Javascript
浅说js变量
May 25 Javascript
深入理解JavaScript系列(34):设计模式之命令模式详解
Mar 03 Javascript
详谈LABJS按需动态加载js文件
May 07 Javascript
javascript实现动态统计图开发实例
Nov 21 Javascript
jquery trigger函数执行两次的解决方法
Feb 29 Javascript
JavaScript用JSONP跨域请求数据实例详解
Jan 06 Javascript
浅谈KOA2 Restful方式路由初探
Mar 14 Javascript
vue 自动化路由实现代码
Sep 03 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
Sep 12 Javascript
在antd4.0中Form使用initialValue操作
Nov 02 Javascript
Javascript实现关闭广告效果
Jan 29 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
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
Thinkphp 框架扩展之行为扩展原理与实现方法分析
2020/04/23 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
2013/05/24 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
JavaScript动态改变HTML页面元素例如添加或删除
2014/08/10 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
JavaScript的jQuery库中ready方法的学习教程
2015/08/14 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
走进javascript——不起眼的基础,值和分号
2017/02/24 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
vue中引用阿里字体图标的方法
2018/02/10 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
小程序实现新用户判断并跳转激活的方法
2019/05/20 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
[02:41]DOTA2亚洲邀请赛小组赛第三日 赛事回顾
2015/02/01 DOTA
初学Python实用技巧两则
2014/08/29 Python
使用tensorflow实现AlexNet
2017/11/20 Python
使用matplotlib画散点图的方法
2018/05/25 Python
详解python编译器和解释器的区别
2019/06/24 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
函授毕业自我鉴定
2014/02/04 职场文书
教师产假请假条范文
2014/04/10 职场文书
工伤赔偿协议书
2014/04/15 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2014年银行信贷员工作总结
2014/12/08 职场文书
介绍信的写法
2015/01/31 职场文书
党校培训学习心得体会
2016/01/06 职场文书
旅游安全责任协议书
2016/03/22 职场文书
spring boot中nativeQuery的用法
2021/07/26 Java/Android
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android