React setState дважды отображает состояние

Когда я торгую с setState, он поворачивается дважды. Сначала возвращается ошибка данных, а затем - данные готовы. Консоль сначала возвращает false, затем true. Я просто хочу вернуть истину в консоли.

export default class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            loading: false,
            data: []
        };
    }
    componentDidMount() {
        fetch("https://reqres.in/api/users?page=2")
            .then(res => res.json())
            .then(result => {
                this.setState({
                    data: result.data,
                    loading: true
                });
            });
    }
    render() {
        const { loading } = this.state;
        console.info(loading);
        const dataReady = <div>Data Ready </div>;

        const DataFail = <div>Data Fail </div>;
        return <div>{loading === true ? dataReady : DataFail}</div>;
    }
}

Пример: https://codesandbox.io/s/kopz8wrl7o

Что вы имеете в виду, говоря, что хотите вернуть только истину?

Just code 07.01.2019 13:09

да только верните истину.

tom clarck 07.01.2019 13:10

Вы имеете в виду это? codeandbox.io/s/rj8po7jzrq

Just code 07.01.2019 13:12

Вы не можете просто вернуть true в консоли. Поскольку начальное состояние ложно для загрузки. Так что это будет отображаться в консоли перед начальным рендерингом. После этого это изменится на true.

Dushan Ranasinghe 07.01.2019 13:13

Вы должны изучить функцию жизненного цикла shouldComponentUpdate ()

Eponyme Web 07.01.2019 13:14

@EponymeWeb Я не вижу смысла использовать это

Treycos 07.01.2019 13:26

@EponymeWeb Я пробовал использовать shouldComponentUpdate, но не смог. Не могли бы вы показать мне образец?

tom clarck 07.01.2019 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) для оценки ваших знаний,...
1
7
1 106
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это связано с жизненным циклом React и тем фактом, что вы изначально устанавливаете для свойства state.loading значение false. https://reactjs.org/docs/react-component.html

Сначала выполняется начальный рендеринг, затем вызывается componentDidMount с его setState. Возможно, вы захотите оставить загрузку неопределенной, а затем в методе рендеринга проверьте, определено ли оно или нет, прежде чем проверять его значение.

Ответ принят как подходящий

Вы просто изменили логическое значение, связанное с загрузкой. Вы должны сначала установить его на true, а затем на false, когда ваши данные будут загружены.

Рабочий пример:

class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            loading: true,
            error: false,
            data: []
        };
    }
    componentDidMount() {
        fetch("https://reqres.in/api/users?page=2")
            .then(res => res.json())
            .then(result => {
                this.setState({
                    data: result.data,
                    loading: false
                });
            })
            .catch(error =>{
                this.setState({ error: true });
            });
    }
    render() {
        const { loading, error } = this.state;
        !loading && console.info(true)

        return <div>{!loading && <div>Data Ready </div>}
          {error && <div>Data Error :( </div>}
        </div>;
    }
}
    
ReactDOM.render(<App/>, document.getElementById('root'))
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.1.1/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.1.1/umd/react-dom.production.min.js"></script>
<div id='root'/>

Думаю, я не мог точно объяснить вопрос. Я просто хочу вернуть true на консоли, мое начальное значение будет false.

tom clarck 07.01.2019 13:23

Вы хотите вернуть истину только тогда, когда ваши данные загружены?

Treycos 07.01.2019 13:24

Вот и все, теперь ваш компонент регистрирует true при загрузке данных.

Treycos 07.01.2019 13:31

Мне нужно выполнить консольный процесс при рендеринге.

tom clarck 07.01.2019 13:40

Хорошо, я понятия не имею, что это необходимо, но держите. Условием для рендеринга всего, что уже загружено, является просто !loading.

Treycos 07.01.2019 13:42

при перезагрузке страницы появляется сообщение об ошибке данных, затем появляется сообщение о готовности данных. когда вы перезагружаете страницу, я просто хочу вернуть готовые данные.

tom clarck 07.01.2019 13:51

Вы должны были сказать это раньше, вот и все, теперь все исправлено

Treycos 07.01.2019 13:53

ваши данные меняются, поэтому у вас есть два сообщения:

Вам нужно принять решение, что вы собираетесь делать? если вы не хотите изменять состояние, вы можете использовать shouldComponentUpdate, или вы можете просто пропустить 1 консольное сообщение

Как я могу использовать shouldComponentUpdate без использования componentDidMount?

tom clarck 07.01.2019 13:21

вы можете оставить componentDidMount и просто добавить shouldComponentUpdate

Vadim Hulevich 07.01.2019 13:26

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