В этом задании мы напишем свой фреймворк. Небольшая заготовка уже есть, но она туповата, а мы сделаем ее умной.
-
Давай избавимся от повторяющегося кода. Заведи в конструкторе TodoList обьект
state
, куда положи информацию о задачах. Итерируйся поstate
вrender
. -
Давай оживим добавление новой задачи.
Создай у класса TodoList методы
onAddTask
иonAddInputChange
.Улучши функцию
createElement
: помимо атрибутов и детей она также должна принимать список коллбэков, которые она будет навешивать.Навесь как коллбеки функции
onAddTask
на нажатие кнопки иonAddInputChange
на изменение текста в input.onAddTask
должна добавлять вstate
новое задание, аonAddInputChange
должна добавлять вstate
то, что сейчас написано в input (чтобы потом на это посмотрелonAddTask
) -
Мы научились изменять
state
, но на экране ничего не поменялось :( Давай исправим это. Создай в классеComponent
методupdate
, который мы будем вызывать тогда, когда нам нужно перерендерить компонент. Методupdate
должен вызыватьrender
и изменять DOM-ноду (или контент в DOM-ноде) на новую. -
Сделай так, чтобы у текста выполненных задач был серый цвет. Также реализуй удаление задачи.
-
В нашем компоненте стало сильно много логики. Давай вынесем добавление задачи и элемент списка задач в отдельные компоненты (назвать их можно, например,
AddTask
иTask
). Используй их вrender
компонентаTodoList
так же, как используется самTodoList
.При этом этим компонентам нужно каким-то образом изменять
state
родительского компонента. Давай прокинемonAddTask
в конструктор компонентаAddTask
, а коллбэки удаления задачи и пометки/снятия пометки задачи как выполненной вTask
. -
Давай сделаем защиту от дурака. При первом нажатии на кнопку "Удалить" ее цвет меняется на красный. При втором нажатии задача действительно удаляется. Информацию о том, первое это нажатие или нет, храни в
state
компонентаTask
. -
(*) При перезагрузке страницы все состояние нашего списка должно оставаться сохраненным. Давай хранить его еще и в localStorage, а при загрузке страницы доставать его оттуда.
-
(*) Сейчас при ререндере родителя потеряется state детей. Давай изменим наш фреймворк так, чтобы при изменении
props
state
дочернего компонента оставался.