React Frontend
This outline covers the React frontend for the application, including its components, state management, and interaction with the Node.js backend.
Components
The frontend is structured using React components. Components are self-contained units of UI that encapsulate logic, state, and rendering.
Main Components:
- App.js: The root component of the application. It handles the overall application structure, including routing and rendering of other components.
- Source: client/src/App.js
- Home.js: The home page component. It displays a welcome message and links to other pages.
- Source: client/src/Home.js
- Create.js: The page for creating new tasks. It displays a form for entering task details.
- Source: client/src/Create.js
- Task.js: A component representing a single task. It displays the task details and allows for completion.
- Source: client/src/Task.js
- TaskList.js: A component that displays a list of tasks. It retrieves tasks from the backend and renders them using the
Taskcomponent.- Source: client/src/TaskList.js
State Management
The frontend uses React’s built-in state management capabilities for managing data and UI updates.
State Management:
- Component State: Individual components manage their own internal state using the
useStatehook. This is suitable for small, localized changes within a component.- Example: The
Taskcomponent uses state to track whether the task is completed.import React, { useState } from 'react'; function Task(props) { const [isCompleted, setIsCompleted] = useState(props.task.completed); const handleComplete = () => { setIsCompleted(!isCompleted); }; return ( <div> <input type="checkbox" checked={isCompleted} onChange={handleComplete} /> {props.task.name} </div> ); }
- Example: The
- Global State: For shared data across multiple components, a global state management solution can be used. The application currently uses a custom global state implementation.
- Source: client/src/utils/state.js
Backend Interaction
The frontend communicates with the Node.js backend to fetch and update data.
Backend Interaction:
- Fetch API: The frontend uses the built-in
fetchAPI for making HTTP requests to the backend.- Example: The
TaskListcomponent usesfetchto retrieve tasks from the backend.import React, { useState, useEffect } from 'react'; function TaskList() { const [tasks, setTasks] = useState([]); useEffect(() => { const fetchTasks = async () => { const response = await fetch('/api/tasks'); const data = await response.json(); setTasks(data); }; fetchTasks(); }, []); return ( <ul> {tasks.map((task) => ( <li key={task.id}> <Task task={task} /> </li> ))} </ul> ); }
- Example: The
Routing
The frontend utilizes React Router for handling navigation between different pages.
Routing:
- BrowserRouter: The
BrowserRoutercomponent fromreact-router-domis used to enable client-side routing.- Source: client/src/App.js
- Route: The
Routecomponent fromreact-router-domis used to define specific routes and map them to corresponding components.- Source: client/src/App.js
Testing
The frontend utilizes Jest for unit testing.
Testing:
- Jest: Jest is used for writing unit tests to ensure the functionality of individual components.
- Source: client/src/App.test.js
- React Testing Library: The React Testing Library is used to write more user-centric tests that focus on how users interact with the application.
- Source: client/src/App.test.js