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 相关文章推荐
asp.net HttpHandler实现图片防盗链
Nov 09 Javascript
含有CKEditor的表单如何提交
Jan 09 Javascript
HTML5实现微信拍摄上传照片功能
Apr 21 Javascript
vue router路由嵌套不显示问题的解决方法
Jun 17 Javascript
浅谈Node.js 沙箱环境
May 15 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
May 27 Javascript
微信小程序仿微信运动步数排行(交互)
Jul 13 Javascript
JSON生成Form表单的方法示例
Nov 21 Javascript
JS实现带阴历的日历功能详解
Jan 24 Javascript
JS获取本地地址及天气的方法实例小结
May 10 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
May 15 Javascript
vue项目配置使用flow类型检查的步骤
Mar 18 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的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
关于ThinkPHP中的异常处理详解
2018/05/11 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
学习jquery之一
2007/04/27 Javascript
将jQuery应用于login页面的问题及解决
2009/10/17 Javascript
jQuery 创建Dom元素
2010/05/07 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
2012/01/10 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
详解webpack+angular2开发环境搭建
2017/06/28 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
浅要分析Python程序与C程序的结合使用
2015/04/07 Python
Python中协程用法代码详解
2018/02/10 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
Python+selenium 获取浏览器窗口坐标、句柄的方法
2018/10/14 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
Python模块相关知识点小结
2020/03/09 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
Python 中如何写注释
2020/08/28 Python
波兰家居饰品和厨房配件网上商店:Maleomi
2020/12/15 全球购物
extern在函数声明中是什么意思
2014/01/19 面试题
如何利用find命令查找文件
2015/02/07 面试题
预备党员党校学习自我评价分享
2013/11/12 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
家长对孩子的寄语
2015/02/26 职场文书
治理商业贿赂工作总结
2015/08/10 职场文书
环保建议书范文
2015/09/14 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
Redis6.0搭建集群Redis-cluster的方法
2021/05/08 Redis