我正在寻找一种在React中为计数器设置动画的方法。
为了举例,我有以下结构的3个组件:
(Master是logicComponent和Counter的父级)
逻辑组件将一个数字传递给主人,主人将数字传递给应该执行动画的Counter组件。 logicComponent以递增方式发送数字,也就是说,每次发生某些事情时,它都会发送更新。
例如,logicCounter调用Master十次来递增计数器,我希望计数器将呈现10次显示10个数字。 到目前为止我尝试过的所有事情都导致显示最终数字(10)而没有任何增量。
在寻找解决方案之后,我遇到了 Window.requestAnimationFrame(),我正在寻找在React中实现它的正确方法。
我正在努力避免第三方的npms /库。
会喜欢你的帮助/想法。 感谢。
答案 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,也许您应该尝试我的包裹。
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>;
}