Реагируйте, setState в componentDidMount не всегда меняет значение состояния

Я относительно новичок в React и пытаюсь случайно изменить значение одного из моих свойств состояния после отображения страницы. Но использование setState в componentDidMount, похоже, не работает каждый раз, иногда я получаю возвращаемое значение исходного состояния (чего никогда не должно происходить)

Что-то я здесь делаю не так?

constructor(props) {
    super(props);

    this.state = {
        houseAd: null
    };
}

а затем на setState

componentDidMount() {
    const houseAds = ['ad1', 'ad2'];
    const rand = houseAds[Math.floor(Math.random() * houseAds.length)];

    this.setState({
        houseAd: rand
    });
}

Иногда я получаю тот или иной из своего массива houseAds, но иногда он просто возвращает null

Затем в моем рендере я просто делаю что-то простое, например:

let ad;
if (this.state.houseAd === 'ad1') {
    ad = 'Ad1';
}
if (this.state.houseAd === 'ad2') {
    ad = 'Ad2'
}

Но очевидно, что когда значение состояния равно null, ничего не отображается.

Может вам это интересно github.com/styled-components/styled-components/issues/1575

Héctor 26.09.2018 13:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
58
2

Ответы 2

Код в порядке, только в первый раз вы получите null, в следующий раз, когда вы не получите нулевые значения, проверьте значение состояния с помощью функции обратного вызова после такого обновления.

this.setState({
    houseAd: rand
}, ()=> {console.info(this.state.houseAd});

componentDidMount называется после начальный render - вы, наверное, не заметили - второй вызов рендеринга принудительно setState быстро исправляет / скрывает начальное состояние.

console.info(this.state.houseAd) в render, чтобы доказать это.

Если вам нужно что-то при запуске - сделайте это в constructor.

Другие вопросы по теме