TweenOne數(shù)字變化 超過最大數(shù)值后毫痕,顯示錯(cuò)誤解決方案

需求: TweenOne顯示數(shù)字組件當(dāng)數(shù)據(jù)太大的時(shí)候顯示數(shù)據(jù)不對,需要顯示正確數(shù)據(jù)迟几。
解決過程:

找到以下相關(guān)issue:
https://github.com/ant-design/ant-motion/issues/210
https://github.com/ant-design/ant-motion/issues/234
更新到最新版本后問題仍然存在消请,然后去查看了源代碼看到插件內(nèi)部沒有使用bignumber進(jìn)行處理,數(shù)據(jù)大的時(shí)候還是會(huì)有問題类腮,因此決定使用bignumber對這個(gè)插件進(jìn)行改動(dòng)使其支持bignumber梯啤,進(jìn)而滿足業(yè)務(wù)需求。

原因:

使用的插件

import Children from 'rc-tween-one/lib/plugin/ChildrenPlugin';

沒有使用bignumber進(jìn)行處理存哲。

解決方案:

修改這個(gè)插件使其滿足需要,修改前的代碼如下:
https://github.com/react-component/tween-one/blob/master/src/plugin/ChildrenPlugin.jsx
修改后的核心代碼如下:


ChildrenPlugin.prototype = {
  setRatio(ratio) {
    const { valueStr, floatLength, formatMoney } = this.vars;
    let v ;
    // = (value - this.start.value) * ratio + this.start.value;
    v = new BigNumber(valueStr).minus(this.start.value).multipliedBy(ratio).plus(this.start.value);
    if (typeof floatLength === 'number') {
      if (floatLength) {
        v = YData.removeTail0(v.toFixed(floatLength));//刪除尾部無效的0
      } else {
        v = v.toFixed(0);
      }
    }
    v = formatMoney ? this.toMoney(v, formatMoney) : v;
    this.target.innerHTML = v;
  },
};

添加了字段:valueStr將字符串傳到AnimateNumber

import React from 'react';
import TweenOne from 'rc-tween-one';
// import Children from 'rc-tween-one/lib/plugin/ChildrenPlugin';
import config from 'utils/config';
import YData from 'appRoot/utils/YData';
import BigNumber from 'bignumber.js';


const ChildrenPlugin = function (target, vars) {
  this.target = target;
  this.vars = vars;
};

ChildrenPlugin.prototype = {
  name: 'Children',
  getAnimStart() {
    const { formatMoney } = this.vars;
    const opts = {
      thousand: formatMoney && formatMoney.thousand || ',',
      decimal: formatMoney && formatMoney.decimal || '.',
    };
    const rep = new RegExp(`\\${opts.thousand}`, 'g');
    this.start = this.vars.startAt || {
      value: parseFloat(this.target.innerHTML.replace(rep, '').replace(opts.decimal, '.')) || 0
    };
  },
  toMoney(v, _opts) {
    const opts = {
      thousand: _opts.thousand || ',',
      decimal: _opts.decimal || '.',
    };
    const negative = parseFloat(v) < 0 ? '-' : '';
    const numberArray = v.toString().split('.');
    const base = Math.abs(parseInt(numberArray[0], 10)).toString();
    const mod = base.length > 3 ? base.length % 3 : 0;
    const decimal = numberArray[1];
    return `${negative}${mod ? `${base.substr(0, mod)}${opts.thousand}` : ''}${
      base.substr(mod).replace(/(\d{3})(?=\d)/g, `$1${opts.thousand}`)}${
      decimal ? `${opts.decimal}${decimal}` : ''
    }`;
  },
  setRatio(ratio) {
    const { valueStr, floatLength, formatMoney } = this.vars;
    let v ;
    // = (value - this.start.value) * ratio + this.start.value;
    v = new BigNumber(valueStr).minus(this.start.value).multipliedBy(ratio).plus(this.start.value);
    const vString = v.toString();
    console.log('vString',vString)
    if (typeof floatLength === 'number') {
      if (floatLength) {
        v = YData.removeTail0(v.toFixed(floatLength));//刪除尾部無效的0
      } else {
        v = v.toFixed(0);
      }
    }
    v = formatMoney ? this.toMoney(v, formatMoney) : v;
    this.target.innerHTML = v;
  },
};

