Пишем приложение со списком дел при помощи React Hooks
38К открытий40К показов
React Hooks — это функции, которые позволяют определять категорию состояния и жизненный цикл (state, lifecycle) React-компонента без использования ES6-классов.
Некоторые преимущества React Hooks:
- изолированная логика упрощает последующие тесты;
- при распределении логики не понадобится использование render props или «компонентов высшего порядка»;
- разделение функциональности приложения основано на логике, а не на жизненном цикле;
- React Hooks — достойная замена ES6-классов, с которыми порой возникают проблемы даже у опытных программистов.
Для демонстрации возможностей React Hooks построим приложение, в котором можно добавлять и удалять задачи (ToDo-приложение).
Это приложение будет выполнять следующие функции:
- отображать ваши текущие задачи;
- позволять добавлять новые задачи через поле ввода;
- удалять задачи.
Установка
Весь код доступен на GitHub и CodeSandbox.
Ветка master
— уже готовый проект. Если вы хотите создавать приложение поэтапно, следуя статье, используйте ветку start
.
Для запуска проекта используйте следующую команду:
Приложение должно запуститься на localhost:3000
. Вы увидите пустой начальный интерфейс с названием приложения. Весь дизайн уже настроен при помощи библиотеки material-ui, так что можно сразу добавлять функциональность.
Todo-форма
Создайте новый файл src/TodoForm.js
и добавьте в него следующий код:
Как можно понять из названия формы, здесь главная задача — добавить что-либо в состояние React-компонента. Вот и первый hook.
useState
Теперь давайте рассмотрим такой код:
Это функция, которая принимает начальное состояние React-компонента и возвращает массив. Вы можете использовать console.log
, чтобы посмотреть, что именно она возвращает.
Под первым индексом массива находится текущее значение состояния компонента, а во второй ячейке находится обновляющая функция. Они названы value
и setValue
, следуя ES6 destructuring assignment.
useState с формами
Ваша форма должна отслеживать значение, вводимое пользователем и вызывать метод saveTodo()
при отправке формы. useState
поможет вам с этим.
Добавьте изменения в TodoForm.js
, они выделены жирным шрифтом:
В index.js
импортируйте форму:
Теперь введённое значение логируется при подтверждении (нажатии на Enter).
useState с Todos
Вам также нужно состояние компонента. Импортируйте useState
в index.js
. Начальное состояние компонента должно быть пустым массивом.
Компонент TodoList
Для начала создайте новый файл src/TodoList.js
.
Большая часть кода — это компоненты из Material-UI. Самые важные части выделены жирным шрифтом.
Чтобы всё работало корректно, требуется:
todos
— массив всех ваших задач. При помощи методаmap()
вы сопоставляете каждую из них и создаёте элемент списка;deleteTodo()
— функция вызывается при нажатии наIconButton
и передает индекс, который однозначно идентифицирует пункт списка.
Импортируйте этот компонент в ваш файл index.js
.
И используйте в App-функции:
Добавление новых задач
В index.js
добавляем метод SaveTodo()
в todo-форму.
Проще всего объединить уже существующие задачи с новой. Дополнительные пробелы будут вырезаны.
Очистка поля ввода
Заметьте, что на данном этапе после добавления новой задачи поле ввода не очищено, и это не очень-то хорошо. Исправить это можно внеся маленькое изменение в TodoForm.js
.
Теперь, как только todo будет сохранён, состояние формы преобразуется в пустую строку:
Удаление задач
Так как TodoList содержит индексы всех задач, можно без проблем найти нужный элемент для удаления.
Теперь примените в index.js
.
Если задача с соответствующим index
не найдена, остальные задачи останутся в состоянии формы благодаря использованию setTodos()
.
Извлечение useState из компонента Todos
В начале статьи упоминалось, что React Hooks хорошо подходят для разделения состояния и логики компонента. И вот как это могло бы выглядеть в вашем приложении.
Создайте новый файл src/useTodoState.js
.
По сути это тот же самый код, что и в index.js
, но теперь управление состоянием не так плотно связано с компонентом.
Осталось только всё импортировать. Новый код выделен жирным шрифтом.
Абстракция useState в форме ввода
То же самое можно сделать с формой.
Создайте новый файл src/useInputState.js
.
Сейчас TodoForm.js
должен выглядеть так:
В данной статье мы рассмотрели создание ToDo-приложения с помощью React Hooks. Если вы любите React и хотите узнать о нём больше, обратите внимание на нашу статью:
38К открытий40К показов