Как использовать setState с fetch API при отправке формы в React?

#javascript #reactjs

#javascript #reactjs

Вопрос:

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

Мне удалось вызвать Google API и использовать 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.handleChange = (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}amp;key=${apiKey}`)
  .then(response => response.json()).then(jsonData => {
    this.setState({
      books: jsonData
    })
    console.log(jsonData)
  })

}
}
 render(){

return(
  <div className="col-md-12">
    <form onSubmit={this.handleSubmit} className="form-group">
    <label>Enter title</label>
    <input onChange={this.handleChange} 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>
  

Комментарии:

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

Ответ №1:

У вас есть:

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

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

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

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

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

Комментарии:

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