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 相关文章推荐
Javascript事件热键兼容ie|firefox
Dec 30 Javascript
jquery $.fn $.fx是什么意思有什么用
Nov 04 Javascript
浅析Javascript中bind()方法的使用与实现
Apr 29 Javascript
使用jquery给新生的th绑定hover事件的实例
Feb 10 Javascript
详解多页应用 Webpack4 配置优化与踩坑记录
Oct 16 Javascript
详解Vue内部怎样处理props选项的多种写法
Nov 06 Javascript
webpack优化的深入理解
Dec 10 Javascript
Vue infinite update loop的问题解决
Apr 23 Javascript
javascript+HTML5 canvas绘制时钟功能示例
May 15 Javascript
Vuex中的Mutations的具体使用方法
Jun 01 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
Oct 20 Javascript
微信小程序实现弹幕墙(祝福墙)
Nov 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 file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
js鼠标滑过图片震动特效的方法
2015/02/17 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
AngularJS动态绑定HTML的方法分析
2016/11/07 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
vue中jsonp插件的使用方法示例
2020/09/10 Javascript
python生成器表达式和列表解析
2016/03/10 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
2016/07/02 Python
Python中序列的修改、散列与切片详解
2017/08/27 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
2018/02/18 Python
Python获取好友地区分布及好友性别分布情况代码详解
2019/07/10 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
python mock测试的示例
2020/10/19 Python
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
英国卫浴商店:Ergonomic Design
2019/09/22 全球购物
SQL面试题
2013/04/30 面试题
经典演讲稿范文
2013/12/30 职场文书
给交警的表扬信
2014/01/12 职场文书
企业车辆管理制度
2014/01/24 职场文书
学校工会工作总结2015
2015/05/19 职场文书
惊天动地观后感
2015/06/10 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android