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(function(){})与(function(){})(jQuery)
Dec 19 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
Aug 11 Javascript
Easyui form combobox省市区三级联动
Jan 13 Javascript
用jQuery获取table中行id和td值的实现代码
May 19 Javascript
jQuery实现select下拉框获取当前选中文本、值、索引
May 08 jQuery
vue如何使用 Slot 分发内容实例详解
Sep 05 Javascript
JavaScrip关于创建常量的知识点
Dec 07 Javascript
JavaScript面试出现频繁的一些易错点整理
Mar 29 Javascript
vue技术分享之你可能不知道的7个秘密
Apr 09 Javascript
利用H5api实现时钟的绘制(javascript)
Sep 13 Javascript
JavaScript实现网页tab栏效果制作
Nov 20 Javascript
react中的DOM操作实现
Jun 30 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容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
JavaScript实现自动变换表格边框颜色
2015/05/08 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
JS双击变input框批量修改内容
2016/12/12 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
基于hover的用法实例(推荐)
2017/07/04 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
uni-app微信小程序登录授权的实现
2020/05/22 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
HTML5画渐变背景图片并自动下载实现步骤
2013/11/18 HTML / CSS
波兰最大的宠物用品网上商店:FERA.PL
2019/08/11 全球购物
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
中学实习教师自我鉴定
2013/12/12 职场文书
人代会标语
2014/06/30 职场文书
单位租房协议书范本
2014/12/04 职场文书
内勤岗位职责
2015/02/10 职场文书
如何使用分区处理MySQL的亿级数据优化
2021/06/18 MySQL
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android