🔥

Тред (@jin_nin)


Компонент - это самый обычный класс. В свойствах с Большой буквы лежат вложенные компоненты. Снова этот $mol_mem.. но на этот раз он не просто мемоизирует, но и захватывает владение над объектом. Он жив, пока кому-то нужен, а потом у него автоматически вызовется destructor.
notion image

То же самое можно записать и куда короче. view.tree - не более чем упрощённый синтаксис для описания классов. github.com/nin-jin/slides…
notion image

$mol компонент является плоским классом, а view.tree позволяет объявлять его лаконично и не теряя в наглядности иерархии. Например, тут объявляются 13 методов класса. 2 из них (@) локализуются. 5 владеют вложенными объектами. 10 one-way связываний (<=). И 3 two-way (<=>).
notion image

Теперь этому классу мы можем добавить стилей. Класс компонента - это аналог БЭМ-блока. Имя вложенного компонента - аналог БЭМ-элемента. Можно стилизовать и элементы элемента и тд. Это можно считать фрактальным БЭМ, но от собственно БЭМ тут уже мало что осталось.
notion image

Каждый компонент - это обычный класс, а вложенные компоненты лежат в его свойствах. Это позволяет использовать рефлексию времени компиляции для проверки, что стили вы накладываете на реально существующий вложенный компонент. К сожалению, с TSX такого уровня CSS-in-TS не достичь.
notion image

Ну и, собственно, вот такое не хитрое приложение у нас получилось. При этом мы не написали ни строчки HTML, CSS или JS. Всё компилируется тайпскриптом и проверяется на согласованность.
notion image

Добавим логики. Наследуемся от сгенерированного класса и переопределяем свойство, возвращающее список целей, в котором идём за целями на сервер и мемоизируем результат с помощью $mol_mem. Пока идёт запрос, будет показываться анимация. В случае ошибки - соответствующее сообщение.
notion image

В ответе от сервера может прийти любая балалайка. Поэтому давайте добавим валидацию по схеме. Заодно получим ещё и типизированный ответ, а не any.
notion image