TypeScript is an open-source programming language, developed and maintained by Microsoft. It is a strongly typed language that builds on javascript. It is usually used in large-scale projects. It follows javascript syntax and adds more features to it.
ReactJS is an open-source Javascript library specially used to design UI(user interfaces) majorly single-page applications. Having a large developer community it is widely used for making single-page applications.
A simple Quiz App that contains a set of curated questions and their answers and checks for the correctness of the answer given by the user. It navigates through the questions using dynamic programming. A quiz can be used as a method of assessment in education and other similar fields to measure knowledge or skills.
In this article, we will learn how to build a quiz app using ReactJS and Typescript.
Modules required:
- npm
- React
- React Bootstrap
- Typescript
Basic Setup:
Step 1: Run the following commands to create a new React project using the create-react-app package:
npx create-react-app quiz-app --template typescript
Step 2: Change the directory to the project root directory:
cd quiz-app
Step 3: Change directory to src:
cd src
Step 4: Delete everything inside the directory
rm *
Step 5: Now will create a components directory in the src folder and Question.tsx and Quiz.tsx files in it.
mkdir components && cd components && touch Question.tsx touch Quiz.tsx
Step 6: Now we will go to the src directory using these commands:
cd ..
Step 7: The src directory will create an index.tsx, App.tsx, and index.css using the following commands:
touch index.tsx && touch index.css && touch App.tsx
Project Structure: The project structure will be as follows:
Start the server using the following command:
npm start
Example 1:
- src/index.tsx file:
Javascript
import React from 'react' ; import ReactDOM from 'react-dom/client' ; import './index.css' ; import App from './App' ; const root = ReactDOM.createRoot( document.getElementById( 'root' ) as HTMLElement ); root.render( <React.StrictMode> <App /> </React.StrictMode> ); |
- src/components/Question.tsx: This component will be responsible for displaying each question.
Javascript
import React from 'react' ; interface Props { question: string; choices: string[]; answer: string; onAnswer: (answer: string) => void; } const Question: React.FC<Props> = ( { question, choices, answer, onAnswer }) => { return ( <div className= "d-flex justify-content-center align-center text-center flex-column" > <h2 className= "" >{question}</h2> <div className= "" > {choices.map((choice) => ( <button className= "btn btn-success m-2" onClick={() => onAnswer(choice)}> {choice}</button> ))} </div> </div> ); }; export default Question; |
- src/components/Quiz.tsx: This file will be the component responsible for managing the quiz and displaying the questions.
Javascript
import React, { useState } from 'react' ; import Question from './Question' ; const questions = [ { question: 'What is the capital of France?' , choices: [ 'Paris' , 'London' , 'New York' ], answer: 'Paris' , }, { question: 'What is the largest planet in our solar system?' , choices: [ 'Mars' , 'Jupiter' , 'Venus' ], answer: 'Jupiter' , }, { question: 'What is the boiling point of water?' , choices: [ '100°C' , '0°C' , '50°C' ], answer: '100°C' , }, { question: 'What is the largest planet in our solar system?' , choices: [ 'Mars' , 'Jupiter' , 'Venus' ], answer: 'Jupiter' , }, { question: 'What is the boiling point of water?' , choices: [ '100°C' , '0°C' , '50°C' ], answer: '100°C' , }, ]; const Quiz: React.FC = () => { const [currentQuestion, setCurrentQuestion] = useState(0); const [score, setScore] = useState(0); const handleAnswer = (answer: string) => { if (answer === questions[currentQuestion].answer) { setScore(score + 1); } const nextQuestion = currentQuestion + 1; if (nextQuestion < questions.length) { setCurrentQuestion(nextQuestion); } else { alert(`Quiz finished. You scored ${score}/${questions.length}`); } }; return ( <div> <h1 className= "text-center" >Quiz App</h1> {currentQuestion < questions.length ? ( <Question question={questions[currentQuestion].question} choices={questions[currentQuestion].choices} answer={questions[currentQuestion].answer} onAnswer={handleAnswer} /> ) : "null" } </div> ) } export default Quiz; |
- src/App.tsx: As we are done with implementing all the components in the project, let us now import them into the App.tsx to see them in action.
Javascript
import Quiz from "./components/Quiz" ; import 'bootstrap/dist/css/bootstrap.min.css' ; function App() { return ( <div className= "container my-5" > <Quiz /> </div> ); } export default App; |
Output: