vue 实现 tomato timer(蕃茄钟)实例讲解

下面是详细讲解 “vue 实现 tomato timer(蕃茄钟)实例讲解”的完整攻略。

一、项目介绍

蕃茄钟是一种时间管理方法,采用对数目进行计数的方式来提高工作效率。本项目中我们将使用 Vue 来实现一个基础版的蕃茄钟。

二、项目结构

├── App.vue
├── main.js
├── components
│   ├── Timer.vue
│   └── Tomato.vue
├── assets
│   └── tomato.png
└── styles
    └── index.css
  • App.vue: 根组件,用来包容计时器组件和蕃茄时钟组件
  • components/Timer.vue: 计时器组件,显示倒计时和计时状态特效
  • components/Tomato.vue: 蕃茄钟组件,用来设置每个蕃茄的时间和完成数量
  • assets/tomato.png: 蕃茄钟图标
  • styles/index.css: 样式文件

三、项目实现

1、Tomato.vue 组件

蕃茄钟组件中主要包含一个表单用来输入每个蕃茄的时间,还有一个用来显示当前完成的蕃茄数量。

<template>
  <div class="tomato">
    <div class="tomato-header">
      <img src="../../assets/tomato.png" alt="Tomato" width="80" height="80">
      <h2 class="tomato-title">Tomato Timer</h2>
    </div>
    <div class="tomato-body">
      <form class="tomato-form" @submit.prevent="submit">
        <label class="tomato-label" for="time">设置每个蕃茄时间(分钟)</label>
        <input class="tomato-input" type="number" id="time" v-model.number="time" min="1" max="60" required>
        <button class="tomato-button" type="submit">开始</button>
      </form>
      <div class="tomato-count">已完成 {{ count }} 个番茄</div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      time: 25,
      count: 0
    }
  },
  methods: {
    submit() {
      if (this.time <= 0) {
        return;
      }
      this.$emit('start', this.time)
    }
  }
}
</script>

