kuchuluk
@kuchuluk

Почему не срабатывает условие в React?

Здравствуйте!
Есть класс, который выводит компонент на страницу. В этом компоненте в одном элементе меняется текст каждую секунду. Всего значений в props 3 штуки. Отсчет идет с нулевого. Каждую секунду увеличивается на единицу значение newsKey в state. Но когда доходит до 4-го, выдает ошибку, так как его не существует. Но почему условие this.state.newsKey === 2 не срабатывает?
class TrendingTittleAnimated extends Component {
    constructor(props) {
        super(props);
        const {newsItem} = this.props;
        this.state = {
            newsText: newsItem[0].newsItem,
            newsId: newsItem[0].newsId,
            newsKey: 0
        }
    }

    componentDidMount() {
        const {newsItem} = this.props;

        if (this.state.newsKey === 2) {
            console.log(this.state.newsKey);
            this.setState((state) => ({ newsKey: 0 }))
        }
        
    	// выполнять код каждую секунду
    	setInterval(() =>
            this.setState((state) => ({ 
                newsText: newsItem[this.state.newsKey].newsItem,
                newsKey: this.state.newsKey + 1
            })),
            1000
        );
    }

    render () {

        return (
        <div className="trending-animated">
            <ul id="js-news" className="js-hidden">
                <li className="news-item">{this.state.newsText + this.state.newsKey}</li>
            </ul>
        </div>
        )
    }
}
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
pLavrenov
@pLavrenov
Разработка сайтов
1) Этот код морально устарел
2) дважды выполняемое newsKey() не выполняется поочереди!
3) setState передает в колбэк (state) не для того чтобы в функции использовать this.state
4) Название массива и название значения в элементе массива имеют одинаковое название, сам еще не путался в них?

const TrendingTittleAnimated = ({news}) => {
    
    const [counter, setCounter] = useState(0);

    useEffect(() => {
        const interval = setInterval(() => {
            setCounter(t => t === news.length - 1 ? 0 : t + 1 );
        }, 1000);
        return () => clearInterval(interval);
    }, []);

    return (
        <div className="trending-animated">
            <ul id="js-news" className="js-hidden">
                <li className="news-item">{news[counter].newsText}</li>
            </ul>
        </div>
    )
};
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 нояб. 2024, в 01:31
1000 руб./за проект
23 нояб. 2024, в 00:16
2000 руб./за проект
22 нояб. 2024, в 23:55
3000 руб./за проект