Kontynuujemy mini-projekcik czyli quizowa Apka w biblioteczce React. Kontynuacja lekcji poprzednich – do dzieła.

Ok, po pierwsze utworzymy plik questions.js i tam robimy returna z tablicą (robiliśmy już coś podobnego w projekcie framework MVC w PHP):

export default [
    {
      id: 'q1',
      text: 'What is 2 + 2 = ?',
      answers: [
        '2',
        '4',
        '6',
        '8',
      ],
      correctIndex: 1
    },
    {
        id: 'q2',
        text: 'What is 2 x 2 = ?',
        answers: [
          '2',
          '4',
          '6',
          '8',
        ],
        correctIndex: 1
      },
      {
        id: 'q1',
        text: 'What is 2 + 2 x 2 = ?',
        answers: [
          '2',
          '4',
          '6',
          '8',
        ],
        correctIndex: 3
      },
  ];

Komponent RFC Question będzie bardzo prosty (plus jak to importujemy tutaj jest pokazane):

import QUESTIONS from './questions.js';
function Question({index}){
    return (
        <>
        <h2>{QUESTIONS[index].text}</h2>
        </>
    )
};

export {Question};

Ok, importy w Quiz RFC:

import QUESTIONS from './questions.js';
import { useState} from 'react';
import { Question } from './Question.js';

Komponent pomocniczy, którego eksportować nie będziemy:

function SimpleSummary({idx, len}){
    return (
        <>
        <p>Question {idx + 1} / {len}</p>
        </>
    )
}

Teraz początek komponentu Quiz, który będzie miał własny stan:

function Quiz({setMode, name, score, setScore}){

    const [userAnswers, setUserAnswers] = useState([]);

    const activeQuestionIndex = userAnswers.length;
    const quizIsComplete = activeQuestionIndex === QUESTIONS.length;

    function handleClick(){
            setScore(score => score + 1);
            setUserAnswers((arr) => [...arr, 1]);
    }

I teraz JSX, jeżeli wiemy, jak działają operatory logiczne to ten kod będzie dla nas piękny, jak nie, to szpetny, ale polecam rozgryźć go:

 return (
        <>
        <p>Your name: {name}</p>
        <p>Your score: {score}</p>
        {quizIsComplete || <Question index={activeQuestionIndex} /> }
        {quizIsComplete || <SimpleSummary idx={activeQuestionIndex} len={QUESTIONS.length}/>}
        {quizIsComplete || <button onClick={handleClick}>Answer</button> }
        {quizIsComplete && <button onClick={() => setMode('finish')}>Finish</button>}
       
        </>
    )
};

export {Quiz};

Polecam rozgryźć metodą prób i błędów jak to działa, na razie tak mi się napisało. Musimy rozumieć operatory logiczne i renderowanie w ten sposób.

Jasne, jest taka biblioteczka (chyba nawet więcej niż 1) jak React Control Structures. To zresztą bardzo typowe – ściągnij biblioteczkę dla osób, które nie wiedzą, jak działa short circuit evaluation (co się można w 5 minut jeśli nie 50 sekund nauczyć) ale chcą mieć control structures. Tak samo z typowanymi propsami dla Reacta bez TSa…

Ok, na razie to tyle. Potem pewnie zmienimy to i owo, ale fajnie wyszedł przykład z short circuitem i chciałem to opisać, pokazać, bo w sumie nie wiemy, ile z tego zostanie, a jest to ważna rzecz.