Рассмотрим, как с нуля создать приложение Todo (список дел) с помощью React, библиотеки JavaScript для разработки пользовательских интерфейсов, используя синтаксис ES6 и хуки React. Это будет базовое приложение с полем для ввода элемента Todo и кнопкой рядом с каждым элементом, предназначенной для его удаления.

Кроме того, мы будем использовать хук useState из React для сохранения состояния приложения и некоторые продвинутые функции JavaScript, такие как map(), массив spread, ternary operator и метод filter(). Цель этого руководства  —  помочь новичкам начать работу с React.

Демонстрация приложения Todo

Полный код проекта можно найти здесь.

Необходимые условия

Установите следующие программы.

Установка

Для начала создадим новое приложение React с помощью инструмента командной строки create-react-app. Мы создадим новый каталог, а затем  —  приложение React внутри него. Для выполнения задачи можно использовать следующие команды:

1 $ mkdir react-todo-app
2 $ cd react-todo-app
3 $ create-react-app ./

Чтобы начать работу с нуля, удалим все из папки src, кроме файлов App.js и index.js. Внутри App.js удалите все, кроме родительского заголовка, и добавьте к нему h1-элемент (<h1> React Todo App </h1>). Чтобы увидеть приложение в действии, запустите команду npm start в окне терминала в корне проекта.

Этот коммит на GitHub показывает изменения до настоящего момента.

CSS и стиль

Мы создали простое приложение, содержащее только один элемент h1. Прежде чем двигаться дальше, добавим в него несколько основных стилей. Создайте файл App.css в каталоге src и импортируйте его в файл App.js. Добавьте стили из этой ссылки в файл App.css.

Можете сравнить свой проект с этим коммитом на GitHub.

Создание начального макета

Начнем с простого макета, содержащего поле input и button для добавления нового элемента Todo. В файле App.js создайте новый div с классом input-wrapper внутри родительского div.

Создание начального пользовательского интерфейса приложения

Создание и отображение элементов Todo

1. Создание нового элемента Todo

Чтобы отслеживать состояние внутри компонента React, мы будем использовать хук useState. Он принимает начальное значение состояния и возвращает массив с двумя значениями:

  • функция getter, которая отображает текущее значение определенного состояния;
  • функция setter, обновляющая состояние.

Мы будем использовать useState в этом приложении для отслеживания каждого нового элемента Todo и списка Todo. Но сначала мы импортируем хук useState в файл App.js следующим образом:

import { useState } from "react";

Для начала создадим состояние todo (функция getter) со значением undefined и метод setTodo (функция setter) для установки значения текущего элемента todo.

const [todo, setTodo] = useState("");

Поля ввода снабжены обработчиком событий onChange, который срабатывает каждый раз, когда значение поля изменяется. Этот обработчик событий предоставляет не само значение, а объект event, который можно использовать для получения значения с помощью event.target.value.

Setter-функция setTodo будет присоединена к обработчику событий onChange, который передает значение входа в setter-функцию через event.target.value. Значение из входа впоследствии используется методом setter для обновления состояния todo.

Создание нового элемента Todo

Проект можно сравнить с этим коммитом на Github.

2. Добавление элемента Todo в список

После создания нового Todo нужно добавить его в список. Мы будем действовать так же, как и при создании нового элемента Todo. Нам нужно создать новый хук useState для отслеживания состояния массива Todos и добавить в него новые элементы.

const [todos, setTodos] = useState([]);

Далее создадим onClick-функцию addTodo для добавления элемента todo в массив Todos. Эта функция будет срабатывать при нажатии на кнопку Add.

Важно помнить, что состояние не должно изменяться напрямую. Поэтому необходимо сделать копию массива Todos, прежде чем добавлять в него элементы todo. Чтобы скопировать массив Todos и добавить в него элемент todo, воспользуемся оператором массивов spread.

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

При добавлении нового элемента Todo в список нужно убедиться в том, что значение не будет пустым . Это можно сделать с помощью оператора if в функции addTodo, который проверяет наличие пустого значения. После того, как значение входа добавляется в список Todos, нужно очистить поле ввода.

Функция addTodo для добавления элемента Todo в список Todos

Наконец, мы передаем эту функцию в обработчик onClick кнопки Add.

<button className="add-button" onClick={addTodo}>

Этот коммит на GitHub отражает полный код до настоящего момента.

3. Отображение элементов Todo

Мы создадим ul с классом todo-list для отображения записей из списка Todos. Будем перебирать элементы в массиве методом map() и затем отображать их как li в элементе ul. Вызовем метод map() с двумя аргументами: значением текущего обрабатываемого элемента в массиве и его индексом. В данном случае index будет использоваться в качестве ключа li.

Для каждого элемента списка Todos создадим новый div с классом todo. Этот div будет содержать элемент li и кнопку delete для его удаления.

Отображение элементов todo

Прежде чем отображать список, нужно убедиться в том, что он не пуст. Для отображения элементов списка будет использоваться тернарный оператор. Если список окажется пустым, мы получим соответствующее сообщение.

Условное отображение элементов Todo

Проект на данном этапе можно сверить с этим коммитом на GitHub.

Удаление элементов Todo

Начнем с создания функции onClick, которая срабатывает при нажатии на кнопку удаления. В этой функции удаления будет использоваться метод filter(), который создает новый массив со всеми записями, удовлетворяющими заданным критериям. В данном примере мы создадим новый массив Todos, содержащий все элементы, кроме удаляемого. В конце нужно будет обновить состояние с помощью вновь созданных Todos.

Удаление элемента todo

Передаем метод deleteTodo в обработчик onClick кнопки delete.

Добавляем функцию deleteTodo в обработчик onClick

С кодом до этого момента можно свериться здесь.

Рефакторинг кода

Чтобы собирать введенные данные и показывать элементы Todos, можно перестроить приложение, создав два независимых компонента  —  TodoInput и TodoList. В каталоге src создайте два файла: TodoInput.js и TodoList.js. Наполните каждый из них содержимым, указанным в приведенных ниже фрагментах кода:

Компонент TodoInput
Компонент TodoList

Затем импортируйте эти два компонента в App.js:

Импорт компонентов в App.js

Ознакомившись с основами, вы можете начать создавать свое первое приложение на React.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Muhammad Yahya: React Todo App Tutorial

Предыдущая статьяКак создать аналитический сайт на Python с нуля
Следующая статьяКлассическая игра “Пинг-понг” на Java