Как мне переназначить useState с использования размещения массива на их идентификаторы?

#arrays #reactjs #react-hooks #use-state

#массивы #reactjs #реагирующие крючки #use-state #реагирующие хуки

Вопрос:

Я создал массив ответов для дерева решений и использую useState, чтобы ответы на каждый вопрос приводили вас к другому ответу, используя их размещение в массиве jumpToQuestion . Это было нехорошо, сейчас мне нужно удалить некоторые объекты, и это испортит задания. Я просто ввел идентификаторы для всех из них, но теперь мне нужно перенастроить свой const [currentQuestion, setCurrentquestion] = useState(0) , чтобы он использовал идентификаторы вместо размещения массива.

PS НЕ ВЕСЬ МАССИВ НАХОДИТСЯ ЗДЕСЬ, ВОТ ПОЧЕМУ НЕКОТОРЫЕ ПЕРЕХОДЫ ПРОХОДЯТ МИМО ТОГО, ЧТО ЗДЕСЬ. Я СДЕЛАЛ ЭТО, ЧТОБЫ КОД БЫЛ КОРОТКИМ.

 const responses = [
    {
      id: 1,
      questionText: "Is the account data entry?",
      answerOptions: [
        { answerText: "No", isCorrect: false },
        { answerText: "Yes", isCorrect: true, jumpToQuestion: 6 },
      ],
      notes: [
      ],
    },
    {
      id: 2,
      questionText: "Is this customer 1 or 2?",
      answerOptions: [
        { answerText: "No", isCorrect: false },
        { answerText: "Yes", isCorrect: true, jumpToQuestion: 7 },
      ],
      notes: [
      ],
    },
    {
      id: 3,
      questionText: "Is the caller",
      answerOptions: [
        { answerText: "Power of Attorney/Conservator", isCorrect: true, jumpToQuestion: 15 },
        { answerText: "Lawyer", isCorrect: true, jumpToQuestion: 13 },
        { answerText: "Emergency Responder", isCorrect: true, jumpToQuestion: 14 },
        { answerText: "Wanting to make a payment", isCorrect: true, jumpToQuestion: 14 },
        { answerText: "None", isCorrect: false },
      ],
      notes: [
      ],
    },
    

  const [currentQuestion, setCurrentQuestion] = useState(0);

  const handleAnswerButton = (jumpToQuestion) => {
    const nextQuestion = jumpToQuestion || currentQuestion   1;
    setCurrentQuestion(nextQuestion);
  }


  return (
    <div className="App">
      <div className="appWrapper">
        <div className="headerContainer">
          <div className="alderlogo">
            <img src={Logo} alt="Logo" />
          </div>
          <div class="vl"></div>
          <h1 className="headerName">Verification Procedure</h1>
        </div>

        <button className="backBtn"><i class="fas fa-arrow-left fa-2x"></i></button>

        <h2>{responses[currentQuestion].questionText}</h2>
        <div className="answerSection">
          {responses[currentQuestion].answerOptions.map((answerOption) => (
            <button onClick={() => { handleAnswerButton(answerOption.jumpToQuestion) }}>{answerOption.answerText}</button>
            ))}
        </div>
        <div class="hl"></div>
        <div className="notesContainer">
          {responses[currentQuestion].notes.map((notePoints) => (
            <li>{notePoints.note}</li>
            ))}
          <h3>{responses[currentQuestion].addnotes}</h3>
        </div>
      </div>
    </div>
  );
}
  

Ответ №1:

Вы можете преобразовать responses массив объектов в объект, где каждая пара ключ / значение является идентификатором / ответом. Т.Е. Идентификатор — это ключ, а объект ответа — значение. Оставьте свой хук состояния как есть (т. Е. Сохраняет идентификатор текущего вопроса и по умолчанию задается первый вопрос), а затем вы можете продолжать использовать response[currentQuestion] для получения нужного объекта.

Надеюсь, это поможет и удачи!