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

时间:2015-12-29 09:13:05

标签: javascript reactjs requestanimationframe

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

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

  • 站长:
    • logicComponent
    • 计数器

(Master是logicComponent和Counter的父级)

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

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

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

我正在努力避免第三方的npms /库。

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

3 个答案:

答案 0 :(得分: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')
);

显然,逻辑组件的增量方法可以通过点击按钮来触发。

然而,这种结构有点奇怪。如果可能,我会建议更改它。逻辑组件将成为Counter组件的父组件,而不是他的兄弟组件。

以下是示例: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')
);

答案 1 :(得分:1)

对于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*

简单示例:

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

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

高级示例:

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'),
);

答案 2 :(得分:1)

如果您正在使用react,也许您应该尝试我的包裹。

enter image description here

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>;
}