Vue3+TS实现数字滚动效果CountTo组件

下面我将为您详细讲解“Vue3+TS实现数字滚动效果CountTo组件”的完整攻略。

1. 项目背景

数字滚动效果在 web 开发中经常用于展示数据增量或者倒计时情况,通过 CountTo 组件,我们可以方便地实现数字滚动动画效果。本文以 Vue3 和 TypeScript 的方式实现该组件。

2. 技术选型

CountTo 组件的实现需要使用到 Vue3 的响应式数据以及过渡动画效果,同时在实现过程中也需要考虑到代码的可维护性和可读性,因此我们选择使用 TypeScript 作为语言。

3. 实现方式

3.1. 安装依赖

首先,我们需要使用 Vue3,因此需要安装 @vue/cli 以及官方提供的 TypeScript 模板:

npm install -g @vue/cli
vue create --preset typescript my-project

在项目目录下安装 vue-typescript 对应插件以保证 TS 的正常使用:

npm install vue@next @vue/compiler-sfc @vue/runtime-core -D
npm install typescript ts-loader -D

3.2. 实现 CountTo 组件的 DOM 结构

CountTo 组件由多个数字组成,数字大小位置相同,只是数字内容不同,因此我们可以使用 Vue3 的 v-for 指令以及 :key 属性快速完成 CountTo 的 DOM 结构,CountTo 的模板代码如下:

<template>
  <div>
    <span v-for="(digit, index) in digits" :key="index" class="count-to-digit">
      {{ digit }}
    </span>
  </div>
</template>

3.3. 实现 CountTo 组件的动画效果

CountTo 的数字滚动效果需要运用到 Vue3 的过渡动画,我们需要使用 Vue3 的 Transition 组件,配合 CSS 过渡类名实现动画效果,CountTo 的动画效果代码如下:

<template>
  <div>
    <transition-group tag="span" name="count-to" class="count-to-container">
      <span v-for="(digit, index) in digits" :key="index" class="count-to-digit">
        {{ digit }}
      </span>
    </transition-group>
  </div>
</template>

<style>
.count-to-enter-active, .count-to-leave-active {
  transition: all 0.5s;
}
.count-to-enter, .count-to-leave-to {
  opacity: 0;
  transform: translateY(50%);
}
</style>

3.4. 实现 CountTo 组件的功能

在 CountTo 组件中,我们希望能够通过使用 props 接收传递过来的数字和动画持续时间,同时在 mounted 生命周期周期中开始数字的滚动动画。为了实现上述功能,我们还需要定义纯函数以完成 CountTo 组件的数字计算,并将计算结果绑定到 CountTo 的数据模型中,CountTo 组件的完整代码如下:

<template>
  <div>
    <transition-group tag="span" name="count-to" class="count-to-container">
      <span v-for="(digit, index) in digits" :key="index" class="count-to-digit">
        {{ digit }}
      </span>
    </transition-group>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref, computed, onMounted } from 'vue';

export default defineComponent({
  props: {
    start: {
      type: Number,
      default: 0,
      required: true
    },
    end: {
      type: Number,
      default: 100,
      required: true
    },
    duration: {
      type: Number,
      default: 1000
    }
  },
  setup(props) {
    const digits = ref<Array<number>>([]);
    const intervalId = ref<NodeJS.Timeout | null>(null);

    /**
     * 计算 CountTo 组件的数字
     * @param progress 进度值
     */
    function calculateDigits(progress: number) {
      const numbers = Math.abs(props.end - props.start) + 1;
      const step = Math.floor((progress * numbers) / 100);

      digits.value = []
        .concat(props.start + step)
        .toString()
        .split('')
        .map((digit: string) => parseInt(digit));
    }

    /**
     * 开始数字滚动动画
     */
    function startAnimation() {
      let start = 0;

      intervalId.value = setInterval(() => {
        const progress = start / props.duration;

        if (progress < 1) {
          calculateDigits(progress * 100);
        } else {
          clearInterval(intervalId.value as NodeJS.Timeout);
          calculateDigits(100);
        }

        start += 10;
      }, 10);
    }

    onMounted(() => {
      if (props.start !== props.end) {
        startAnimation();
      } else {
        digits.value = [props.start];
      }
    });

    return {
      digits
    };
  }
});
</script>

<style>
.count-to-enter-active,
.count-to-leave-active {
  transition: all 0.5s;
}
.count-to-enter,
.count-to-leave-to {
  opacity: 0;
  transform: translateY(50%);
}
</style>

3.5. 使用 CountTo 组件

使用 CountTo 组件也非常简单,我们只需要传递 start、end 和 duration 三个 props 就可以完成数字滚动的动画效果。如下所示:

<template>
  <div class="container">
    <h1>CountTo Component Demo</h1>
    <div class="intro">
      Want to count from <strong>100</strong> to <strong>10</strong>, in <strong>3</strong> seconds?
    </div>
    <div class="demo">
      <count-to :start="100" :end="10" :duration="3000" />
    </div>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import CountTo from '@/components/CountTo.vue';

