欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue中優(yōu)雅實(shí)現(xiàn)數(shù)字遞增特效的詳細(xì)過(guò)程

 更新時(shí)間:2022年12月14日 10:42:54   作者:拾荒草  
項(xiàng)目中需要做數(shù)字滾動(dòng)增加的效果,一開始很懵,研究了一下原理,發(fā)現(xiàn)很簡(jiǎn)單,下面這篇文章主要給大家介紹了關(guān)于vue中優(yōu)雅實(shí)現(xiàn)數(shù)字遞增特效的詳細(xì)過(guò)程,需要的朋友可以參考下

需求

前幾天項(xiàng)目開發(fā)中遇到一個(gè)需求,需要在數(shù)字更新時(shí),實(shí)現(xiàn)其動(dòng)態(tài)遞增的效果

并且,在數(shù)字大于10000時(shí),將單位進(jìn)行轉(zhuǎn)換,如數(shù)字大于10000時(shí),單位從變?yōu)槿f(wàn)

我們以vue中開發(fā)為例,一一實(shí)現(xiàn)下這兩個(gè)需求。

實(shí)現(xiàn)

基本開發(fā)思路

實(shí)現(xiàn)數(shù)字遞增,最容易的,我們應(yīng)該可以想到通過(guò)setinterval函數(shù)實(shí)現(xiàn)數(shù)字累加功能。比如,我們的最終值是finanllyNum, 我們可以很快想到這樣的函數(shù):

let finalNum = 1200
let count = 0
let timer = setInterval(() => {
  count ++ 
  if(count > finalNum){
    // 避免count大于finalNum最終數(shù)字顯示不對(duì)
    count = finalNum
    // 清空定時(shí)器
    clearInterval(timer)
    timer = null
  }
}, 10);

這個(gè)代碼中,count是我們要實(shí)時(shí)在瀏覽器中顯示的數(shù)字。我們每10ms實(shí)現(xiàn)數(shù)字進(jìn)行一次遞增,從而實(shí)現(xiàn)數(shù)字的動(dòng)態(tài)遞增特效。

指令的開發(fā)

由于項(xiàng)目中涉及很多這樣的功能點(diǎn),因此,這個(gè)功能應(yīng)該被統(tǒng)一進(jìn)行封裝和復(fù)用。由于我們使用的是vue技術(shù)棧,顯然,通過(guò)vue中的指令來(lái)實(shí)現(xiàn)這個(gè)功能最合適。

以下實(shí)現(xiàn)方案基于vue指令實(shí)現(xiàn),因此,您需要參考官網(wǎng)了解學(xué)習(xí)vue中指令的基本用法。

vue2和vue3指令的用法大同小異,本示例以vue2進(jìn)行演示

指令的基本結(jié)構(gòu)

首先,我們創(chuàng)建change.js文件,寫入指令的最基本結(jié)構(gòu)

// js實(shí)現(xiàn)動(dòng)態(tài)變化的數(shù)字
const directive = {
  inserted(el:any, binding:any) {
    ...
  },
};
export default directive

main.js中引入該文件

import Vue from "vue";
import App from "./App.vue";
import directive from "./change";

Vue.config.productionTip = false;
// 注冊(cè)名為 change 的指令
Vue.directive("change", directive);
new Vue({
  render: (h) => h(App),
}).$mount("#app");

此時(shí),我們創(chuàng)造了一個(gè)名為v-change的指令,我們直接使用

// App.vue
<template>
  <div id="app">
    <span> 240 </span>
  </div>
</template>

結(jié)合我們最開始的實(shí)現(xiàn)思路,可以完善指令

// js實(shí)現(xiàn)動(dòng)態(tài)變化的數(shù)字
const directive = {
  inserted(el, binding) {
  	// 獲取到需要?jiǎng)討B(tài)變化的數(shù)值
    let finalNum = el.innerText;
    let count = 0;
    let timer = setInterval(() => {
      count++;
      el.innerText = count;
      if (count > finalNum) {
        //  避免count大于finalNum最終數(shù)字顯示不對(duì)
        count = finalNum;
        el.innerText = count;
        // 清空定時(shí)器
        clearInterval(timer);
        timer = null;
      }
    }, 10);
  },
};
export default directive;

打開瀏覽器,可以看到我們的指令基本完成了。

但目前這個(gè)指令有個(gè)非常大的問(wèn)題。我們?cè)O(shè)置的是每10ms增加一下數(shù)字(數(shù)字加1),如果數(shù)字非常大比如為12000,那么這個(gè)數(shù)字的動(dòng)態(tài)變化過(guò)程豈不是非常長(zhǎng)?

我們應(yīng)該讓數(shù)字無(wú)論多大,都在指定時(shí)間完成才行。

