Реагировать - просмотр не обновляется после setState

Я давно работаю над компонентом React, но по какой-то причине мое представление не обновляется после вызова ajax и установки состояния.

Итак, в основном у меня есть состояние clients, которое вначале является пустым массивом. В методе жизненного цикла componentDidMount я выполняю вызов ajax, а в обещании .then я устанавливаю состояние для ответа. Но по какой-то причине представление не обновляется, поскольку тег p, говорящий «нет клиентов», все еще существует, а функция map, которую я написал, не выводит никаких результатов.

Я уверен, что состояние clients обновлено, так как я console.info результат после установки состояния, а также в моих инструментах разработки React я вижу, что состояние клиентов имеет 1 элемент.

Для контекста я использую этот компонент в проекте Laravel, но я думаю, это не имеет никакого значения.

Мой код

import React, { Component } from 'react';

class Clients extends Component {


    constructor(props) {
        super(props);
        this.state = {
            clients: [],
        };
    }

    componentDidMount() {
        this.getClients();
    }


    getClients() {
        axios.get('/oauth/clients')
            .then(({data}) => {
                this.setState({
                    clients: data,
                }, () => {
                    console.info(this.state.clients);
                });
            });
    }


    render() {

        const clients = this.state.clients;

        return (

            <div>
                {/* Begin card */}
                <div className = "card card-default">

                    <div className = "card-header">
                        <div style = {flex}>
                            <span>
                                OAuth Clients
                            </span>

                            {/* <a class = "action-link" tabindex = "-1" @click = "showCreateClientForm"> */}
                            <a className = "action-link" tabIndex = "-1">
                                Create New Client
                            </a>
                        </div>
                    </div>

                    <div className = "card-body">

                        { clients.length === 0 &&
                            <p className = "mb-0">
                                You have not created any OAuth clients.
                            </p>
                        }

                            <table className = "table table-borderless mb-0">
                                <thead>
                                    <tr>
                                        <th>Client ID</th>
                                        <th>Name</th>
                                        <th>Secret</th>
                                        <th></th>
                                        <th></th>
                                    </tr>
                                </thead>

                                <tbody>
                                    { clients.map(client => {

                                        return (

                                            <tr key = {client.id}>

                                                <td style = {alignMiddle}>
                                                    {client.id}
                                                </td>

                                                <td style = {alignMiddle}>
                                                    {client.name}
                                                </td>

                                                <td style = {alignMiddle}>
                                                    {client.secret}
                                                </td>

                                                <td style = {alignMiddle}>
                                                    <a className = "action-link" tabIndex = "-1">
                                                        Edit
                                            </a>
                                                </td>

                                                <td style = {alignMiddle}>
                                                    <a className = "action-link text-danger">
                                                        Delete
                                            </a>
                                                </td>
                                            </tr>

                                        );

                                    }) }
                                </tbody>
                            </table>

                    </div>

                </div>
                {/* End card  */}
            </div>

        );
    }
}


// Styles
const flex = {
    display: 'flex',
    justifyContent: 'space-between',
    alignItems: 'center',
};

const alignMiddle = {
    verticalAlign: 'middle',
};

export default Clients;

Я что-то пропустил?

Запрос успешен? Вы пробовали регистрировать data в обратном вызове axios? Возможно, запрос не выполняется и вам нужен catch, чтобы его увидеть. .catch(error => console.error(error). Также может быть, что data - это пустой массив в ответе.

Tholle 12.08.2018 01:24

как насчет ({data}) против (data)? Я имею ввиду что если ответа может и не быть: {data: [clients here]}

num8er 12.08.2018 01:26

@Tholle Как я уже упоминал выше, я уверен, что состояние клиентов обновляется, поскольку я делаю console.info на this.state.clients после установки состояния. Я добавил уловку, но, как я уже сказал, я почти уверен, что состояние обновлено, поэтому мне не вернули никаких ошибок.

Giesburts 12.08.2018 01:28

@ num8er Нет, обычно вы получаете response обратно после звонка ajax. В этом объекте response у вас есть объект data со всеми данными. Использование {data} деструктурирует объект, поэтому мне не нужно использовать response.data. Узнайте больше об этом здесь wesbos.com/destructuring-objects.

Giesburts 12.08.2018 01:30

Очень интересно. Ваш код работает для меня.

Tholle 12.08.2018 01:32

@Tholle Действительно, очень странно ... Я почти думаю, что это что-то из env. я работаю в

Giesburts 12.08.2018 01:37

@Gijsberts, можете ли вы опубликовать массив, который вы получаете от this.state.clients, после того, как вызов ajax возвращается?

jsw324 12.08.2018 02:35

@Gijsberts Ваш код работает нормально отдельно. Не знаю, в чем проблема в вашем приложении, но ваш рабочий код здесь. проверить ссылку stackblitz.com/edit/react-yp2mjz

Himanshu Gupta 12.08.2018 06:14
Поведение ключевого слова "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
8
406
0

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