#javascript #arrays #reactjs #api #array.prototype.map
Вопрос:
import React, { useState, useEffect } from 'react';
import axios from 'axios';
{const CustomerList = () => {
const [information, setInformation] = useState([]);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
if (isLoading) {
axios.get('').then((response) => {
setInformation((prevInfo) => {
return [...prevInfo, response.data];
});
});
}
return () => {
setIsLoading(false);
};
}, [information, isLoading]);
return (
<>
<h2>Name: </h2>
{information.map((item, index) => (
<div>
<div>{item[index].customer.firstName}</div>
<div>{item[index].customer.lastName}</div>
</div>
))}
</>
);
};
export default CustomerList;
- Я получаю данные из api для работы с использованием axios и useeffect
- Я сопоставляю массив данных ответов, и если в массиве нет информации, приложение прерывается
- Как я могу отобразить только определенное количество элементов в массиве?
- Например, если у меня есть 3 элемента в моем массиве данных, он покажет их в браузере из инструкции return, НО… когда он сопоставит все 3, он продолжит повторную попытку и сломается, следовательно, «клиент не определен», потому что больше клиентов нет 5.Я попытался сделать {item.customer.FirstName и получил ошибку с неопределенным именем}
Есть какой-нибудь способ обойти это? Спасибо!
Ответ №1:
Это не так map
работает. С этими аргументами для обратного вызова:
information.map((item, index) => ...
index
является текущим индексом при итерации по information
массиву и item
элементом в этом индексе. Это не очередная копия всего массива. Так что вместо этого:
item[index].customer.firstName
Ты бы просто сделал это:
item.customer.firstName
Кроме того, при итерации по массиву для вывода списка в React вы захотите добавить a key
в элемент верхнего уровня. Вы можете использовать index
для этой цели, если хотите:
{information.map((item, index) => (
<div key={index}>
...
</div>
))}
Или, если item
у вас есть уникальный идентификатор, вы можете использовать его вместо этого и index
полностью удалить.
Комментарии:
1. когда я делаю item.customer.FirstName, я получаю неопределенное имя. Может ли это быть связано с тем, что данные из api являются объектом массивов { [ ], [ ], [ ] } ?? Причина, по которой у меня есть [индекс], заключается в том, что я должен нацелиться на определенный массив, а затем получить клиента
2. @Jcodes: Ну, мы не знаем, каковы ваши данные. Но в рамках отладки вам обязательно следует изучить эти данные, чтобы вы могли знать, что это такое. Каково точное значение времени выполнения
information
и любого заданногоitem
значения при этом отображении?3. Я добавил изображение к вопросу со структурой данных
4. @Jcodes: Тогда
information
это массив из 2 элементов, каждый из которых имеет свойство, начинающееся сcus
. Это свойство может быть вызваноcustomer
, и это свойство клиента может быть объектом, и у этого объекта может быть вызванное свойствоfirstName
, и этоfirstName
свойство может иметь значение. На этой картинке нет никакой такой информации. Вам рекомендуется найти эту информацию в своей отладке.5. Правильно, чтобы состояние информации было равно
response.data
и указывало на объект с двумя элементами массива{ [0], [1] }
. Затем мы сопоставляем этот объект (проблема?) и нацеливаемся на каждый массив, затем в каждом массиве есть объектcustomer
> >firstName
> >value
. Если я сделаюresponse.data[0]
это в вызове api, мы получим только один массив, тогда я смогу это сделать{item.customer.firstName}
, но только для одного массива
Ответ №2:
item[index]
это неверно, так item
как в любом случае относится к элементу массива index
.
Правильный Путь:
const data = [1,2,3,4,5,6,7,8,9,10]
const mappedData = data.map((d, index) => {
console.log("index is", index)
console.log("d is", d)
console.log("-----------------------------")
return d
})
Что вы пытаетесь сделать:
const data = [1,2,3,4,5,6,7,8,9,10]
const mappedData = data.map((d, index) => {
console.log("index is", index)
console.log("d[index] is", d[index]) //undefined since d is not an array
console.log("------------------------------")
return d
})
Ответ №3:
Когда у вас map()
массив элементов, вы обрабатываете каждый item
отдельно, поэтому вам не нужно index
, вы можете использовать index
as key
, подробнее о списках и ключах читайте здесь.
{information.map((item, i) => (
<div key={i}>
<div>{item.customer.firstName}</div>
<div>{item.customer.lastName}</div>
</div>
))}
Комментарии:
1. Когда я это делаю, я получаю «Не могу прочитать свойства неопределенного (чтение «Имя») » может быть, это связано с тем, что возвращаемые данные являются объектом массивов, и каждый массив имеет объект
customer
сfirstName
и значение. Итак, функция .map() возвращает массивы, и с помощью индекса мы ориентируемся на каждый массив??2. @Jcodes добавьте массив объектов в вопрос, я посмотрю, что я могу сделать