#reactjs
Вопрос:
Я не знаю, почему я не могу повторить состояние объектов массива в React.
Как я повторяю:
{all.map(item =gt; lt;divgt; {item.anwsers.map(item_2 =gt; lt;h3gt;{item_2.isCorrect amp;amp; item_2.anwser}lt;/h3gt;)} lt;pgt;{item.question}lt;/pgt; lt;/divgt; )}
Как я его заполняю?
useEffect(() =gt; { var seperate = questions[currentQuestion -1]; setAll([...all, seperate]) }, [currentQuestion])
Вот массив всех:
Комментарии:
1. Пожалуйста, покажите свой
all
массив. Может быть, это опечаткаanwsers
вместоanswers
?2. Ваш
all
первый элемент массива-этоundefined
3. да, в этом проблема, но мне интересно, как обойти это, потому что я хочу, чтобы первое значение было равно null, второе должно быть 0
Ответ №1:
добавьте ?
перед элементом, чтобы дождаться эффекта использования. Пример: item?.anwsers.map...
Комментарии:
1. не сработало, также можете ли вы объяснить это ? какое это имеет отношение к эффекту?
2. Процедуры useEffect после установки и обновления в первый раз, а затем после обновления элемента в списке. Таким образом, состояние может быть не готово до первого эффекта использования, что может привести к пустому массиву (потому что, если он был равен нулю,
all
будет возвращена ошибка). Поэтому мы говорим, что если он не определен, просто пропустите его сейчас, и когда произойдет следующая повторная визуализация, он смонтирует ответы. Если это не сработало, проверьте правильность написания ответов. @hegibo23463. Я вижу, спасибо, но проблема не в этом, думал, я чему-то научился
4. пожалуйста. Это также решает проблему, связанную с тем, что первый элемент не определен, поэтому вам может понадобиться, что еще вызывает проблему
5. Спасибо, я исправил это с помощью «если», так что, если не определено, пропускать, а затем показывать вопросы, и это то, чего я точно хотел
Ответ №2:
Вы можете использовать метод filter() для удаления неопределенных элементов
{all.filter(a =gt; a !== undefined).map(item =gt; lt;divgt; {item.anwsers.map(item_2 =gt; item_2.isCorrect amp;amp; lt;h3gt;{ item_2.anwser}lt;/h3gt;)} lt;pgt;{item.question}lt;/pgt; lt;/divgt; )}
Комментарии:
1. Да, спасибо, я сделал что-то подобное с if, но, возможно, это лучший способ сделать это, но я не пробовал
2. Я думаю
filter
, что это сделает его медленнее, так как сначала нужно выполнить итерацию фильтрации массива, а затем выполнить вторую итерацию сопоставления массива по сравнению с помещениемif
внутрьmap
.
Ответ №3:
Простой способ — удалить все ложные значения элементов в вашем массиве:
{all.filter(Boolean).map(item =gt; lt;divgt; {item.anwsers.map(item_2 =gt; lt;h3gt;{item_2.isCorrect amp;amp; item_2.anwser}lt;/h3gt;)} lt;pgt;{item.question}lt;/pgt; lt;/divgt; )}
Таким образом, будут удалены все эти значения:
- пустая строка
- ложный
- 0
- нулевой
- не определено
Примечание. Используйте это решение, если элементами вашего массива являются только массив, объект или нет-ложные значения.