У меня есть Modal, из которого пользователь выбирает категории, а затем эта категория загружается в FlatList на странице их профиля. Когда выбрана первая категория, она правильно загружается с желаемым форматированием:
Когда пользователь выбирает и добавляет второй элемент из модального окна, элементы исчезают, например:
И когда добавляется третий элемент, появляется эта ошибка:

КОД:
Массив категорий, из которого выбирает пользователь, и состояния хука:
const [catData, setCatData] = React.useState([])
const [catsSelected, setCatsSelected] = React.useState([])
const categoryData=[
{
id: 1,
name: "CatOne",
},
{
id: 2,
name: "CatTwo",
},
{
id: 3,
name: "CatThree",
}]
Функция, которая вызывается, когда пользователь ВЫБИРАЕТ нужную ему категорию:
const onSelectCategory = (itemSelected, index) => {
let newData = categories.map(item => {
if (item.id === itemSelected.id) {
return {
...item,
selected: !item.selected
}
}
return {
...item,
selected: item.selected
}
})
selectedData = newData.filter(item => item.selected === true)
setCatData(selectedData)
}
// Note, the above code is as such due to initially wanting the user to be able to select multiple categories at a time, however,
// I've decided that one category at a time would suffice, and I just modified the above function to fit that need (I will tidy it up later).
Функция вызывается, когда пользователь ПОДТВЕРЖДАЕТ выбранную категорию:
const catSave = () => {
if (catData.length > 0){
if (catsSelected.length < 1){
setCatsSelected(catData)
}
else{
testData = catsSelected
testData = testData.push(catData[0])
setCatsSelected(testData)
}
}
setModalVisible(!modalVisible)
}
И FlatList, в который загружаются выбранные категории:
<FlatList
data = {catsSelected}
horizontal
showsHorizontalScrollIndicator = {false}
keyExtractor = {item => `${item.id}`}
renderItem = {renderCats}
/>
Для справки, вот консольный лог CatsSelected по мере его изменения:
[] // when it is initialized
[{"id": 1, "name": "CatOne", "selected": true}] // first item added
[{"id": 1, "name": "CatOne", "selected": true}, {"id": 2, "name": "CatTwo", "selected": true}] // second item added, the FlatList is now invisible
// Error prompts after third item is added.
Мне нужно, чтобы FlatList не был невидимым, и чтобы эта ошибка не выдавала запрос после добавления третьего элемента, кто-нибудь уверен, почему это происходит?
Спасибо за помощь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Похоже, ваша проблема связана с оператором else в функции catSave. Может быть, вы хотите сделать это?
const catSave = () => {
if (catData.length > 0){
if (catsSelected.length < 1){
setCatsSelected(catData)
}
else{
setCatsSelected([...catsSelected, catData[0]])
}
}
setModalVisible(!modalVisible)
}
Array.prototype.push в состояние, которое представляет собой новую длину массива, а не обновленный массив.catsSelected больше не массив, а число, метод push не существует.The
push()method adds one or more elements to the end of an array and returns the new length of the array.
const catSave = () => {
if (catData.length > 0) {
if (catsSelected.length < 1) {
setCatsSelected(catData);
} else {
testData = catsSelected; // <-- reference to state
testData = testData.push(catData[0]); // <-- testData.push mutates state
setCatsSelected(testData); // <-- testData now new array length
}
}
setModalVisible(!modalVisible);
}
Используйте обновление функционального состояния, чтобы правильно поставить в очередь обновление из массива предыдущей статистики. Неглубоко скопируйте массив предыдущего состояния и добавьте новые данные.
const catSave = () => {
if (catData.length) {
setCatsSelected(catsSelected => {
if (catsSelected.length < 1) {
return catData;
}
return [
...catsSelected,
catData[0],
]
});
}
setModalVisible(modalVisible => !modalVisible);
}
Пропущен тот факт, что .push() возвращает новую длину массива, спасибо за ответ, теперь отлично работает.