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-i18n在单文件js中的使用

    下面是关于vue-i18n在单文件js中的使用的完整攻略: 1. 安装vue-i18n 首先,我们需要安装vue-i18n,可以使用npm或yarn来安装,以下是命令: # 使用npm安装 npm install vue-i18n –save # 使用yarn安装 yarn add vue-i18n 2. 配置vue-i18n 在Vue项目中,我们可以通过…

    Vue 2023年5月28日
    00
  • vue3 使用setup语法糖实现分类管理功能

    让我来详细讲解一下“vue3 使用setup语法糖实现分类管理功能”的完整攻略。 1. 环境准备 首先,我们需要完成一些准备工作: 安装最新版本的Vue CLI命令行工具 配置VSCode的插件Vetur,以获得更好的vue代码编辑体验 创建一个新的vue3项目。 2. 配置路由 在Vue项目中,我们需要先配置路由,才能实现不同页面之间的跳转。我们使用Vue…

    Vue 2023年5月27日
    00
  • 初识 Vue.js 中的 *.Vue文件

    初识 Vue.js 中的 .vue 文件 在 Vue.js 中,.vue 文件是一个自定义的单文件组件(Single-File Component),可以将 HTML、CSS 和 JavaScript 集中到一个 .vue 文件中,并进行组件化开发。 一个 .vue 文件一般包含三部分:template(模板)、script(脚本)和 style(样式),它…

    Vue 2023年5月28日
    00
  • 基于CSS实现MaterialUI按钮点击动画并封装成 React 组件

    下面我会详细讲解如何基于CSS实现MaterialUI按钮点击动画并封装为React组件。 1.准备工作 安装MaterialUI 首先需要安装MaterialUI,可以使用npm或yarn进行安装。 npm install @material-ui/core //或使用yarn yarn add @material-ui/core 创建按钮组件 接着需要创…

    Vue 2023年5月27日
    00
  • echarts报错:Error in mounted hook的解决方法

    下面是关于”echarts报错:Error in mounted hook的解决方法”的完整攻略。 什么是“echarts报错:Error in mounted hook”的问题? 当使用 echarts 绘制图表时,有时在控制台会看到一个错误提示:“Error in mounted hook”,通常提示中还会包含一些错误信息,比如:“Cannot read…

    Vue 2023年5月27日
    00
  • 仿vue-cli搭建属于自己的脚手架的方法步骤

    下面是我为您准备的详细步骤: 1. 初始化项目 首先,我们需要创建一个空的项目文件夹,然后进入该文件夹,使用以下命令进行初始化: npm init -y 该命令会生成一个 package.json 文件,其中包含了项目的基本描述和依赖信息。 2. 添加依赖 接着,我们需要添加一些必要的依赖,包括: commander:用于解析命令行参数 inquirer:用…

    Vue 2023年5月28日
    00
  • vue项目无法删除的问题及解决

    当我们在使用Vue开发项目时,有时候会出现Vue项目无法删除的情况。这种情况往往是因为项目中的一些文件或者进程仍在运行,阻止了我们删除整个项目。接下来,我将为大家提供一份完整的攻略,帮助大家解决这一问题。 问题描述 当我们使用命令行删除Vue项目时,可能会出现以下错误提示: rmdir “xxx:被占用的文件夹无法删除”。 这个错误提示通常是因为该文件夹正在…

    Vue 2023年5月29日
    00
  • 一起写一个即插即用的Vue Loading插件实现

    下面是“一起写一个即插即用的Vue Loading插件实现”的完整攻略。 确定插件的使用方式和效果 首先要确定我们的插件要如何使用以及要实现的效果。在这个过程中,需要考虑以下几个方面: 插件的使用方式:Vue插件可以通过 Vue.use() 方法进行安装,因此我们需要确定插件的安装方式和参数。 插件的效果:我们的Vue Loading插件需要实现的效果是,在…

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