const Children = ChildrenPlugin;

TweenOne.plugins.push(Children);

/**
 * 使 TweenOne 支持bignumber顯示七婴,添加了plugin Children 字段 valueStr 
 *             <AnimateNumber
                valueStr={valueStr} //valueStr = '1234567890123456789.1234567899';
                value={Number(valueStr)}
                floatLength={2}
              />
 * 
 * @param {*} props 
 */
const AnimateNumber = (props) => {
  const { value, valueStr, formatMoney = true, floatLength = config.MAX_DECIMAL_DIGITS, duration = 1000, style } = props;
  const animation = value || value === 0 ? {
    Children: {
      value: Number(valueStr),
      valueStr: `${valueStr}`,
      floatLength,
      formatMoney,
    },
    duration,
  } : null;
  return (
    <TweenOne
      animation={animation}
      style={style}
    >
      0
    </TweenOne>
  );
};

export default AnimateNumber;

參考:
https://motion.ant.design/components/tween-one#components-tween-one-demo-easingPath

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祟偷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子打厘,更是在濱河造成了極大的恐慌修肠,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件户盯,死亡現(xiàn)場離奇詭異嵌施,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)莽鸭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門吗伤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人硫眨,你說我怎么就攤上這事足淆。” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵巧号,是天一觀的道長族奢。 經(jīng)常有香客問我,道長丹鸿,這世上最難降的妖魔是什么越走? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮靠欢,結(jié)果婚禮上廊敌,老公的妹妹穿的比我還像新娘。我一直安慰自己掺涛,他們只是感情好庭敦,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著薪缆,像睡著了一般秧廉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拣帽,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天疼电,我揣著相機(jī)與錄音,去河邊找鬼减拭。 笑死行瑞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的持痰。 我是一名探鬼主播朽缴,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼可霎!你這毒婦竟也來了魄鸦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤癣朗,失蹤者是張志新(化名)和其女友劉穎拾因,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旷余,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绢记,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了正卧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蠢熄。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖炉旷,靈堂內(nèi)的尸體忽然破棺而出护赊,到底是詐尸還是另有隱情惠遏,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布骏啰,位于F島的核電站节吮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏判耕。R本人自食惡果不足惜透绩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壁熄。 院中可真熱鬧帚豪,春花似錦、人聲如沸草丧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昌执。三九已至烛亦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懂拾,已是汗流浹背煤禽。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岖赋,地道東北人檬果。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像唐断,于是被迫代替她去往敵國和親选脊。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 大貝開了一家叫“久隱”的酒吧脸甘,陰差陽錯(cuò)的原因恳啥,一直沒有機(jī)會(huì)能夠趕過去看一眼。 不知道為什么斤程,第一次知道她有了自己的...
    貓夏_閱讀 490評(píng)論 0 0
  • html引入react編寫 這就是一個(gè)簡單用法忿墅,我們可以看看vdom到底是個(gè)啥玩意,JSON.stringfy看一...
    月肅生閱讀 1,176評(píng)論 0 0
  • preference標(biāo)簽 //設(shè)置是否禁止滑動(dòng)超出范圍沮峡,此時(shí)會(huì)在超出部分顯示黑色背景疚脐。在ios下如果設(shè)置為true...
    classic_閱讀 933評(píng)論 0 0
  • 今天下午我去踢足球,開始的時(shí)候不下雨邢疙,只是陰天棍弄,后來下起了小雨望薄,我們在雨中繼續(xù)訓(xùn)練,雨越下越密呼畸,但是教練也...
    小學(xué)生李沛澤閱讀 178評(píng)論 0 0
  • “量角器不見了痕支,媽媽,幫我找量角器蛮原∥孕耄”小朋友十分淡定地對我說。 可我聽到這句話一點(diǎn)也不淡定儒陨!每次聽到小朋友讓我找東...
    向敏兒閱讀 808評(píng)論 0 0