指令的優(yōu)化

要想數(shù)字在指定時(shí)間完成變化,我們需要找到這個(gè)變化過(guò)程中的一些數(shù)學(xué)關(guān)系。目前,我們已經(jīng)知道的有變化初始值0,變化最終值12000,動(dòng)畫總時(shí)長(zhǎng)(假設(shè)為2S)。其次,每幀動(dòng)畫的間隔時(shí)長(zhǎng)也是我們應(yīng)該考慮的一個(gè)數(shù)值。

一開始的示例中,每10ms就是每幀動(dòng)畫的間隔時(shí)長(zhǎng)。

簡(jiǎn)單理解,動(dòng)畫的間隔時(shí)長(zhǎng)就是每秒動(dòng)畫變化的頻率

我們通過(guò)兩個(gè)圖來(lái)理解一下:

如圖,時(shí)間間隔為 166.7ms時(shí),數(shù)字1s變化6次,分別為 100,200,300,400,500,600

當(dāng)時(shí)間間隔為 100ms時(shí),數(shù)字1s變化10次,以此為60,120,180,.......,600

可見,時(shí)間間隔越小,數(shù)字變化的也就越快。

現(xiàn)在我們可以得到這樣一個(gè)數(shù)學(xué)關(guān)系:

動(dòng)畫總時(shí)長(zhǎng) / 時(shí)間間隔 * 數(shù)字的步長(zhǎng)(每 1時(shí)間間隔增加的值) = 1200

現(xiàn)在,我們可以優(yōu)化一下指令了

// js實(shí)現(xiàn)動(dòng)態(tài)變化的數(shù)字
const directive = {
  inserted(el, binding) {
    // 最終要顯示的數(shù)字
    let finalNum = el.innerText;
    // 動(dòng)畫間隔
    let rate = 30;
    // 總時(shí)長(zhǎng)
    let time = 2000;
    // 步長(zhǎng),數(shù)據(jù)增加間隔
    let step = finalNum / (time / rate);
    // 初始值
    let count = 0;
    // 要保留的小數(shù)
    let timer = setInterval(() => {
      count = count + step;
      el.innerText = count.toFixed(0);
      if (count > finalNum) {
        //  避免count大于finalNum最終數(shù)字顯示不對(duì)
        count = finalNum;
        el.innerText = count;
        // 清空定時(shí)器
        clearInterval(timer);
        timer = null;
      }
    }, rate);
  },
};
export default directive;

效果非常不錯(cuò)!

實(shí)現(xiàn)單位變化

如何數(shù)字后面有單位,我們要怎么實(shí)現(xiàn)單位的變化呢?

第一種方法:

通過(guò)js動(dòng)態(tài)為數(shù)字后賦值,這種方法很好理解

    let timer = setInterval(() => {
      count = count + step;
      // 根據(jù)不同數(shù)值顯示不同單位
      if( count < 1000 ){
        el.innerText = count.toFixed(0) + "個(gè)"
      }else{
        el.innerText = (count / 1000 ).toFixed(0) + "千個(gè)"
      }
      if (count > finalNum) {
        count = finalNum;
        //  避免count大于finalNum最終數(shù)字顯示不對(duì)
        if( count < 1000 ){
          el.innerText = count.toFixed(0) + "個(gè)"
        }else{
          el.innerText = (count / 1000 ).toFixed(0) + "千個(gè)"
        }
        // 清空定時(shí)器
        clearInterval(timer);
        timer = null;
      }
    }, rate);

這個(gè)方法有一個(gè)很大的缺陷,就是單位必須寫死在指令里,如下圖,如果我們要實(shí)現(xiàn)很多動(dòng)態(tài)數(shù)字而且需要不同單位該怎么辦呢?

第二種方法:

指令是可以傳遞參數(shù)的

<template>
  <div id="app">
    <div >
      <span v-change="{eUnit:'個(gè)',eUnit:'萬(wàn)個(gè)'}"> 1200 </span>
    </div>
  </div>
</template>

通過(guò)binding.value可以接受參數(shù)。我們可以通過(guò)獲取的參數(shù),來(lái)處理邏輯,如下:

// js實(shí)現(xiàn)動(dòng)態(tài)變化的數(shù)字
const directive = {
  inserted(el, binding) {
    // .....
    let timer = setInterval(() => {
      count = count + step;
      if( count < 1000 ){
        // binding.value.bUnit是我們通過(guò)指令傳遞進(jìn)來(lái)的參數(shù)
        el.innerText = count.toFixed(0) +  binding.value.bUnit
      }else{
        el.innerText = (count / 1000 ).toFixed(0) + binding.value.eUnit
      }
      if (count > finalNum) {
      //  避免count大于finalNum最終數(shù)字顯示不對(duì)
        count = finalNum;
        if( count < 1000 ){
          el.innerText = count.toFixed(0) + binding.value.bUnit
        }else{
          el.innerText = (count / 1000 ).toFixed(0) + binding.value.eUnit
        }
        // 清空定時(shí)器
        clearInterval(timer);
        timer = null;
      }
    }, rate);
  },
};
export default directive;

