Напиши приложение хранения контактов телефонной книги.
Приложение должно состоять из формы и списка контактов. На текущем шаге реализуй добавление имени контакта и отображение списка контактов. Приложение не должно сохранять контакты между разными сессиями (обновление страницы).
Состояние хранящееся в родительском компоненте <App>
обязательно должно быть
следующего вида, добавлять новые свойства нельзя.
state = {
contacts: [],
name: ''
}
Каждый контакт должен быть объектом со свойствами name
и id
. Для генерации
идентификаторов используй любой подходящий пакет, например
uuid. После завершения этого
шага, приложение должно выглядеть примерно так.
Расширь функционал приложения, позволив пользователям добавлять номера телефонов. Для этого добавь второй инпут в форму, и свойство для хранения его значения в состоянии.
state = {
contacts: [],
name: '',
number: ''
}
После завершения этого шага, приложение должно выглядеть примерно так.
Добавь поле поиска, которое можно использовать для фильтрации списка контактов по имени.
- Поле поиска это инпут без формы, значение которого записывается в состояние (контролируемый элемент).
- Логика фильтрации должна быть нечувствительна к регистру.
- Поле поиска ренерится только если есть 2 и более сохраненных контактов.
state = {
contacts: [],
filter: '',
name: '',
number: ''
}
Когда мы работаем над новым функционалом, бывает удобно жестко закодировать некоторые данные в состояние. Это избавит от необходимости вручную вводить данные в интерфейсе для тестирования работы нового функционала. Например можно использовать такое начальное состояние.
state = {
contacts: [
{id: 'id-1', name: 'Rosie Simpson', number: '459-12-56'},
{id: 'id-2', name: 'Hermione Kline', number: '443-89-12'},
{id: 'id-3', name: 'Eden Clements', number: '645-17-79'},
{id: 'id-4', name: 'Annie Copeland', number: '227-91-26'},
],
filter: '',
name: '',
number: ''
}
Если твое приложение реализовано в одном компоненте <App>
, выполни
рефакторинг, выделив подходящие части в отдельные компоненты. В состоянии
корневого компонента <App>
останутся только свойства contacts
и filter
.
state = {
contacts: [],
filter: ''
}
Достаточно выделить четыре компонента: форма добавления контактов, список контактов, элемент списка контактов и фильтр поиска.
После рефакторинга корневой компонент приложения будет выглядеть так.
<div>
<h1>Phonebook</h1>
<ContactForm ... />
<h2>Contacts</h2>
<Filter ... />
<ContactList ... />
</div>
Запрети пользователю возможность добавлять контакты, имена которых уже есть в
телефонной книге. При попытке выполнить такое действие выведи alert
с
предупреждением.
Расширь функционал приложения, позволив пользователю удалять ранее сохраненные контакты.