【问题标题】:How to create an animated counter in React.js?如何在 React.js 中创建动画计数器?
【发布时间】:2015-12-29 09:13:04
【问题描述】:

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

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

  • 大师:
    • 逻辑组件
    • 计数器

(Master是logicComponent和Counter的父级)

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

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

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

我正在尝试避免使用第 3 方 npms/库。

希望得到您的帮助/想法。 谢谢。

【问题讨论】:

  • 如果你已经有一个实现(不工作很好)请分享。否则,由于它需要新的实现,因此在该问题上开始赏金会有所帮助,您不希望重用现有的库。

标签: javascript reactjs requestanimationframe


【解决方案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】:

    如果你正在使用 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>;
    }
    

    【讨论】:

      【解决方案3】:

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

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

      不过,这个结构有点奇怪。如果可能的话,我会建议改变它。 Logic 组件将成为 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')
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        • 1970-01-01
        • 2021-09-20
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多