Функциональность поиска и получение API в React

Я работаю над приложением, которое вызывает API Unsplash и отображает ответ. Я смог легко получить / отобразить ответ только с помощью конечной точки /photos, когда у меня был запрос на выборку в componentDidMount(), но я хочу сделать приложение доступным для поиска, поэтому я добавил performSearch() с запросом по умолчанию.

Но добавление performSearch вызвало эту ошибку: TypeError: невозможно прочитать свойство 'map' неопределенного значения

Это JSON, который я возвращаю, когда тестирую: Конечная точка поиска + запрос

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

class App extends Component {

  constructor() {
    super();
    this.state = {
      results: [],
      loading: true
    };
  }

  componentDidMount() {
    this.performSearch();
  }

  performSearch = (query = 'camping') => {
    fetch(`https://api.unsplash.com/search/photos?page=3&query=${query}&client_id=${client_id}`)
      .then(response => response.json())
      .then(responseData => {
        this.setState({
          results: responseData.data,
          loading: false
        });
      })
      .catch(error => {
        console.info('Error fetching and parsing data', error);
      });
  }

  render() {

    return ( 
      <div className = "App">
        <SearchPhotos onSearch = {this.performSearch} /> 
        <div> 
          {
            (this.state.loading) ? <p>Loading</p> :<PhotoList results = {this.state.results} />
          } 
        </div> 
      </div>
    );
  }
}

export default App;
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

import React from 'react';

const PhotoList = props =>

    <ul>
        {props.results.map((result, index) =>
            <li key = {index}>
                <img src = {result.urls.small} key = {result.id} />
            </li>
        )}
    </ul>;

export default PhotoList;

import React, { Component } from 'react';


class SearchPhotos extends Component {

    state = {
        searchText: ''
    }

    onSearchChange = e => {
        this.setState({
            searchText: e.target.value
        });
    }

    handleSubmit = e => {
        e.preventDefault();
        this.props.onSearch(this.query.value);
        e.currentTarget.reset();
    }

    render() {
        return(
            <form className = "search-form" onSubmit = {this.handleSubmit}>
                <input type = "search"
                    onChange = {this.onSearchChange}
                    name = "search"
                    ref = {(input) => this.query = input}
                    placeholder = "Search..." />
                <button className = "search-button" type = "submit" id = "submit">Go!</button>
            </form>
        );
    }
}

export default SearchPhotos;

Было бы полезно и быстрее иметь Plunker с вашим образцом.

Alex 28.03.2018 19:33

Попробуйте responseData.data.results в setState.

Tomasz Mularczyk 28.03.2018 19:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
2
9 496
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
performSearch = (query = 'camping') => {
    fetch(`https://api.unsplash.com/search/photos?page=3&query=${query}&client_id=${client_id}`)
      .then(response => response.json())
      .then(responseData => {
        this.setState({
          results: responseData.results,
          loading: false
        });
      })
      .catch(error => {
        console.info('Error fetching and parsing data', error);
      });
  }

responseData.results - это массив, который вы ищете.

Спасибо большое за вашу помощь! Это устранило проблему.

Biii 28.03.2018 20:35

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