Я новичок в реагировании, и у меня есть следующие проблемы:
Я использую API с более чем 60 символами, моя проблема в том, что я хочу убедиться, что все символы моего API отображаются без необходимости вручную добавлять каждый номер. ({this.state.people[0].name} , ..., {this.state.people[n].name}).
Эта проблема также заставила меня выполнить вызов API два раза, потому что API дает только 10 результатов за вызов. они следующие на странице 2.
Я создал новый вызов с ?=page2, но это очень утомительный способ сделать это, потому что мне пришлось бы добавить 10 разных вызовов API, чтобы добавить все символы. Я думал о цикле for, но я действительно не знаю, как к этому подойти.
class Api extends Component {
state = {
people:[
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
],
people2:[
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
{name:'Title'},
]
}
componentDidMount() {
axios.get('https://swapi.co/api/people/')
.then(starwars => {
this.setState({
people: starwars.data.results
})
console.info(starwars.data.results)
})
axios.get('https://swapi.co/api/people/?page=2')
.then(starwars2 => {
this.setState({
people2: starwars2.data.results
})
console.info(starwars2.data.results)
})
.catch(error => {
console.info(error);
});
}
render(){
return (
<div>
<Cards title = {this.state.people[0].name} />
<Cards title = {this.state.people[1].name} />
<Cards title = {this.state.people[2].name} />
<Cards title = {this.state.people[3].name} />
<Cards title = {this.state.people[4].name} />
<Cards title = {this.state.people[5].name} />
<Cards title = {this.state.people[6].name} />
<Cards title = {this.state.people[7].name} />
<Cards title = {this.state.people[8].name} />
<Cards title = {this.state.people[9].name} />
<Cards title = {this.state.people2[0].name} />
<Cards title = {this.state.people2[1].name} />
<Cards title = {this.state.people2[2].name} />
<Cards title = {this.state.people2[3].name} />
<Cards title = {this.state.people2[4].name} />
<Cards title = {this.state.people2[5].name} />
<Cards title = {this.state.people2[6].name} />
<Cards title = {this.state.people2[7].name} />
<Cards title = {this.state.people2[8].name} />
<Cards title = {this.state.people2[9].name} />
</div>)
}
}
export default Api;
Сделайте вызов API для 60 символов за один вызов.
Ваша проблема с API, а не с аксиомами. вам нужно прочитать документацию API и узнать, как получить все символы с помощью одного запроса.
Я не думаю, что видел вариант получения всех записей. Как вы говорите, вы можете выполнить цикл и выполнить столько запросов, сколько потребуется, чтобы получить все люди. Ответ показывает count
, который в настоящее время 87
. Вы можете выполнить некоторое деление, чтобы выяснить, сколько страницы или запросов вам нужно выполнить.
Как вы сказали, вы можете выполнить программный цикл и получить все люди. Для этого вам нужно знать, сколько там страниц. Запрос к https://swapi.co/api/people/
возвращает count
как часть ответа. Предполагая, что это общее количество людей, вы можете использовать его для расчета количества страниц, которые вам нужно запросить. Это будет выглядеть примерно так:
Примечание. Я использовал для этого Node, просто добавил необходимые биты React.
const axios = require("axios");
// first page
axios("https://swapi.co/api/people/")
.then(starwars => {
return starwars.data.count;
})
.then(count => {
// exclude the first request
const numberOfPagesLeft = Math.ceil((count - 1) / 10);
let promises = [];
// start at 2 as you already queried the first page
for (let i = 2; i <= numberOfPagesLeft; i++) {
promises.push(axios(`https://swapi.co/api/people?page=${i}`));
}
return Promise.all(promises);
})
.then(response => {
// collect all results into one array
const result = response.reduce((acc, data) => [...acc, ...data.data.results], []);
return result;
//result should contain the remaining records - pages 2 through n.
})
.catch(error => console.info("Properly handle your exception here"));
Как всегда, помните о поведении быстро терпит неудачуPromise.all
Для полноты картины я должен упомянуть, что я не сохранил results
из первого запроса, чтобы ваш окончательный результат не включал первых 10 человек. Вы можете определить переменную persons
вне цепочек промисов и использовать эту переменную, чтобы собрать их все.