Я работаю над приложением, которое вызывает 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;Попробуйте responseData.data.results в setState.





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 - это массив, который вы ищете.
Спасибо большое за вашу помощь! Это устранило проблему.
Было бы полезно и быстрее иметь Plunker с вашим образцом.