Не может получить доступ к индексу массива в состоянии ReactJS

Я получаю некоторую информацию из викторины и устанавливаю свое состояние соответственно.

componentDidMount(){
axios.get('https://opentdb.com/api.php?amount=50').then( response =>{
for(var key in response.data.results){
this.setState( prevState => ({
    questions: [...prevState.questions, response.data.results[key].question],
    answers: [...prevState.answers, response.data.results[key].correct_answer],
    wrongAnswers: [...prevState.wrongAnswers, response.data.results[key].incorrect_answers]

 }));    
}
 });
}

ПРИМЕЧАНИЕ: вопросы - это строка, и поэтому - ответ, однако неверный ответ - это массив.

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

console.info(this.state.wrongAnswers[this.state.random]);

первый рендеринг я получаю undefined, но с тех пор каждый раз, когда пользовательский интерфейс обновляется, я получаю правильный массив, если я помещаю это в свой код jsx, массив также отображается, как и должен.

Однако я хочу сопоставить неправильные ответы с такими переключателями

               {this.state.wrongAnswers[this.state.random].map((wrongAnswer, index) => {
  <p key = {'Key-'+index}>{wrongAnswer}</p>
      })}
     <form action = "">
     <input type = "radio" name = "gender" value = {wrongAnswer} /> 
   Male<br/>
     <input type = "radio" name = "gender" value = {wrongAnswer}/> 
   Female<br/>
     <input type = "radio" name = "gender" value = {wrongAnswer}/> 
   Other<br/>
     </form>

Вам нужно скомпоновать все объекты, которые вы хотите в вашем состоянии, а затем один раз вызвать setState. (setState является асинхронным, вызов его 50 раз, как это, обязательно даст некоторые неожиданные результаты)

Chris G 01.12.2018 15:22

Почему вы снова задаете тот же вопрос? Это уже решает вашу проблему stackoverflow.com/questions/53571215/…

Hemadri Dasari 01.12.2018 15:56

@HemadriDasari Первое решение улучшило код, но не решило Проблема, которую я до сих пор не определил

Dedi 01.12.2018 16:06

Если первое решение не сработало, вы должны прокомментировать и объяснить тому, кто ответил на ваш вопрос о проблеме, а не публиковать как отдельный вопрос. Также, если ответ не помог решить проблему, не принимайте его как подтвержденный ответ.

Hemadri Dasari 01.12.2018 16:39

Возможный дубликат Доступ к элементам вложенного массива в javascript

Hemadri Dasari 01.12.2018 16:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
1 297
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде всего, я бы посоветовал вам сначала объединить ваше состояние, а затем один раз вызвать setState (). Представьте, что если у вас сумма = 50, ваше приложение обновится 50 раз, прежде чем будет показан окончательный результат.

Второй совет - поставить условие перед рендерингом данных из вашего состояния, чтобы гарантировать, что список вашего состояния не будет неопределенным во время рендеринга.

class Component React.Component {
  state= {
    random: someValue,
    questions: [],
    answers: [],
    wrongAnswers: []
  }

  componentDidMount() {
    // Your api logic
    // merge and prepare new state object before calling this.setState() !!
    const newObject = mergeLogic();
    // then setState to execute update just once
    this.setState({wrongAnswers: newObject})
  }

  render() {
    const {random, wrongAnswers } = this.state;

    return (
      {wrongAnswers && wrongAnswers[random].map((wrongAnswer, index) => {
        <p key = {'Key-'+index}>{wrongAnswer}</p>
      })}

     // your other code...
    );
  }
}

Значит, я должен сохранить всю свою логику в объекте перед установкой состояния?

Dedi 01.12.2018 15:26

Я бы посоветовал вам это сделать. Приведенный выше код - это просто демонстрация, я вижу, что у вас тоже есть массивы answers и questions, но писать код с мобильного телефона не весело ...: D

sbqq 01.12.2018 15:27

Просто не забывайте, что количество обновлений должно быть как можно меньше.

sbqq 01.12.2018 15:28

Большое тебе спасибо! отлично!

Dedi 01.12.2018 15:33

рад помочь. Удачи!

sbqq 01.12.2018 15:35

Другие вопросы по теме