Building a simple to-do application with React

Building a Simple To-Do Application with React

In today's fast-paced world, managing tasks efficiently is crucial. A to-do application serves as a fundamental tool for keeping track of tasks, ensuring productivity, and achieving goals. In this article, we will guide you through building a simple yet effective to-do application using React. This project not only strengthens your React skills but also provides a practical use case for understanding state management and component structure.

Why Use React for a To-Do Application?

React is a popular JavaScript library for building user interfaces. Its component-based architecture allows developers to create reusable UI components, making it an ideal choice for applications like to-do lists. Here are some advantages of using React:

  • Component Reusability: Build once, use anywhere. You can create components that can be reused across your application.
  • Virtual DOM: React optimizes rendering by updating only the parts of the UI that change, resulting in better performance.
  • Strong Community and Ecosystem: React has a vast library of tools and resources that can aid in development.

Setting Up Your Environment

Before we dive into coding, ensure you have Node.js and npm (Node Package Manager) installed on your machine. These tools will help you set up your React application and manage dependencies.

Step 1: Create Your React Application

To create a new React application, open your terminal and run the following command:

npx create-react-app todo-app

This command sets up a new React project named todo-app. Once the setup is complete, navigate to the project folder:

cd todo-app

Step 2: Start Your Development Server

Now that your application is created, you can start the development server:

npm start

Your new React app will open in your default web browser, usually at http://localhost:3000.

Building the To-Do Application

Step 3: Structuring Your Application

Let's start by organizing our application. In the src folder, create a new folder called components. Inside this folder, create two files: TodoList.js and TodoItem.js.

Step 4: Creating the TodoItem Component

The TodoItem component will represent a single task. Here’s how you can implement it:

// src/components/TodoItem.js
import React from 'react';

const TodoItem = ({ todo, onDelete }) => {
    return (
        <div className="todo-item">
            <span>{todo.text}</span>
            <button onClick={() => onDelete(todo.id)}>Delete</button>
        </div>
    );
};

export default TodoItem;

Step 5: Creating the TodoList Component

The TodoList component will manage the list of tasks and handle adding and deleting tasks. Here’s the implementation:

// src/components/TodoList.js
import React, { useState } from 'react';
import TodoItem from './TodoItem';

const TodoList = () => {
    const [todos, setTodos] = useState([]);
    const [inputValue, setInputValue] = useState('');

    const addTodo = () => {
        if (inputValue.trim() === '') return;
        const newTodo = {
            id: Date.now(),
            text: inputValue,
        };
        setTodos([...todos, newTodo]);
        setInputValue('');
    };

    const deleteTodo = (id) => {
        const updatedTodos = todos.filter(todo => todo.id !== id);
        setTodos(updatedTodos);
    };

    return (
        <div>
            <h1>My To-Do List</h1>
            <input 
                type="text" 
                value={inputValue} 
                onChange={(e) => setInputValue(e.target.value)} 
                placeholder="Add a new task" 
            />
            <button onClick={addTodo}>Add</button>
            <div>
                {todos.map(todo => (
                    <TodoItem key={todo.id} todo={todo} onDelete={deleteTodo} />
                ))}
            </div>
        </div>
    );
};

export default TodoList;

Step 6: Integrating TodoList into App Component

Now, let’s integrate the TodoList component into our main App.js file. Here’s how:

// src/App.js
import React from 'react';
import TodoList from './components/TodoList';

const App = () => {
    return (
        <div className="app">
            <TodoList />
        </div>
    );
};

export default App;

Step 7: Styling Your Application

You can add some basic styles in src/App.css to enhance the appearance of your application:

.app {
    max-width: 600px;
    margin: 0 auto;
    text-align: center;
}

.todo-item {
    display: flex;
    justify-content: space-between;
    padding: 10px;
    border: 1px solid #ccc;
    margin: 5px 0;
}

input {
    padding: 10px;
    margin-right: 5px;
}

button {
    padding: 10px;
}

Step 8: Testing Your Application

With everything in place, you can now test your application. Try adding and deleting tasks to see how it functions. This simple to-do application allows you to grasp the basics of state management in React.

Troubleshooting Common Issues

While developing your to-do application, you might encounter a few common issues:

  • State Not Updating: Ensure you correctly set the state using the state updater function from the useState hook.
  • Missing Key Prop: React requires a unique key prop for each component in a list to optimize rendering. Ensure you provide a unique key when mapping over your tasks.

Conclusion

Building a simple to-do application with React is an excellent way to familiarize yourself with React's component-based architecture and state management. This project lays a strong foundation for more complex applications and helps you understand core concepts that you can apply in future projects. Experiment with adding features like editing tasks, marking them as complete, or even saving them to local storage. Happy coding!

SR
Syed
Rizwan

About the Author

Syed Rizwan is a Machine Learning Engineer with 5 years of experience in AI, IoT, and Industrial Automation.