Per React CountUp README , вы можете использовать хук startAnimation
, чтобы вручную запустить анимацию. Добавьте к этому что-то вроде реагирующий-видимость-датчик , и вы можете подождать, чтобы запустить анимацию, пока она не появится в браузере пользователя.
import React, {Component} from 'react';
import CountUp, {startAnimation} from 'react-countup';
import './App.css';
import VisibilitySensor from 'react-visibility-sensor';
const style = {
componentName: {},
col: {},
countup: {},
};
class App extends Component {
constructor(props) {
super(props);
this.onVisibilityChange = this.onVisibilityChange.bind(this); // Bind for appropriate 'this' context
}
onVisibilityChange(isVisible) {
if (isVisible) {
startAnimation(this.myCountUp);
}
}
render() {
return (
<div className={style.componentName}>
<h2>Heading</h2>
<div className={style.col}>
<div>My counter</div>
<VisibilitySensor
onChange={this.onVisibilityChange}
delayedCall // Prevents react apps triggering elements as visible before styles are loaded
>
<CountUp className={style.countup} decimals={1} start={0} end={25} suffix=" %" duration={3}
ref={countUp => { this.myCountUp = countUp; }} // From react-countup README
/>
</VisibilitySensor>
</div>
</div>
);
}
}
export default App;
Как есть, он будет startAnimation
каждый раз, когда вы прокручиваете счет. Если вы хотите сделать это только один раз, просто добавьте часть состояния, которая устанавливается после первого рендеринга (и затем не позволяйте ей делать startAnimation
снова на основе этого измененного состояния).
Менее элегантные (не рекомендуемые) способы достижения того же эффекта могут включать:
- Используйте встроенные триггеры анимации (то есть меняя реквизиты
duration
, end
, start
), устанавливая их равными некоторому состоянию, которое изменяется при прокрутке пользователем вниз
- Использование реквизита
onStart
, вызываемого до запуска анимации, для задержки запуска анимации до тех пор, пока пользователь не прокрутит вниз
РЕДАКТИРОВАТЬ: обновить, чтобы ответить на ваш второй вопрос
К сожалению, похоже, что библиотека react-countup
не предоставляет способ предотвратить startAnimation
при запуске.
Но мы можем взломать довольно элегантное исправление, манипулируя вместо этого end
, используя состояние:
import React, {Component} from 'react';
import CountUp, {startAnimation} from 'react-countup';
import './App.css';
import VisibilitySensor from 'react-visibility-sensor';
const style = {
componentName: {},
col: {},
countup: {},
};
class App extends Component {
state = {
didViewCountUp: false
};
onVisibilityChange = isVisible => {
if (isVisible) {
this.setState({didViewCountUp: true});
}
}
render() {
return (
<div className={style.componentName}>
<h2 style={{fontSize: '40em'}}>Heading</h2>
<VisibilitySensor onChange={this.onVisibilityChange} offset={{
top:
10
}} delayedCall>
<CountUp className={style.countup} decimals={1} start={0} end={this.state.didViewCountUp ? 25 : 0}
suffix=" %" duration={3} />
</VisibilitySensor>
</div>)
}
}
export default App;