vue实现点击按钮倒计时

yizhihongxing

下面我就为你讲解“Vue实现点击按钮倒计时”的完整攻略。

前置知识:Vue的生命周期函数

实现倒计时需要对Vue的生命周期函数有一定的了解。常用的生命周期函数有 beforeCreate, created, beforeMount, mounted, beforeUpdate, updated, beforeDestroy, destroyed。其中,mounted 函数在组件挂载到页面上后执行,我们可以在这个函数中运行倒计时逻辑。

实现步骤

1.在Vue组件中设置倒计时的初始时间和状态。一般来说,我们需要设置开始时的时间、倒计时的总时长(单位为秒)、倒计时的状态(是否正在倒计时)等变量。

data() {
  return {
    time: '00:00:00',
    totalTime: 60, // 总时长
    isTiming: false // 是否正在倒计时
  }
}

2.通过以下方法实现倒计时逻辑:

  • mounted 方法中运行倒计时函数。
  • 定义一个 countdown 函数,其中判断当前倒计时状态是否为正在倒计时,如不是则返回。如是,则根据当前时间和时间差计算出倒计时剩余时间,并进行展示。当倒计时结束后,将倒计时状态设置为 false,停止倒计时。
mounted() {
  this.countdown(this.totalTime);
}

methods: {
  countdown(totalTime) {
    if (!this.isTiming) {
      return;
    }
    setTimeout(() => {
      totalTime--;
      const minute = Math.floor(totalTime / 60);
      const second = totalTime % 60;
      this.time = `${minute < 10 ? '0' + minute : minute}:${second < 10 ? '0' + second : second}`;
      if (totalTime === 0) {
        this.isTiming = false;
      } else {
        this.countdown(totalTime);
      }
    }, 1000);
  }
}

3.点击按钮实现倒计时状态的转变。在按钮的点击事件中,通过设置倒计时状态来完成状态之间的转变。如果当前倒计时状态为 false,点击按钮后将状态改为 true,开始倒计时。如果当前状态为 true,点击按钮后将状态改为 false,停止倒计时。

<button @click="isTiming = !isTiming">{{isTiming ? '停止倒计时' : '开始倒计时'}}</button>

示例1:简单的倒计时

下面是一个简单的倒计时实现,界面只展示了当前的倒计时时刻和一个按钮,用来启动或停止倒计时。在没有倒计时的时候,时钟的时间是 00:00:00,按钮显示 “开始倒计时”。当点击按钮后,按钮文字变成 “停止倒计时”,并开始倒计时。在倒计时进行中,时钟的数字会随之变化;当倒计时结束后,时钟的数字停止变化,按钮文字变成 “开始倒计时”。

<template>
  <div>
    <div class="time">{{time}}</div>
    <button @click="isTiming = !isTiming">{{isTiming ? '停止倒计时' : '开始倒计时'}}</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      time: '00:00:00',
      totalTime: 60,
      isTiming: false
    }
  },
  mounted() {
    this.countdown(this.totalTime);
  },
  methods: {
    countdown(totalTime) {
      if (!this.isTiming) {
        return;
      }
      setTimeout(() => {
        totalTime--;
        const minute = Math.floor(totalTime / 60);
        const second = totalTime % 60;
        this.time = `${minute < 10 ? '0' + minute : minute}:${second < 10 ? '0' + second : second}`;
        if (totalTime === 0) {
          this.isTiming = false;
        } else {
          this.countdown(totalTime);
        }
      }, 1000);
    }
  }
}
</script>

<style scoped>
.time {
  font-size: 30px;
  text-align: center;
  margin: 30px 0;
}
button {
  font-size: 16px;
  padding: 10px 15px;
  border-radius: 5px;
  background-color: #42b983;
  color: #fff;
  outline: none;
  border: none;
  cursor: pointer;
  transition: background-color 0.3s ease-in-out;
}
button:hover {
  background-color: #26a69a;
}
</style>

示例2:支持设置倒计时的总时间

在这个示例中,我们可以通过输入框设置倒计时的总时间。在运行倒计时过程中无法更改倒计时的总时间。当倒计时结束后,系统会弹出一个提醒框,提示用户倒计时已结束。

<template>
  <div>
    <div class="time">{{time}}</div>
    <div>
      <span>倒计时时间:</span>
      <input type="number" v-model="totalTime" :disabled="isTiming" />
    </div>
    <button @click="isTiming = !isTiming">{{isTiming ? '停止倒计时' : '开始倒计时'}}</button>
    <div class="modal-mask" v-if="!isTiming">
      <div class="modal-container">
        <div class="modal-header">提示</div>
        <div class="modal-body">倒计时已结束!</div>
        <div class="modal-footer">
          <button @click="isTiming = true">重新开始</button>
          <button @click="closeModal">关闭</button>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      time: '00:00:00',
      totalTime: 60,
      isTiming: false
    }
  },
  mounted() {
    this.countdown(this.totalTime);
  },
  methods: {
    countdown(totalTime) {
      if (!this.isTiming) {
        return;
      }
      setTimeout(() => {
        totalTime--;
        const minute = Math.floor(totalTime / 60);
        const second = totalTime % 60;
        this.time = `${minute < 10 ? '0' + minute : minute}:${second < 10 ? '0' + second : second}`;
        if (totalTime === 0) {
          this.isTiming = false;
        } else {
          this.countdown(totalTime);
        }
      }, 1000);
    },
    closeModal() {
      this.totalTime = 60;
      this.time = '00:00:00';
    }
  },
  watch: {
    totalTime(val) {
      this.totalTime = parseInt(val) || 0;
      if (this.totalTime < 0) {
        this.totalTime = 0;
      }
    }
  }
}
</script>

