如何在 React.js 中创建一个动画计数器?

ale*_*der 6 javascript requestanimationframe reactjs

我正在寻找一种在 React 中为计数器设置动画的方法。

为了这个例子,我有以下结构的 3 个组件:

  • 掌握:
    • 逻辑组件
    • 柜台

(Master 是 logicComponent 和 Counter 的父级)

逻辑组件将一个数字传递给主组件,然后主组件将其传递给应该执行动画的计数器组件。logicComponent 以增量方式发送数字,也就是说,每次在那里发生某些事情时,它都会发送一个更新。

例如, logicCounter 调用 Master 十次来增加计数器,我预计计数器将被呈现 10 次,显示 10 个数字。到目前为止我尝试过的所有事情都导致显示最终数字(10)而没有任何增量。

在寻找解决方案后,我遇到了Window.requestAnimationFrame()并且我正在寻找一种在 React 中实现它的正确方法。

我试图避免使用 3rd 方 npms/libraries。

会喜欢你的帮助/想法。谢谢。

Bru*_*uce 7

如果你使用的是 react,也许你应该试试我的包。

在此处输入图片说明

https://github.com/bluebill1049/react-flip-numbers

我用它来创建上面的倒数计时器。

下面的代码示例:

import react from 'react';
import FlipNumbers from 'react-flip-numbers';

export default function SexyComponent(props) {
    return <div>
        <FlipNumbers
            height="12px"
            width="12px"
            color="red"
            background="white"
            startAnimation
            numbers="12345"
            numberStyle={{ color: "black" }}
      />
    </div>;
}
Run Code Online (Sandbox Code Playgroud)


GPP*_*nda 6

对于 React-JS 中的动画计数器,我使用'react-count':围绕 'CountUp.js' 的可配置 React 组件包装器。

请参考:https : //github.com/glennreyes/react-countup。查看现场演示:https : //glennreyes.github.io/react-countup/ 步骤:

安装 :

*npm install react-countup --save*
or
*yarn add react-countup*
Run Code Online (Sandbox Code Playgroud)

简单示例:

import React from 'react';
import { render } from 'react-dom';
import CountUp from 'react-countup';

render(
  <CountUp start={0} end={160526} />,
  document.getElementById('root')
);
Run Code Online (Sandbox Code Playgroud)

高级示例:

import React from 'react';
import { render } from 'react-dom';
import CountUp from 'react-countup';

const onComplete = () => {
  console.log('Completed!');
};

const onStart = () => {
  console.log('Started!');
};

render(
  <CountUp
    className="account-balance"
    start={160527.0127}
    end={-875.0319}
    duration={2.75}
    useEasing={true}
    useGrouping={true}
    separator=" "
    decimals={4}
    decimal=","
    prefix="EUR "
    suffix=" left"
    onComplete={onComplete}
    onStart={onStart}
  />,
  document.getElementById('root'),
);
Run Code Online (Sandbox Code Playgroud)


小智 1

window.requestAnimationFrame() 主要用于浏览器上的动画优化。您可以在这里阅读更多相关信息:http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/

但我认为这不能帮助你解决你的问题。据我了解,你的问题出在你的反应组件上。

以下是架构的可能实现示例:https://jsfiddle.net/snahedis/69z2wepo/28572/

var Master = React.createClass({
  increment: function() {
    this.refs.counter.increment();
  },
  render: function() {
    return (
      <div>
        <Counter ref="counter" />
        <Logic increment={this.increment} />
      </div>
    );
  }
});

var Logic = React.createClass({
  render: function() {
    return <button onClick={this.props.increment}>increment</button>;
  }
});

var Counter = React.createClass({
  getInitialState: function() {
    return {
        counter: 0
    };
  },
  increment: function() {
    this.setState({
        counter: this.state.counter + 1
    });
  },
  render: function() {
    return <div>{this.state.counter}</div>;
  }
});

ReactDOM.render(
  <Master />,
  document.getElementById('container')
);
Run Code Online (Sandbox Code Playgroud)

显然,逻辑组件上的增量方法可以通过单击按钮以外的其他方式来触发。

不过,这个结构有点奇怪。如果可能的话我建议改变它。逻辑组件将成为计数器组件的父组件,而不是他的兄弟组件。

这是示例:https://jsfiddle.net/snahedis/69z2wepo/28573/

var Master = React.createClass({
  render: function() {
    return (
      <div>
        <CounterLogicWrapper />
      </div>
    );
  }
});

var CounterLogicWrapper = React.createClass({
  getInitialState: function() {
    return {
        counter: 0
    };
  },
  increment: function() {
    this.setState({
        counter: this.state.counter + 1
    });
  },  
  render: function() {
    return (
      <div>
        <Counter counter={this.state.counter} />
        <button onClick={this.increment}>increment</button>
      </div>
    );
  }
});

var Counter = React.createClass({
  render: function() {
    return <div>{this.props.counter}</div>;
  }
});

ReactDOM.render(
  <Master />,
  document.getElementById('container')
);
Run Code Online (Sandbox Code Playgroud)