<style scoped>
.tomato {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.tomato-header {
  display: flex;
  flex-direction: column;
  align-items: center;
  margin: 32px 0;
}
.tomato-title {
  font-size: 32px;
  margin-top: 16px;
}
.tomato-body {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.tomato-form {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.tomato-label {
  font-size: 16px;
  margin-bottom: 16px;
}
.tomato-input {
  width: 200px;
  height: 40px;
  font-size: 24px;
  text-align: center;
  border: 1px solid #ccc;
  margin-bottom: 16px;
}
.tomato-button {
  width: 120px;
  height: 44px;
  font-size: 18px;
  color: #fff;
  background-color: #ff5a5f;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  transition: background-color .3s;
}
.tomato-button:hover {
  background-color: #ff4148;
}
.tomato-count {
  margin-top: 32px;
}
</style>

2、Timer.vue 组件

计时器组件中主要是倒计时的计算和特效的显示。

<template>
  <div class="timer">
    <div class="timer-body" :class="{ 'timer-running': isRunning }">
      <div class="timer-number">{{ minutes }}</div>
      <div class="timer-colon">:</div>
      <div class="timer-number">{{ seconds }}</div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    time: {
      type: Number,
      required: true
    }
  },
  data() {
    return {
      remainingSeconds: 0,
      interval: null
    }
  },
  computed: {
    minutes() {
      return Math.floor(this.remainingSeconds / 60);
    },
    seconds() {
      const seconds = this.remainingSeconds % 60;
      return seconds < 10 ? `0${seconds}` : seconds;
    },
    isRunning() {
      return this.interval !== null
    }
  },
  created() {
    this.reset();
  },
  methods: {
    start() {
      this.interval = setInterval(() => {
        this.remainingSeconds--;
        if (this.remainingSeconds <= 0) {
          this.reset();
          this.$emit('complete');
          return;
        }
      }, 1000)
    },
    reset() {
      clearInterval(this.interval);
      this.remainingSeconds = this.time * 60;
      this.interval = null;
    }
  }
}
</script>

<style scoped>
.timer {
  display: flex;
  justify-content: center;
  align-items: center;
}
.timer-body {
  height: 120px;
  width: 220px;
  background-color: #ff5a5f;
  border-radius: 4px;
  display: flex;
  justify-content: center;
  align-items: center;
}
.timer-running .timer-body {
  animation: timer 1s linear infinite;
}
.timer-number {
  font-size: 72px;
  font-weight: bold;
  color: #fff;
  text-shadow: 2px 2px 0 rgba(0, 0, 0, .2);
}
.timer-colon {
  font-size: 72px;
  margin-left: 8px;
  margin-right: 8px;
  color: #fff;
  text-shadow: 2px 2px 0 rgba(0, 0, 0, .2);
}
@keyframes timer {
  0% {
    transform: scale(1);
  }
  50% {
    transform: scale(1.5);
  }
  100% {
    transform: scale(1);
  }
}
</style>

3、App.vue

在根组件中我们需要将蕃茄钟组件和计时器组件进行拼接。

<template>
  <div>
    <Tomato @start="startTimer" :count="toCompleteCount"></Tomato>
    <Timer v-if="isRunning" :time="currentTime" @complete="completeTomato"></Timer>
  </div>
</template>

<script>
import Tomato from './components/Tomato.vue'
import Timer from './components/Timer.vue'

export default {
  components: {
    Tomato,
    Timer
  },
  data() {
    return {
      currentTime: 0,
      completedCount: 0
    }
  },
  computed: {
    toCompleteCount() {
      return this.completedCount + 1;
    },
    isRunning() {
      return this.currentTime !== 0
    }
  },
  methods: {
    startTimer(time) {
      this.currentTime = time;
    },
    completeTomato() {
      this.completedCount++;
      this.currentTime = 0;
    }
  }
}
</script>

<style>
/* 样式省略 */
</style>

四、项目演示

下面提供两个示例:

至此,vue 实现 tomato timer(蕃茄钟)实例讲解完毕。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue 实现 tomato timer(蕃茄钟)实例讲解 - Python技术站

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

相关文章

  • Vue实现附件上传功能

    如何使用Vue实现附件上传功能?下面是一个完整的攻略: 1. 安装依赖 在使用Vue实现附件上传功能之前,需要安装和配置相关依赖。 首先,在项目中安装axios这个库。axios是一个HTTP客户端,主要用于处理跨域请求和在浏览器和Node.js中发送HTTP请求。 在命令行中输入以下命令来安装axios: npm install axios 然后,在项目中…

    Vue 2023年5月28日
    00
  • Vue之监听方法案例详解

    那么接下来我来详细讲解“Vue之监听方法案例详解”的完整攻略,包含以下几个方面的内容: 什么是监听方法 在Vue中,监听方法指的是在Vue实例中,通过使用watch属性或$watch方法来监测某些值的变化。当监测到这些值发生变化时,可以执行一些指定的操作。 何时使用监听方法 在开发过程中,经常需要实时监测某些变量或属性的值的变化,来做出对应的响应。比如,当数…

    Vue 2023年5月28日
    00
  • Vue中使用ElementUI使用第三方图标库iconfont的示例

    下面是使用Vue中ElementUI引入第三方字体图标库iconfont的完整攻略。 步骤一:注册iconfont账号并创建自己的图标库 首先,我们需要在iconfont官网注册账号并创建自己的图标库,上传需要使用的图标并提取对应的Unicode编码。 步骤二:下载并引入图标字体库 接下来,在iconfont官网生成的网页中,我们点击“下载代码”按钮,选择“…

    Vue 2023年5月28日
    00
  • vue-cli的工程模板与构建工具详解

    Vue CLI的工程模板与构建工具详解 Vue CLI是一个基于Vue.js进行快速开发的完整解决方案,可以快速创建Vue项目,自动管理项目依赖、配置Webpack构建环境,并提供了Vue项目的预设配置和插件,并且建议使用ES6语法。Vue CLI工具内置了大量常用插件的快速配置,使构建Vue应用变得简单易用。Vue CLI的命令行界面(CLI)可以轻松快捷…

    Vue 2023年5月27日
    00
  • Vue组件中prop属性使用说明实例代码详解

    Vue组件中的prop属性用于向组件传递数据,是组件通信的一种方式。在使用prop属性时,需要在组件实例的props选项中声明传递的属性及其类型。本篇攻略将详细讲解Vue组件中prop属性的使用说明,并提供实例代码作为示例。 1. 声明prop属性 在Vue组件中使用prop属性需要在组件的props选项中声明传递的属性及其类型。例如下面的代码是声明一个名为…

    Vue 2023年5月27日
    00
  • 详解Vue computed计算属性是什么

    下面我来详细讲解“详解Vue computed计算属性是什么”的完整攻略。 什么是computed计算属性? 在Vue.js中,computed是一个计算属性,即Vue自带的一种通用的计算方式。它是在模板中进行数据展示和操作的时候,可以使用的一种虚拟数据属性,也可用来监听数据的变化。 计算属性实际上就是对已经存在的数据进行处理,通过已有的数据给出新的计算结果…

    Vue 2023年5月27日
    00
  • 如何在vue中使用ts的示例代码

    下面是详细的讲解“如何在Vue中使用TypeScript”的完整攻略。 1. 创建Vue项目时选择TypeScript 首先,在创建Vue项目时选择使用TypeScript。可以使用vue-cli来创建一个新的Vue项目,这里假设你已经安装了最新版本的vue-cli。 创建一个新的Vue项目,并选择使用TypeScript: vue create my-pr…

    Vue 2023年5月28日
    00
  • 基于mpvue搭建微信小程序项目框架的教程详解

    基于mpvue搭建微信小程序项目框架的教程详解由以下几个部分组成: 1. 准备工作 在开始项目之前,我们需要进行一些准备工作: 1.1 安装mpvue mpvue是一个基于Vue.js的小程序开发框架,可以让我们使用Vue.js语法来进行小程序开发。在命令行中输入如下命令安装mpvue: npm install -g vue-cli vue init mpv…

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