MZ
Size: a a a
MZ
RM
as
MZ
as
D
RM
D
RM
OS
Первый:
При первом приближении - плохо.
Смешан императивный и декларативный подходы, реализовано через модель MobX (без него работать не будет совсем, а мы от MobX избавляемся). Также, MobX используется неправильно, о чем даже сообщает консоль (необходимо записывать значения через action()-функции). Совершенно странный метод получения позиции курсора.
----
Второй:
Видно, что была проделана большая работа. Получилась сложная штука со своими проблемами.
Проигнорированы важные ошибки, описанные прямо в консоли и редакторе:
- Mobx предупреждает в консоли о некорректном использовании observable значений в асинхронных функциях
- Линтер жалуется на accessor в InputModel, нужно было подправить tsconfig
- useUnmount некорректно использует useEffect, об этом предупреждает линтер.
- import styled-components просит догрузить типы
Выбран сложный подход к управлению состоянием. Можно допустить, что mobx является строгой необходимостью (хотя усложнения конечно стоит избегать при любой возможности). Нужно учитывать, что теперь мы работаем с observable и пытаемся подружить его с жизненным циклом react. Нужно быть очень осторожным, чтобы сделать такой код понятным. Например, объяснять каждый случай использования setTimeout.
Главная проблема в количестве состояний. Возможно в таком количестве переменных возникла путаница и при разработке, например, добавлен focus, но внутри используется elementIsActive. Представляю как трудно было все согласовать.
Заявленные функции можно реализовать с помощью двух useState (value и cursorPosition) и одного или двух ref. Остальные состояния являются производными, т.е. их можно вычислять и мемоизировать внутри рендера.
Вычисление ширин букв можно переложить на браузер (с помощью работы с рефом текста или рендерить каждую букву в своем span, определяя на какую кликнули).
Спасибо за попытку. Но мы бы хотели большего внимания к деталям и управления неотъемлемой сложностью :)
RM
OS
w
RM
OS
OS
RM
RM
OS
Т🧔