vue实现秒杀倒计时组件

关于如何使用vue实现秒杀倒计时组件,以下是详细讲解:

1. 确认需求

在开始开发之前,我们需要先明确需求,确定倒计时组件的功能和样式要求。例如,我们的秒杀倒计时需要支持以下功能:

  • 显示倒计时的小时、分钟和秒钟;
  • 支持自定义倒计时的截止时间;
  • 支持在倒计时结束时触发自定义回调事件;
  • 样式需求:支持自定义组件的大小、字体样式和颜色等属性。

2. 开始开发

2.1 创建组件

首先,在Vue项目中创建一个名为“CountDown”的.vue单文件组件。组件的结构如下:

<template>
  <div class="count-down">
    <!-- 倒计时组件的 UI 展示部分 -->
  </div>
</template>

<script>
export default {
  name: 'CountDown',
  props: {
    // 自定义属性
  },
  data() {
    return {
      // 数据变量
    }
  },
  computed: {
    // 计算属性
  },
  methods: {
    // 方法
  }
}
</script>

<style scoped>
/* 样式定义 */
</style>

2.2 倒计时逻辑实现

接下来是实现倒计时的核心部分,我们需要在组件中定义一个方法,用于计算当前时间和截止时间的时间差,并将时间差转化为小时、分钟和秒钟。该方法的具体实现如下:

methods: {
  getTime() {
    // 根据 props 接收的截止时间计算剩余时间,毫秒级别
    let remainTime = this.endTime - Date.now(); 

    // 如果时间到了就停止
    if (remainTime <= 0) {
      clearInterval(this.timer);
      this.onEnd();  // 到时后触发结束事件
    } else {
      // 转换剩余时间为时分秒
      this.hours = Math.floor((remainTime / (1000 * 60 * 60)) % 24);
      this.minutes = Math.floor((remainTime / (1000 * 60)) % 60);
      this.seconds = Math.floor((remainTime / 1000) % 60);
    }
  }
}

接下来,我们需要在组件的挂载阶段启动倒计时:在created()或mounted()钩子函数中调用setInterval()方法,以每秒钟调用一次getTime()方法,更新组件时间。代码实现如下:

mounted() {
  this.timer = setInterval(() => {
    this.getTime();
  }, 1000);
}

2.3 响应事件

在倒计时结束后,需要触发一个回调函数来处理事件。我们可以定义一个onEnd()方法,在getTime()方法中判断是否已经到时,如果已经到时,则调用onEnd()方法,触发回调事件指定的函数。代码实现如下:

methods: {
  // 初始化,计算当前时间和截止时间的时间差,然后启动倒计时函数
  init() {
    // 根据 props 接收的截止时间计算剩余时间,毫秒级别
    let remainTime = this.endTime - Date.now();

    // 如果时间到了就停止
    if (remainTime <= 0) {
      this.onEnd();
    } else {
      this.getTime();
      // 每1秒钟执行一次 getTime() 函数,更新倒计时
      this.timer = setInterval(() => {
        this.getTime();
      }, 1000);
    }
  },
  getTime() {
    // 计算剩余时间
    let remainTime = this.endTime - Date.now();

    if (remainTime <= 0) {
      clearInterval(this.timer);
      this.onEnd();
    } else {
      // 将剩余时间转换为小时、分钟和秒钟
      this.hours = Math.floor((remainTime / (1000 * 60 * 60)) % 24);
      this.minutes = Math.floor((remainTime / (1000 * 60)) % 60);
      this.seconds = Math.floor((remainTime / 1000) % 60);
    }
  },
  onEnd() {
    // 当倒计时结束后,触发父组件传递进来的回调函数
    this.$emit('end');
  }
}

2.4 显示倒计时

倒计时组件的最后一个关键步骤是,在模板中显示倒计时组件。我们可以使用Vue的插值表达式在模板中显示剩余时间,如下所示:

<div class="count-down">
  <span class="hours">{{hours}}</span> :
  <span class="minutes">{{minutes}}</span> :
  <span class="seconds">{{seconds}}</span>
</div>

2.5 完整组件代码

