vue设计一个倒计时秒杀的组件详解


Posted in Javascript onApril 06, 2019

简介:

倒计时秒杀组件在电商网站中层出不穷  不过思路万变不离其踪,我自己根据其他资料设计了一个vue版的

核心思路:

  1. 1、时间不能是本地客户端的时间  必须是服务器的时间这里用一个settimeout代替 以为时间必须统一 
  2. 2、开始时间,结束时间通过父组件传入,当服务器时间在这个开始时间和结束时间的范围内  参加活动按钮可以点击,并且参加过活动以后不能再参加,
  3. 3、在组件创建的时候 同步得到现在时间服务时间差,并且在这里边设置定时器,每秒都做判断看秒杀是否开始和结束,
  4. 4、在更新时间的函数中是否开始和结束,
  5. 5、在computed钩子中监听disable 确定按钮是否可点击
  6. 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设计一个倒计时秒杀的组件详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
不用写JS也能使用EXTJS视频演示
Dec 29 Javascript
获取body标签的两种方法
Oct 13 Javascript
基于javascript 闭包基础分享
Jul 10 Javascript
比较新旧两个数组值得增加和删除的JS代码
Oct 30 Javascript
在JS中操作时间之getUTCMilliseconds()方法的使用
Jun 10 Javascript
学习JavaScript设计模式之单例模式
Jan 19 Javascript
分享自己用JS做的扫雷小游戏
Feb 17 Javascript
浅谈react前后端同构渲染
Sep 20 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
Aug 22 Javascript
微信小程序自定义可滑动日历界面
Dec 28 Javascript
javascript实现弹幕墙效果
Nov 28 Javascript
elementui的el-popover修改样式不生效的解决
Jun 30 Javascript
js字符串处理之绝妙的代码
Apr 05 #Javascript
微信小程序自定义导航栏实例代码
Apr 05 #Javascript
Node.js事件的正确使用方法
Apr 05 #Javascript
利用Node.js如何实现文件循环覆写
Apr 05 #Javascript
详解JavaScript栈内存与堆内存
Apr 04 #Javascript
jQuery中实现text()的方法
Apr 04 #jQuery
基于 jQuery 实现键盘事件监听控件
Apr 04 #jQuery
You might like
从性能方面考虑PHP下载远程文件的3种方法
2015/12/29 PHP
php session的锁和并发
2016/01/22 PHP
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
2010/09/19 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
JS创建自定义表格具体实现
2014/02/11 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
Javascript中的包装类型介绍
2015/04/02 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
Bootstrap 中data-[*] 属性的整理
2018/03/13 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
[02:40]DOTA2超级联赛专访430 从小就爱玩对抗性游戏
2013/06/18 DOTA
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
使用Python求解最大公约数的实现方法
2015/08/20 Python
python 网络编程常用代码段
2016/08/28 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
python配置文件写入过程详解
2019/10/19 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
django rest framework使用django-filter用法
2020/07/15 Python
Python 保存加载mat格式文件的示例代码
2020/08/04 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
大学生职业生涯规划书的基本内容
2014/01/06 职场文书
骨干教师培训制度
2014/01/13 职场文书
运动会通讯稿150字
2014/02/15 职场文书
优秀大专毕业生求职信
2014/08/04 职场文书
上下班时间调整通知
2015/04/23 职场文书
大学生暑期实践报告之企业经营管理
2019/08/08 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL