ReactJS не отображает результаты моего вызова API

В React у меня есть состояние с именем views_res, которое представляет собой список. Я делаю вызов API в viewsList(), который должен отображать результаты вызова API в эту переменную состояния. Однако, когда я отлаживаю с помощью console.info(), я вижу «Пуск» и «ЧТО ДЕЛАТЬ», но представления пусты :(

Я знаю, что конечная точка API верна, так как Postman показывает мне правильный ответ JSON. Однако моя переменная состояния просто не получает данные. Я не уверен, где я иду не так с этим!

В целях конфиденциальности я отредактировал точную конечную точку API.

componentDidMount() {
    this.ViewsList();
  }

  // Gets views from Wistia API
   ViewsList() {
    console.info("start", this.state.views);
// API call
$.getJSON(
  "url"
)
  // JSON format
  .then(response => {
    response.json();
  })
  .then(data => {
    // Map over data
    let views_res = data.response.map(item => (
      <div>
        console.info("play_count", {item.play_count})
        <h1>{item.play_count}</h1> */}
      </div>
    ));
    // Set the state
    this.setState({ views: views_res });
  });
console.info("WHAT UP DOE", this.state.views);
  }

ты привязываешься ViewsList к классу? в конструкторе this.ViewsList = this.ViewsList.bind(this)

John Ruddell 31.05.2019 21:20

setState также является асинхронным. вы можете просмотреть его во втором варианте обратного вызова в setState

John Ruddell 31.05.2019 21:21

Привет, я привязываю ViewList к классу. Но я не знаю, что вы имеете в виду, когда говорите, что я могу просмотреть «второй вариант обратного вызова». Извиняюсь

McFloofenbork 31.05.2019 21:23
this.setState({ views: views_res }, () => { console.info(this.state.views)});
John Ruddell 31.05.2019 21:24

Кроме того, не создавайте свой код JSX таким образом. Получите данные, установите их как свое состояние, затем создайте свой JSX в своем методе render, как обычно.

devserkan 31.05.2019 21:27

Вы пытаетесь преобразовать ответ в json и передать его в следующий раздел? Потому что со скобками response.json(); не будет возвращен для использования в следующем then(). "play_count" печатается? Также обратите внимание на этот stackoverflow.com/questions/33194423/…. (Это обещания в целом, а не только реактивные)

HammerN'Songs 31.05.2019 21:29

@HammerN'Songs Нет, «play_count» не печатается, даже если я удалю скобки вокруг response.json ()

McFloofenbork 31.05.2019 21:32

@JohnRuddell Я пробовал это, но это не решило проблему.

McFloofenbork 31.05.2019 21:33

@devserkan Это лучший стиль?

McFloofenbork 31.05.2019 21:34
.then(response => response.json())?
Junius L. 31.05.2019 21:34

@ЮниусЛ. Я пробовал это, согласно ответу HammerN'Songs, но это не исправило ситуацию.

McFloofenbork 31.05.2019 21:34

попробуйте добавить блок catch .then(data => ...).catch(e => console.info(e))

Junius L. 31.05.2019 21:36

Я бы посоветовал попробовать добавить .done() в конец цепочки promise.then().then() (см. ссылку в предыдущем комментарии) и проверить stackoverflow.com/questions/33237200/….

HammerN'Songs 31.05.2019 21:42
Поведение ключевого слова "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
13
802
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я не уверен, какую библиотеку вы используете для $.getJson (это jQuery?), но обратите внимание, что setStateэто асинхронная операция. Это означает, что вы хотите «увидеть» изменения, если вы console.info после того, как позвонили setState.
Однако есть второй аргумент для setState, который представляет собой функцию обратного вызова, которая будет запущена после фактического обновления состояния.

this.setState({ views: views_res }, () => {
    // this is a callback function for setState.
  // this coode will run just after the state actually updated
  console.info("WHAT UP DOE", this.state.views)
})

Из ДОКУМЕНТОВ:

setState() does not always immediately update the component. It may batch or defer the update until later. This makes reading this.state right after calling setState() a potential pitfall. Instead, use componentDidUpdate or a setState callback (setState(updater, callback)), either of which are guaranteed to fire after the update has been applied

Редактировать
Обратите внимание, что эта часть:

<div>
  console.info("play_count", {item.play_count})
  <h1>{item.play_count}</h1> */}
</div>

Ничего не будет логировать, т.к.

console.info("play_count", {item.play_count})

Это просто строка внутри блока JSX. Если вы хотите писать выражения JavaScript внутри блока JSX, вы должны заключить его в фигурные скобки ({}):

См. работающий пример:

function App() {
  return (
    <div>
     <div>
        console.info("i am just a string")
        {console.info('I will show in the console')}
      </div>
    </div>
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id = "root">

но play_count не регистрируется, что означает, что это состояние даже не получает наборов.

Junius L. 31.05.2019 21:40

почему он должен регистрировать это? это просто string внутри JSX блока

Sagiv b.g 31.05.2019 21:42

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