<style scoped>
.time {
  font-size: 30px;
  text-align: center;
  margin: 30px 0;
}
div {
  margin-bottom: 10px;
}
button {
  font-size: 16px;
  padding: 10px 15px;
  border-radius: 5px;
  background-color: #42b983;
  color: #fff;
  outline: none;
  border: none;
  cursor: pointer;
  transition: background-color 0.3s ease-in-out;
}
button:hover {
  background-color: #26a69a;
}
input {
  font-size: 16px;
  padding: 10px 15px;
  border-radius: 5px;
  outline: none;
  border: none;
  transition: background-color 0.3s ease-in-out;
}
input:disabled {
  background-color: #ddd;
}
.modal-mask {
  position: fixed;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: rgba(0, 0, 0, 0.7);
  display: flex;
  justify-content: center;
  align-items: center;
}
.modal-container {
  width: 400px;
  padding: 20px;
  background-color: #fff;
  border-radius: 5px;
}
.modal-header {
  font-size: 18px;
  font-weight: bold;
  margin-bottom: 10px;
  text-align: center;
}
.modal-footer {
  display: flex;
  justify-content: center;
  align-items: center;
}
.modal-footer button {
  font-size: 16px;
  padding: 10px 15px;
  margin: 0 10px;
  border-radius: 5px;
  background-color: #42b983;
  color: #fff;
  outline: none;
  border: none;
  cursor: pointer;
  transition: background-color 0.3s ease-in-out;
}
.modal-footer button:hover {
  background-color: #26a69a;
}
</style>

这是一个更为完备的倒计时示例,你可以根据自己的需求进行相应的改造。希望我的回答对你有所帮助!

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

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

相关文章

  • vue3中使用vuex和vue-router的详细步骤

    下面是使用Vue3中使用Vuex和Vue Router的详细步骤攻略。 安装Vuex和Vue Router 使用npm或yarn命令行工具,执行以下命令来安装Vuex和Vue Router: npm install vuex vue-router 或者 yarn add vuex vue-router 在Vue项目入口文件main.js中引入Vuex和Vue…

    Vue 2023年5月28日
    00
  • Vue用户管理的增删改查功能详解

    Vue用户管理的增删改查功能详解 本文将详细介绍如何使用Vue框架开发一个用户管理界面,包括用户的增加、删除、编辑和查询等功能。在实现这些功能的过程中,我们将使用Vue组件和常见的Web开发技术。本文的目标读者是已经了解基本的Vue知识和Web前端开发知识的开发者。 组件设计 我们先来考虑我们需要哪些组件和它们之间的关系。我们需要一个顶层组件来负责整个界面的…

    Vue 2023年5月28日
    00
  • vue 引用自定义ttf、otf、在线字体的方法

    下面是详细的 vue 引用自定义字体(包括ttf、otf、在线字体)的方法攻略说明: 1. 准备字体文件 首先需要准备好自定义字体文件,可以选择在本地寻找,也可以在网上搜索并下载。文件格式可以是ttf、otf等常见的字体文件格式。 2. 引用本地字体 2.1 在 CSS 中引用 首先需要将自定义字体文件放在项目的静态资源目录中,如 public 目录下的 f…

    Vue 2023年5月28日
    00
  • 详解Vue中状态管理Vuex

    详解Vue中状态管理Vuex 在Vue的大型应用中,数据状态的管理变得异常重要。Vuex是Vue中一个集中式的状态管理器,可以帮助我们方便地管理不同组件之间共享的数据。 Vuex核心概念 State Vuex使用单一状态树,即用一个对象来包含全部应用层级的状态。所有组件的状态存储在一个对象中,这个对象我们称之为state。Vuex的state是响应式的,当s…

    Vue 2023年5月27日
    00
  • 关于element ui的菜单default-active默认选中的问题

    关于element ui的菜单default-active默认选中的问题: 1. 理解 default-active 属性 default-active 属性是 Element UI 中菜单组件 el-menu 的一个选项,作用是设置菜单默认选中的项。使用该属性时,只需将需要默认选中的菜单项的 index 值设置给 default-active 即可。 例如…

    Vue 2023年5月28日
    00
  • 聊聊vue生命周期钩子函数有哪些,分别什么时候触发

    Vue是一种用于构建用户界面的渐进式框架,为方便开发者管理组件状态,Vue提供了一组生命周期钩子函数。 Vue组件生命周期分为创建阶段、更新阶段和销毁阶段三个阶段,每个阶段包含不同的生命周期函数。 创建阶段 在组件创建时,从上到下执行以下生命周期函数:* beforeCreate:此时组件实例刚刚被创建,组件数据对象还没初始化,无法访问任何其他的生命周期函数…

    Vue 2023年5月28日
    00
  • Vue项目中Api的组织和返回数据处理的操作

    下面我来详细讲解“Vue项目中Api的组织和返回数据处理的操作”的完整攻略。 Api的组织 在Vue项目中,可以把Api统一组织到一个单独的文件夹中,比如api文件夹。在该文件夹下,可以按照不同的模块或功能,再分别创建不同的文件来管理相关的Api,比如user.js用于管理用户相关的Api,product.js用于管理商品相关的Api等。 下面是一个示例,创…

    Vue 2023年5月28日
    00
  • Vue多组件仓库开发与发布详解

    我来为您详细讲解“Vue多组件仓库开发与发布详解”的完整攻略。 概述 Vue 多组件仓库开发与发布,意味着我们可以在一个仓库内管理多个 Vue 组件,然后将这些组件发布到 package registry,以便其他人可以通过 npm 安装和使用这些组件。 Vue 组件的开发、测试、打包和发布都需要在仓库内完成,本文将以一个具体的实例进行说明。 前置知识 在进…

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