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 相关文章推荐
推荐30个新鲜出炉的精美 jQuery 效果
Mar 26 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
Mar 22 Javascript
jquery ready(fn)事件使用介绍
Aug 21 Javascript
文本域中换行符的替换示例
Mar 04 Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 Javascript
js 连续赋值的简单实现
Jun 13 Javascript
angularjs使用directive实现分页组件的示例
Feb 07 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
Jun 01 Javascript
原生JavaScript来实现对dom元素class的操作方法(推荐)
Aug 16 Javascript
从零开始实现Vue简单的Toast插件
Dec 03 Javascript
vue+php实现的微博留言功能示例
Mar 16 Javascript
js数组中去除重复值的几种方法
Aug 03 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
第一个无线电台是由谁发明的
2021/03/01 无线电
php中explode与split的区别介绍
2012/10/03 PHP
CURL状态码列表(详细)
2013/06/27 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
Prototype Number对象 学习
2009/07/19 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
firefox下input type=&quot;file&quot;的size是多大
2011/10/24 Javascript
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
js实现图片上传预览原理分析
2017/07/13 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
Javascript实现秒表倒计时功能
2018/11/17 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
Python使用线程来接收串口数据的示例
2019/07/02 Python
Python3 集合set入门基础
2020/02/10 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
Html5移动端网页端适配(js+rem)
2021/02/03 HTML / CSS
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
宿舍卫生检讨书
2014/01/16 职场文书
《花木兰》教学反思
2014/04/09 职场文书
环保倡议书
2014/04/14 职场文书
社团活动总结范文
2014/04/26 职场文书
转让协议书范本
2014/09/13 职场文书
忆童年!用Python实现愤怒的小鸟游戏
2021/06/07 Python
MySQL约束超详解
2021/09/04 MySQL