當(dāng)然,還有其他實(shí)現(xiàn)邏輯,也歡迎大家發(fā)揮自己的所長(zhǎng)!

總結(jié)

到此這篇關(guān)于vue中優(yōu)雅實(shí)現(xiàn)數(shù)字遞增特效的文章就介紹到這了,更多相關(guān)vue數(shù)字遞增特效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue3獲取DOM節(jié)點(diǎn)的3種方式實(shí)例

    Vue3獲取DOM節(jié)點(diǎn)的3種方式實(shí)例

    Vue本來(lái)無(wú)需操作DOM來(lái)更新界面,而且Vue也不推薦我們直接操作DOM,但是我們非要拿到DOM操作DOM怎么辦,下面這篇文章主要給大家介紹了關(guān)于Vue3獲取DOM節(jié)點(diǎn)的3種方式,需要的朋友可以參考下
    2023-02-02
  • Vue中通過(guò)vue-router實(shí)現(xiàn)命名視圖的問(wèn)題

    Vue中通過(guò)vue-router實(shí)現(xiàn)命名視圖的問(wèn)題

    這篇文章主要介紹了在Vue中通過(guò)vue-router實(shí)現(xiàn)命名視圖,本文給大家提到了vue-router的原理解析,給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • vue+jquery+lodash實(shí)現(xiàn)滑動(dòng)時(shí)頂部懸浮固定效果

    vue+jquery+lodash實(shí)現(xiàn)滑動(dòng)時(shí)頂部懸浮固定效果

    這篇文章主要為大家詳細(xì)介紹了vue+jquery+lodash實(shí)現(xiàn)滑動(dòng)時(shí)頂部懸浮固定效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 關(guān)于vuejs中v-if和v-show的區(qū)別及v-show不起作用問(wèn)題

    關(guān)于vuejs中v-if和v-show的區(qū)別及v-show不起作用問(wèn)題

    v-if 有更高的切換開銷,而 v-show 有更高的出事渲染開銷.因此,如果需要非常頻繁的切換,那么使用v-show好一點(diǎn);如果在運(yùn)行時(shí)條件不太可能改變,則使用v-if 好點(diǎn)
    2018-03-03
  • vue動(dòng)態(tài)修改頁(yè)面title的兩種方法

    vue動(dòng)態(tài)修改頁(yè)面title的兩種方法

    本文主要介紹了vue動(dòng)態(tài)修改頁(yè)面title的兩種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Element中table組件按照屬性執(zhí)行合并操作詳解

    Element中table組件按照屬性執(zhí)行合并操作詳解

    在我們?nèi)粘i_發(fā)中,表格業(yè)務(wù)基本是必不可少的,對(duì)于老手來(lái)說(shuō)確實(shí)簡(jiǎn)單,家常便飯罷了,但是對(duì)于新手小白如何最快上手搞定需求呢?本文從思路開始著手,幫你快速搞定表格
    2022-11-11
  • vue中$nextTick的用法講解

    vue中$nextTick的用法講解

    今天小編就為大家分享一篇關(guān)于vue中$nextTick的用法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • 前端登錄退出處理Token問(wèn)題(獲取、緩存、失效處理)及代碼實(shí)現(xiàn)方法

    前端登錄退出處理Token問(wèn)題(獲取、緩存、失效處理)及代碼實(shí)現(xiàn)方法

    token是一個(gè)用戶信息的表示,在登錄中將會(huì)從后端拿到token,然后用戶才可以進(jìn)行往后的一系列操作,這篇文章主要給大家介紹了關(guān)于前端登錄退出處理Token問(wèn)題(獲取、緩存、失效處理)及代碼實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 用vue構(gòu)建多頁(yè)面應(yīng)用的示例代碼

    用vue構(gòu)建多頁(yè)面應(yīng)用的示例代碼

    這篇文章主要介紹了用vue構(gòu)建多頁(yè)面應(yīng)用的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • vue-cli 目錄結(jié)構(gòu)詳細(xì)講解總結(jié)

    vue-cli 目錄結(jié)構(gòu)詳細(xì)講解總結(jié)

    這篇文章主要介紹了vue-cli 目錄結(jié)構(gòu)詳細(xì)講解總結(jié),詳細(xì)的介紹了整個(gè)項(xiàng)目的目錄以及目錄文件的用法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2019-01-01

最新評(píng)論