<template>
  <div class="count-down" :style="containerStyle">
    <span class="hours">{{hours}}</span> :
    <span class="minutes">{{minutes}}</span> :
    <span class="seconds">{{seconds}}</span>
  </div>
</template>

<script>
export default {
  name: 'CountDown',
  props: {
    endTime: {
      default: null,
      type: Number
    },
    containerStyle: {
      default: {},
      type: Object
    },
    hourStyle: {
      default: {},
      type: Object
    },
    minuteStyle: {
      default: {},
      type: Object
    },
    secondStyle: {
      default: {},
      type: Object
    },
    onEnd: {
      default: function() {},
      type: Function
    }
  },
  data() {
    return {
      hours: 0,
      minutes: 0,
      seconds: 0,
      timer: null
    }
  },
  mounted() {
    this.init();
  },
  methods: {
    // 初始化
    init() {
      if (!this.endTime) {
        throw new Error('结束时间不能为空!');
      }
      this.getTime();
      if (Date.now() < this.endTime) {
        this.timer = setInterval(() => {
          this.getTime();
        }, 1000);
      } else {
        this.onEnd(); // 已经到时
      }
    },
    // 计算剩余时间
    getTime() {
      let remainTime = this.endTime - Date.now();
      if (remainTime <= 0) {
        clearInterval(this.timer);
        this.onEnd();
      } else {
        this.hours = Math.floor((remainTime / (1000 * 60 * 60)) % 24);
        this.minutes = Math.floor((remainTime / (1000 * 60)) % 60);
        this.seconds = Math.floor((remainTime / 1000) % 60);
      }
    }
  }
}
</script>

<style scoped>
.count-down {
  display: inline-block;
  background-color: #333;
  color: #fff;
  padding: 4px 8px;
  border-radius: 4px;
  font-size: 16px;
}

span {
  font-size: 20px;
  font-weight: bold;
  padding: 0px 5px;
}
</style>

3. 示例说明

示例1:在秒杀商品详情页中使用

在秒杀商品详情页中,我们可以将该倒计时组件放置在商品价格和购买按钮下方,用来提示用户剩余时间和结束时间。在实际操作中,可以先通过接口动态获取秒杀结束时间,然后将其传递给倒计时组件。代码示例如下:

<template>
  <div>
    <div class="price">{{ price }}</div>
    <count-down :end-time="endTime" :container-style="countdownStyle" @end="onEnd"></count-down>
    <button @click="buy">立即购买</button>
  </div>
</template>

<script>
import CountDown from '@/components/CountDown'

export default {
  components: {
    CountDown
  },
  data() {
    return {
      price: '100.00',
      endTime: 1631457620000, // 秒杀结束时间
      countdownStyle: {
        backgroundColor: '#f00',
        fontSize: '18px'
      }
    }
  },
  methods: {
    buy() {
      // 当前秒杀还未结束,可以进行购买操作
    },
    onEnd() {
      // 秒杀倒计时结束,提示用户秒杀已结束
    }
  }
}
</script>

示例2:在活动列表页中使用

在活动列表页中,我们可以将该倒计时组件放置在商品或活动的缩略图下方,用于提示活动剩余时间和结束时间。在实际操作中,可以通过接口动态获取活动的开始时间和结束时间,然后将其传递给倒计时组件。代码示例如下:

<template>
  <div v-for="(activity,index) in activities" :key="index" class="activity">
    <img :src="activity.img" alt="活动图片">
    <h3>{{ activity.title }}</h3>
    <count-down :end-time="activity.endTime" :container-style="countdownStyle" @end="onEnd"></count-down>
  </div>
</template>

<script>
import CountDown from '@/components/CountDown'

export default {
  components: {
    CountDown
  },
  data() {
    return {
      activities: [
        {
          img: 'https://path/to/image1.png',
          title: '活动名称一',
          endTime: 1631457620000 // 活动结束时间1
        },
        {
          img: 'https://path/to/image2.png',
          title: '活动名称二',
          endTime: 1631450000000 // 活动结束时间2
        },
        {
          img: 'https://path/to/image3.png',
          title: '活动名称三',
          endTime: 1631446000000 // 活动结束时间3
        }
      ],
      countdownStyle: {
        backgroundColor: '#f00',
        fontSize: '18px'
      }
    }
  },
  methods: {
    onEnd() {
      // 活动倒计时结束,提示用户活动已结束
    }
  }
}
</script>

