Ошибка типа: Не удается прочитать свойства неопределенных (чтение «анвсеров»)

#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])  

Вот массив всех:

консоль.журнал

Сообщение об ошибке, которое я получаю: ошибка В react

Комментарии:

1. Пожалуйста, покажите свой all массив. Может быть, это опечатка anwsers вместо answers ?

2. Ваш all первый элемент массива-это undefined

3. да, в этом проблема, но мне интересно, как обойти это, потому что я хочу, чтобы первое значение было равно null, второе должно быть 0

Ответ №1:

добавьте ? перед элементом, чтобы дождаться эффекта использования. Пример: item?.anwsers.map...

Комментарии:

1. не сработало, также можете ли вы объяснить это ? какое это имеет отношение к эффекту?

2. Процедуры useEffect после установки и обновления в первый раз, а затем после обновления элемента в списке. Таким образом, состояние может быть не готово до первого эффекта использования, что может привести к пустому массиву (потому что, если он был равен нулю, all будет возвращена ошибка). Поэтому мы говорим, что если он не определен, просто пропустите его сейчас, и когда произойдет следующая повторная визуализация, он смонтирует ответы. Если это не сработало, проверьте правильность написания ответов. @hegibo2346

3. Я вижу, спасибо, но проблема не в этом, думал, я чему-то научился

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; )}  

Таким образом, будут удалены все эти значения:

  1. пустая строка
  2. ложный
  3. 0
  4. нулевой
  5. не определено

Примечание. Используйте это решение, если элементами вашего массива являются только массив, объект или нет-ложные значения.