Как использовать setState с API-интерфейсом для отправки формы в React?

Я новичок в React и хотел поиграть с fetchAPI. Я хочу использовать API GoogleBooks для отображения списка книг, соответствующих строке запроса, которую пользователь может ввести в поле ввода.

Мне удалось сделать вызов API Google и использовать setState, но я не могу сохранить состояние. Если я хочу отобразить состояние после извлечения данных, состояние отображается как неопределенное.

У меня такое ощущение, что React сначала отображает HTML, а затем устанавливает состояние после вызова API.

Я был бы признателен, если бы вы могли взглянуть на мой компонент.

Спасибо!

import React, {Component} from 'react'

class Search extends Component{
 constructor(props){
super(props)
this.state = {
  books: []

}
this.books = this.state.book
this.title = ''
this.handleChangeEvent = (e) => {
  this.title = e.target.value

}
this.handleSubmit = (e) => {
  let results = '';
  e.preventDefault();
  const apiKey = 'AIzaSyBuR7JI6Quo9aOc4_ij9gEqoqHtPl-t82g'
  fetch(`https://www.googleapis.com/books/v1/volumes?q=${this.title}&key=${apiKey}`)
  .then(response => response.json()).then(jsonData => {
    this.setState({
      books: jsonData
    })
    console.info(jsonData)
  })

}
}
 render(){

return(
  <div className = "col-md-12">
    <form onSubmit = {this.handleSubmit} className = "form-group">
    <label>Enter title</label>
    <input onChange = {this.handleChangeEvent} className = "form-control" ref = "title" type = "text" placeholder = "Enter title"></input>
    <button  type = "submit" className = "btn btn-primary">Submit</button>
    </form>
    <div>
      <li>this.state.books</li>
    </div>
  </div>

вы получаете какую-либо ошибку?

duc mai 07.04.2019 23:13
Поведение ключевого слова "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
1 277
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

У тебя есть:

<li>this.state.books</li>

Это просто рендеринг строки.

Вместо этого вы можете использовать map, чтобы показать данные из книги, которую вы получили из ответа.

Вот рабочий пример:

 <div>
   {
      this.state.books.items &&
      this.state.books.items.map(book => <li>{book.etag}</li>)
    }
 </div>

Какая оплошность с моей стороны. Спасибо, Колин!

Bogdan Moisa 08.04.2019 06:19

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