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 相关文章推荐
onpropertypchange
Jul 01 Javascript
IE和Firefox下javascript的兼容写法小结
Dec 10 Javascript
Chrome扩展页面动态绑定JS事件提示错误
Feb 11 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
Oct 24 Javascript
js自定义trim函数实现删除两端空格功能
Feb 09 Javascript
bootstrap中selectpicker下拉框使用方法实例
Mar 22 Javascript
使用vue-cli导入Element UI组件的方法
May 16 Javascript
elementUI select组件使用及注意事项详解
May 29 Javascript
基于Web Audio API实现音频可视化效果
Jun 12 Javascript
解决vue一个页面中复用同一个echarts组件的问题
Jul 19 Javascript
JS的时间格式化和时间戳转换函数示例详解
Jul 27 Javascript
JS面向对象实现飞机大战
Aug 26 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输入流php://input使用浅析
2014/09/02 PHP
PHP 快速排序算法详解
2014/11/10 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
php使用goto实现自动重启swoole、reactphp、workerman服务的代码
2020/04/13 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
用javascript实现页面打印的三种方法
2007/03/05 Javascript
js 动态文字滚动的例子
2011/01/17 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
基于jQuery实现文本框缩放以及上下移动功能
2014/11/24 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
python执行等待程序直到第二天零点的方法
2015/04/23 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
python字典快速保存于读取的方法
2018/03/23 Python
Python实现的基于优先等级分配糖果问题算法示例
2018/04/25 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
Python求解正态分布置信区间教程
2019/11/20 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
实习生的自我评价
2014/01/08 职场文书
办理护照介绍信
2014/01/16 职场文书
客户接待方案
2014/02/26 职场文书
违纪检讨书
2015/01/27 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
公司酒会主持词
2015/07/02 职场文书
职工培训工作总结
2015/08/10 职场文书
使用Html+Css实现简易导航栏功能(导航栏遇到鼠标切换背景颜色)
2021/04/07 HTML / CSS
MySQL约束超详解
2021/09/04 MySQL