FlatList преобразует один элемент в массив

1

В моем приложении я получаю свои данные с помощью axios. Как мы знаем, мы не можем отображать данные в FlatList как объект, это должен быть массив. Когда я выбираю свои данные с сервера, если это отдельный элемент, это объект, если их больше одного, он возвращает меня в виде массива. Как я могу показать свой единственный элемент в плоский список?

государство:

state = {
    events: [],
    isLoading: true,
    errorCode: null,
    errorMessage: null,
}

мой экземпляр плоского списка;

let events = <FlatList
        style={{ backgroundColor: 'white', height: '100%', width: '100%' }}
        data={this.state.events}
        keyExtractor={(x, i) => i.toString()}
        ListEmptyComponent={this.dataEmpty}
        renderItem={({ item }) => {
            return <EventsList
                startDate={item.startDate}
                headLine={item.eventName}
                description={item.location}
                endDate = {item.endDate}
            />;
        }}
    />;
  • 0
    вставьте свой ответ в вопрос
  • 0
    если вы получаете объект из API, конвертируйте его в массив из одного элемента
Показать ещё 2 комментария
Теги:
react-native

2 ответа

1
Лучший ответ

Я хотел бы убедиться, что данные являются массивом, прежде чем вы сохраните их в состояние, если не изменить его в массив. Array.isArray() - это правильный способ проверить, является ли что-либо массивом. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

Можно создать простую функцию

  1. проверить массив,
  2. если это массив, вернуть его,
  3. если это не массив, преобразовать его в массив и вернуть

let result1 = {id: 1};          // object result
let result2 = [{id:1}, {id: 2}] // array result

function checkData (result) {
  if (Array.isArray(result)) {
    return result
  } else {
    return [result]
  }
}

console.log(checkData(result1))
console.log(checkData(result2))

Я думаю, что делать это после того, как вы уже ввели его в состояние, не лучший способ. Таким образом, вы, вероятно, хотите сделать что - то подобное в вашем axios вызова, прежде чем использовать setState

  • 0
    Я пробую ваше решение. Я сообщу тебе позже. Спасибо за ваш ответ.
  • 0
    Да, это помогло. В качестве вашего ответа я обработал его в своем аксиальном состоянии. Спасибо за ответ.
1

Просто проверьте, если события не являются массивом, верните его в массив:

.... 
      data={Array.isArray(this.state.events)
         ? this.state.events
         : [this.state.events]}
.... 
  • 0
    это бросает мне объекты, не действительные как реагирующее дочернее (найдено: объект с ключами {}). Если вы хотите отобразить коллекцию дочерних элементов, используйте вместо этого массив.
  • 0
    Да, с этой версией ваш код тоже работает. Спасибо за ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню