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日

相关文章

  • uniapp中微信小程序与H5相互跳转以及传参详解(webview)

    uniapp中微信小程序与H5相互跳转以及传参详解(webview) 简介 在移动端开发中,有时需要在微信小程序和H5页面之间相互跳转,比如在小程序中点击某个按钮跳转到H5页面,或者在H5页面中点击某个链接跳转到小程序,这就需要涉及到两个不同的平台之间的交互。本文主要介绍在uniapp开发中,使用webview实现微信小程序与H5页面之间的相互跳转和传参的详…

    Vue 2023年5月28日
    00
  • 详解从vue的组件传值着手观察者模式

    我会详细讲解从vue的组件传值着手观察者模式的完整攻略。 什么是观察者模式 观察者模式是一种设计模式,常用于在对象之间定义一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都能及时得到通知并更新自己的状态。 在vue中,观察者模式广泛应用于组件之间的传值通信。 vue组件传值 vue组件传值分为父子组件传值和兄弟组件传值两种类型。这里以父子…

    Vue 2023年5月27日
    00
  • Vue学习之常用指令实例详解

    Vue学习之常用指令实例详解 一、指令的概念 Vue中的指令是Vue提供的一种特殊的属性,用于指定DOM节点的行为。指令以 v- 开头,后面跟着指令的名称,如 v-if、v-for、v-bind 等。通过指令,我们可以将Vue实例中的数据绑定到DOM元素上,实现数据的动态显示和交互效果。 二、常用指令实例详解 1. v-text v-text指令用于在DOM…

    Vue 2023年5月27日
    00
  • vue-cli或vue项目利用HBuilder打包成移动端app操作

    下面就详细讲解一下如何将vue-cli或vue项目通过HBuilder打包成移动端app的操作攻略。 1. 安装HBuilder 首先,我们需要下载并安装HBuilder。HBuilder是一个支持多平台的HTML5开发工具,内置了多款开发框架和常用的UI组件,支持打包成Android和iOS原生应用。 你可以在DCloud官网上下载HBuilder:htt…

    Vue 2023年5月27日
    00
  • vue项目配置使用flow类型检查的步骤

    对于准备使用Flow类型检查的Vue项目,需要按照以下步骤进行配置: 1. 配置Flow Vue项目中使用Flow类型检查需要在项目中安装flow-bin和flow-typed这两个依赖。可以使用以下命令安装: npm install –save-dev flow-bin flow-typed 在项目根目录下,运行以下命令进行Flow的初始化: ./nod…

    Vue 2023年5月27日
    00
  • vue-router 4使用实例详解

    下面是“vue-router 4使用实例详解”的完整攻略。 一、前置知识: Vue.js框架的基础使用,Vue组件、生命周期等基础知识。 Vue-Router的基础使用方法,可以参考Vue-Router官网。 对ES6的基础了解。 二、vue-router 4使用实例 1. 安装 vue-router 使用npm安装Vue Router: npm insta…

    Vue 2023年5月28日
    00
  • Angular 与 Component store实践示例

    我来为你详细讲解“Angular与Component store实践示例”的完整攻略。首先,我们将介绍Angular和Component store的基本概念,然后,我们将覆盖两个示例说明,通过简单的例子,让你更好的了解Angular和Component store的实践。 Angular和Component store Angular是一个用于构建现代We…

    Vue 2023年5月28日
    00
  • Vue3的路由传参方法超全汇总

    Vue3的路由传参方法超全汇总 1、在路由路径中传递参数 在路由路径中传递参数是最基本的方法。在定义路由时,可以在路由路径中使用/:参数名表示该参数。例如: const routes = [ { path: ‘/user/:id’, component: User } ] 在上面的代码中,我们定义了一个名为id的参数,使用时路由路径类似于/user/123,…

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