DEV Community

Zamzam Hassan
Zamzam Hassan

Posted on • Updated on • Originally published at dev.to

Todo list app with React

Unlock the full potential of React and take your coding skills to the next level with this tutorial! We'll build a practical and functional todo list app that showcases the incredible capabilities of this popular JavaScript library. You'll learn how to create your own dynamic and interactive UI elements, making your app more user-friendly and efficient.

Goals:

  • Define the TodoList Component: We'll kick off by creating a functional component that defines the TodoList component.

  • Manage State with useState Hook: Next, we'll leverage the power of the useState hook to manage the state in our TodoList component.

  • Design the User Interface with JSX: To create an engaging and stylish user interface, we'll use JSX to define the UI for our TodoList component.

  • Handle Events: We'll implement event handling to add and delete todo items, including form submissions and button clicks.

  • Conditional Rendering: Lastly, we'll use conditional rendering to only display the delete button for a todo item if it exists, making our app more user-friendly and efficient.

Ready to take your React skills to the next level and build a functional and stylish todo list app? Let's get started!

Setup

Let's kick off our React project by opening up your terminal or command prompt. Navigate to the directory where you want to create your new project. Once you're in the desired directory, enter the following command:

npx create-react-app todo-app

Enter fullscreen mode Exit fullscreen mode

Once the project is created, navigate to the project directory using the following command:

cd todo-app

Enter fullscreen mode Exit fullscreen mode

Next, install React and ReactDOM:

npm install react react-dom

Enter fullscreen mode Exit fullscreen mode

They are both essential for creating a React app. React allows you to create reusable UI components, while ReactDOM is responsible for rendering those components into the browser.

Now you can start the development server by running the following command:

npm start

Enter fullscreen mode Exit fullscreen mode

Create a Todo list component


function TodoList () {

  return (
    <div>
      <form>
        <input type="text" />
        <button>Add Todo</button>
      </form>
      <ul>
          <li>
         </li>
      </ul>
    </div>
  );
}

export default TodoList;


Enter fullscreen mode Exit fullscreen mode

Result

Screenshot Todo App

Adding the rest of react features

Add import statement that brings in the React library and the useState hook from the react package at the top most part of your component.

import React, { useState } from 'react';

Enter fullscreen mode Exit fullscreen mode

Add useState hook to create two pieces of state: todos and inputValue. todos is an array that will hold the list of todos, and inputValue is a string that will hold the value of the input field.

const [todos, setTodos] = useState([]);
const [inputValue, setInputValue] = useState('');
Enter fullscreen mode Exit fullscreen mode

Adding Todo List

import React from 'react'
import { useState } from 'react'

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

function handleChange(e){
  setInputValue(e.target.value)
}

function handleSubmit(e){
  e.preventDefault()
  setTodos([...todos, inputValue])
  setInputValue('')
}
  return (
    <div>
      <h1>Todo List</h1>
      <form>
        <input type='text' value={inputValue} onChange={handleChange}/>
        <button onClick={handleSubmit}>Add Todo</button>
      </form>
      <ul>
        {todos.map((todo) => (
          <li key={todo}>{todo}
           <button>Delete</button>
          </li>
        ))}
      </ul>
    </div>
  )
}

export default TodoList

Enter fullscreen mode Exit fullscreen mode

Result

Screenshot Todo App

Let's break down the above codes

This is the JSX that will be rendered to the screen. It consists of a form with an input field and a button for adding todos, an unordered list of todos with a delete button for each, and a heading.

 <div>
      <h1>Todo List</h1>
      <form  onSubmit={handleSubmit}>
        <input type='text' value={inputValue} onChange={handleChange}/>
        <button>Add Todo</button>
      </form>
      <ul>
        {todos.map((todo) => (
          <li key={todo}>{todo}
             <button>Delete</button> 
          </li>
        ))}
      </ul>
    </div>
Enter fullscreen mode Exit fullscreen mode

Inside the form, the value of the input field is set to the inputValue state and the onChange event is set to the handleChange function, which updates the inputValue state every time the input field changes.

      <form  onSubmit={handleSubmit}>
        <input type='text' value={inputValue} onChange={handleChange}/>
        <button>Add Todo</button>
      </form>

Enter fullscreen mode Exit fullscreen mode

Inside the ul, the map method is used to render each todo as an li element with a key set to the index of the todo. Each li element also contains a delete button.

      <ul>
        {todos.map((todo) => (
          <li key={todo}>{todo}
             <button>Delete</button> 
          </li>
        ))}
      </ul>
Enter fullscreen mode Exit fullscreen mode

This is a function that sets the inputValue state to the value of the input field. It's called every time the input field changes.

const handleChange = (e) => {
  setInputValue(e.target.value);
};

Enter fullscreen mode Exit fullscreen mode

This is a function that adds a new todo to the todos state and clears the inputValue state when the form is submitted. It's called when the form is submitted.

const handleSubmit = (e) => {
  e.preventDefault();
  setTodos([...todos, inputValue]);
  setInputValue('');
};

Enter fullscreen mode Exit fullscreen mode

Deleteing Todo List

This is a function that deletes a todo from the todos state. It creates a copy of the todos array using the spread operator, removes the todo at the specified index using the splice method, and sets the todos state to the new array.

const handleDelete = (index) => {
  const newTodos = [...todos];
  newTodos.splice(index, 1);
  setTodos(newTodos);
};




//




   <ul>
        {todos.map((todo, index) => (
          <li key={index}>{todo}
          <button onClick={() =>handleDelete(index)}>Delete</button>
          </li>
        ))}
Enter fullscreen mode Exit fullscreen mode

Result

Screenshot Todo App

This is our final codes put together

import React from 'react'
import { useState } from 'react'

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

function handleChange(e){
  setInputValue(e.target.value)
}

function handleSubmit(e){
  e.preventDefault()
  setTodos([...todos, inputValue])
  setInputValue('')
}

function handleDelete(index){
  const newTodos = [...todos]
  newTodos.splice(index, 1)
  setTodos(newTodos)
}
  return (
    <div>
      <h1>Todo List</h1>
      <form>
        <input type='text' value={inputValue} onChange={handleChange}/>
        <button onClick={handleSubmit}>Add Todo</button>
      </form>
      <ul>
        {todos.map((todo, index) => (
          <li key={index}>{todo}
          <button onClick={() =>handleDelete(index)}>Delete</button>
          </li>
        ))}
      </ul>
    </div>
  )
}

export default TodoList;


Enter fullscreen mode Exit fullscreen mode

Top comments (2)

Collapse
 
newtonombese profile image
Newton Ombese

I love this. It is beginner friendly and amazing work there give it more styling and it will be all ready or you can style it then add a live link to it in the post

Collapse
 
misszamzam profile image
Zamzam Hassan

Thank you for the feeding back,working on styling