以上就是使用Vue实现秒杀倒计时组件的完整攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue实现秒杀倒计时组件 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • vue里使用create,mounted调用方法的正确姿势说明

    接下来我来详细讲解“Vue中使用created和mounted调用方法的正确方式”。 1. created 和 mounted Vue 组件的生命周期函数可以分为 beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed。今天我们主要来讲解其中的…

    Vue 2023年5月28日
    00
  • 使用vue和element-ui上传图片及视频文件方式

    为了使用Vue和Element-UI上传图片和视频文件,你需要遵循以下攻略: 步骤1:安装Element-UI 首先,你需要将Element-UI安装到你的Vue项目中。可以通过以下命令来安装它: npm install element-ui -S 步骤2:引入Element-UI 在Vue项目的入口文件(例如main.js)中引入并注册Element-UI…

    Vue 2023年5月28日
    00
  • 关于Vue的 watch、computed和methods的区别汇总

    请听我详细讲解“关于Vue的 watch、computed和methods的区别汇总”的完整攻略: Watch watch 是 Vue 提供的用于观察属性变化的方法,当数据发生变化时执行回调函数。通常情况下,watch 可以用来监听一个数据对象中深层次的属性变化,当属性变化后执行具体的操作,例如网络请求、计算等。 可以使用 vm.$watch 方法将所需要的…

    Vue 2023年5月28日
    00
  • 利用vue对比两组数据差异的可视化组件详解

    你好,下面是对“利用vue对比两组数据差异的可视化组件详解”的完整攻略的详细讲解: 利用vue对比两组数据差异的可视化组件详解 什么是数据差异可视化组件? 数据差异可视化组件可以让用户直观地看到两组数据之间的区别,通常用于比较历史数据和最新数据或两个数据集之间的差异。利用数据差异可视化组件,用户可以快速了解两组数据之间的变化情况,从而更好地进行决策和分析。 …

    Vue 2023年5月29日
    00
  • vue 解决兄弟组件、跨组件深层次的通信操作

    在Vue中,组件之间的通信是一个重要的话题。通信的方式有很多种,其中包括父子组件通信、兄弟组件通信、跨级组件通信等。而跨组件深层次的通信往往是最复杂的。 在本篇文章中,我们将详细讲解Vue中如何解决兄弟组件、跨组件深层次的通信操作。 兄弟组件通信 在Vue中,兄弟组件之间通信的实现可以采用中央事件总线的方式。具体而言,就是利用Vue实例作为事件总线,来传递事…

    Vue 2023年5月27日
    00
  • vue 页面回退mounted函数不执行的解决方案

    1.问题描述 当 Vue 页面回退时,如果使用了 keep-alive 组件进行缓存,再次进入该页面时,mounted 钩子函数不会执行。这是因为使用了 keep-alive 缓存组件,导致页面并未被销毁,因此再次进入页面时不会触发 mounted 钩子函数。 2.解决方案 方法一:使用 activated 钩子函数 当使用缓存组件时,在页面再次进入前会触发…

    Vue 2023年5月28日
    00
  • Django+Vue实现WebSocket连接的示例代码

    下面是详细的 Django+Vue 实现 WebSocket 连接的步骤和示例代码。 环境准备 Django 首先需要安装 Django 框架和 Django Channels 库,采用 pip 进行安装: pip install Django pip install channels Vue Vue 需要安装 Vue CLI,用于创建 Vue 项目,并安装…

    Vue 2023年5月28日
    00
  • vue用Object.defineProperty手写一个简单的双向绑定的示例

    下面是Vue用Object.defineProperty手写一个简单的双向绑定的攻略。 双向绑定是指当数据改变时,视图也会随之更新,而当视图改变时,数据也会随之更新。Vue是一款双向绑定的框架,它通过观察者模式实现了数据与视图的同步更新。其核心原理就是利用Object.defineProperty()方法对数据进行拦截和劫持,实现数据变更时视图的更新操作。下…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部