Обновление setInterval в React
Это основано на ответе, приведенном здесь:
У меня проблемы со сбросом setInterval.
На данный момент следующие работы. У меня есть реквизит mediaList
который содержит массив объектов изображений. когда changeActiveMedia
вызывается, позиция объекта перемещается к следующей в списке.
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { activeMediaIndex: 0 };
}
componentDidMount() {
setInterval(this.changeActiveMedia.bind(this), 5000);
}
changeActiveMedia() {
const mediaListLength = this.props.mediaList.length;
let nextMediaIndex = this.state.activeMediaIndex + 1;
if(nextMediaIndex >= mediaListLength) {
nextMediaIndex = 0;
}
this.setState({ activeMediaIndex:nextMediaIndex });
}
renderSlideshow(){
const singlePhoto = this.props.mediaList[this.state.activeMediaIndex];
return(
<div>
<img src={singlePhoto.url} />
</div>
);
}
render(){
return(
<div>
{this.renderSlideshow()}
</div>
)
}
}
Моя проблема возникает здесь.
У меня есть логика, которая может изменить количество объектов в списке, mediaList
,
Это становится проблемой, поскольку интервал обновляется только один раз каждые 5000 секунд, если nextMediaIndex
в течение этого времени 2, и затем я внезапно обновляю mediaList, чтобы иметь только 1 элемент, я сталкиваюсь с ошибкой, так как mediaList[2] не существует.
Итак, мой вопрос, есть ли способ сбросить и очистить setInterval всякий раз, когда this.props.mediaList
обновляется?
1 ответ
window.setInterval
возвращает идентификатор, который идентифицирует Interval
таймер. Вы можете использовать его в сочетании с clearInterval
отменить интервал.
this.interval = setInterval(...);
...
clearInterval(this.interval);
ты можешь использовать componentWillReceiveProps
как своего рода общий метод проверки, чтобы увидеть, если mediaList
изменился например:
componentWillReceiveProps(nextProps) {
if (nextProps.mediaList !== this.props.mediaList) {
clearInterval(this.interval);
}
}