Building a to-do list application with React

Building a To-Do List Application with React

Creating a to-do list application is an excellent project for both beginner and intermediate developers looking to sharpen their skills in React. This hands-on guide will take you through the process of building a simple yet efficient to-do list app, covering everything from setting up your development environment to deploying your application for others to use. Let’s dive in!

What is a To-Do List Application?

A to-do list application allows users to create, edit, and delete tasks. It enables individuals to manage their daily activities efficiently. Such applications can be enhanced with features like deadlines, reminders, and categorization, making them versatile tools for productivity.

Use Cases for a To-Do List Application

  • Personal Task Management: Organize daily chores, appointments, and personal goals.
  • Project Management: Keep track of tasks within teams or projects.
  • Learning Goals: Help students manage assignments, study schedules, and deadlines.

Setting Up Your Development Environment

Before we start coding, you need to set up your environment. If you haven’t done so already, install Node.js, which comes with npm (Node Package Manager). Then, create a new React application using Create React App. Open your terminal and run:

npx create-react-app todo-app
cd todo-app
npm start

This command will set up a new React application and start a development server. You should see a default React page in your browser.

Building the To-Do List Application

Project Structure

Let’s first outline the project structure we will create:

/src
  ├── components
  │   ├── TodoList.js
  │   ├── TodoItem.js
  │   └── TodoForm.js
  ├── App.js
  └── index.js

Step 1: Creating the Main App Component

Open App.js and modify it to hold the state of our to-do list. We will manage our to-do items using a state hook.

import React, { useState } from 'react';
import TodoList from './components/TodoList';
import TodoForm from './components/TodoForm';

function App() {
  const [todos, setTodos] = useState([]);

  const addTodo = (todo) => {
    setTodos([...todos, todo]);
  };

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

  return (
    <div className="App">
      <h1>To-Do List Application</h1>
      <TodoForm addTodo={addTodo} />
      <TodoList todos={todos} removeTodo={removeTodo} />
    </div>
  );
}

export default App;

Step 2: Creating the Todo Form Component

Next, create a TodoForm.js component for users to add new tasks.

import React, { useState } from 'react';

const TodoForm = ({ addTodo }) => {
  const [input, setInput] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    if (!input) return;

    addTodo({ id: Math.random(), text: input });
    setInput('');
  };

  return (
    <form onSubmit={handleSubmit}>
      <input 
        type="text" 
        value={input} 
        onChange={(e) => setInput(e.target.value)} 
        placeholder="Add a new task"
      />
      <button type="submit">Add</button>
    </form>
  );
};

export default TodoForm;

Step 3: Creating the Todo List and Todo Item Components

Now, we will create TodoList.js and TodoItem.js to display the list of tasks.

TodoList.js:

import React from 'react';
import TodoItem from './TodoItem';

const TodoList = ({ todos, removeTodo }) => {
  return (
    <ul>
      {todos.map((todo) => (
        <TodoItem key={todo.id} todo={todo} removeTodo={removeTodo} />
      ))}
    </ul>
  );
};

export default TodoList;

TodoItem.js:

import React from 'react';

const TodoItem = ({ todo, removeTodo }) => {
  return (
    <li>
      {todo.text}
      <button onClick={() => removeTodo(todo.id)}>Remove</button>
    </li>
  );
};

export default TodoItem;

Step 4: Styling the Application

You can enhance the user interface by adding some basic CSS styles. Create a styles.css file in the src folder and import it into your index.js.

body {
  font-family: Arial, sans-serif;
}

.App {
  max-width: 500px;
  margin: 0 auto;
  text-align: center;
}

form {
  margin-bottom: 20px;
}

input {
  padding: 10px;
  width: 70%;
}

button {
  padding: 10px;
}

Step 5: Running the Application

After completing the above steps, run your application again using:

npm start

You should see your to-do list application in action. Users can add tasks, and each task can be removed by clicking the "Remove" button.

Troubleshooting Common Issues

  • State Not Updating: Ensure that you're using the state setter function from the useState hook correctly.
  • Rendering Issues: Make sure your components are properly imported and that the props are passed correctly.

Conclusion

Building a to-do list application with React is a rewarding project that showcases the power of state management and component composition. By following these steps, you’ve learned how to manage state, create functional components, and render lists dynamically.

Feel free to expand upon this project by adding features such as editing tasks, marking them as completed, or even integrating a backend to save your tasks. 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.