export default defineComponent({
  components: { CountTo }
});
</script>

<style scoped>
.container {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.intro {
  margin-bottom: 20px;
}
.demo {
  font-size: 36px;
  font-weight: bold;
  color: #ff3e00;
  padding: 20px;
  border: 5px solid #ff3e00;
  border-radius: 5px;
}
</style>

4. 总结

通过以上我们可以发现 Vue3 和 TypeScript 配以过渡动画类名可以非常方便地实现数字滚动效果,同时对与高扩展、高可维护性有着很好的帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue3+TS实现数字滚动效果CountTo组件 - Python技术站

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

相关文章

  • vue项目常用组件和框架结构介绍

    下面我将为你详细讲解”vue项目常用组件和框架结构介绍”的攻略。 1. 常用组件 在Vue项目开发中,常用的组件有: (1) vue-router 路由是Vue应用中最重要的一部分,它可以帮助我们实现单页应用页面之间的跳转。vue-router是Vue官方提供的路由器,它能轻松地与Vue应用进行整合,可以实现前端路由的效果。 (2) vuex Vuex是一种…

    Vue 2023年5月28日
    00
  • Vue实现手机号、验证码登录(60s禁用倒计时)

    首先,这篇攻略将分为三个部分来讲解, 第一部分:介绍如何使用Vue构建登录表单 第二部分:介绍如何在Vue中添加倒计时功能 第三部分:介绍如何使用Vue和后端API实现手机号、验证码登录。 第一部分:用Vue构建登录表单 使用Vue编写登录表单需要先新建一个Vue实例,可以通过以下代码来创建并挂载Vue实例。 <script src="htt…

    Vue 2023年5月29日
    00
  • vue改变对象或数组时的刷新机制的方法总结

    针对“vue改变对象或数组时的刷新机制的方法总结”这个话题,我可以给出以下攻略: 概述 在Vue中,对于对象或数组的变化,页面并不会自动刷新。为了让页面正确地呈现最新的数据,我们需要手动触发Vue的响应式机制,并让页面重新渲染。本文将总结几种改变对象或数组时的刷新机制方法。 方法总结 直接使用Vue.set() 如果我们在局部对象中添加属性,或者在数组中添加…

    Vue 2023年5月28日
    00
  • vue中引入mousewheel事件及兼容性处理方式

    下面是关于“vue中引入mousewheel事件及兼容性处理方式”的完整攻略。 引入mousewheel事件 在Vue中引入mousewheel事件有两种方式:一种是使用原生JS添加事件,另一种是使用Vue指令添加事件。 方法一:原生JS添加事件 原生JS可以通过addEventListener方法添加mousewheel事件。 document.getEl…

    Vue 2023年5月28日
    00
  • 用Vue.js实现监听属性的变化

    使用Vue.js实现监听属性的变化是Vue.js的一个重要特性。通过使用Vue.js自带的监听器,可以有效的监听组件、变量或数据的变化,并且在变化后自动执行一个动作。下面将介绍如何使用Vue.js实现监听属性的变化。 第一步:定义变量或数据 首先,我们需要定义我们要监听的变量或数据。这个变量或数据可以是一个单独的变量,也可以是一个对象或数组。 //定义一个变…

    Vue 2023年5月28日
    00
  • vue中axios给后端传递参数出现等于号和双引号的问题及解决方法

    下面将详细讲解“vue中axios给后端传递参数出现等于号和双引号的问题及解决方法”的完整攻略。 问题描述 在使用vue和axios进行前端开发的过程中,我们通常需要向后端传递参数。但是,有时候在传递参数的过程中,会出现等于号和双引号的问题,导致后端无法正确解析参数。具体表现为,如果参数中包含等于号或双引号,后端很难确定参数的边界,从而导致解析错误。 解决方…

    Vue 2023年5月27日
    00
  • Vue组件与生命周期详细讲解

    Vue组件与生命周期详细讲解 Vue.js是一款轻量级MVVM框架,由于其简洁易上手的特性,越来越多的开发者开始关注和使用它。Vue.js组件与生命周期是Vue.js开发中的重要概念,本文将对其进行详细讲解。 Vue组件 Vue组件是Vue.js中一个独立的模块,它可以封装HTML、CSS代码和JavaScript代码,用来实现某一个特定的功能。Vue组件的…

    Vue 2023年5月29日
    00
  • vue cli 全面解析

    Vue CLI 全面解析 什么是Vue CLI Vue CLI是一个基于Vue.js进行快速开发的标准化工具,提供了快速生成Vue项目的能力,对于开发和构建大型Vue.js应用非常有帮助。它包含了一套插件和预设,可以让你在几分钟内即可创建Vue项目,配置工具链。 安装Vue CLI 要安装Vue CLI,我们首先需要安装Node.js。我们可以去Node.j…

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