Pull to refresh

Comments 17

У меня в 3 проектах 29 форм. Самая крутая 52 поля (без учета полей в вызываемых диалогах). Я относительно просто решил аналогичные проблемы. Сделал код объектно-ориентированным (redux-free-zone): форма — объект, контрол (поле) — объект. Контролы и формы генерят команды. Обработчики команд в подгружаемых скриптах на ванильном js. Валидация аналогично. Скрытие аналогично. Все летает. Формы делаются на питоне, реакторную часть месяцами не трогаю.
А пример можно где-нибудь глянуть? Или ссылку на ресурсы, где описан такой подход.
Просто используйте mobx. Эта очень крутая штука по управлению зависимостями между данными и позволяет точечно перерисовывать только то, что реально изменилось. Redux можете выкинуть на свалку.

Давно не слежу. А есть для mobx либа/фреймворк для форм приличный?

Final-form имеет, по сути, свой реактивный (?) стейт-менеджер. насколько оправдано интегрировать его с mobx?

Нормально вроде уживаются вместе. Главное на забывать что в методе render компонента Form наблюдаемые значения не будут видны.
Необходимо дополнительно оборачивать кусок разметки, нуждающийся в каком-то наблюдаемом значении, в observer (nesting-caveat).
Использую react-bootstrap. На них сделаны часто используемые самописные компоненты, типа поля ввода у которого есть лейбл и подсвечивается ошибка валидации под компонентом. Реакт используется чисто как рисовалка, состояние же хранится в самописных классах использующих mobX, и в этих самописных классах реализованы все нужные валидации. В целом благодаря mobX все эти велосипеды пишутся очень легко, тут даже ничего стороннего тащить в проект не надо.
Но самое важное в mobx, что логику можно пытаться писать в декларативном виде. Т.е. не как обычно принято, что можно назвать событийное программирование, когда например пишем обработчик обработки события изменения текста в поле ввода, и в этом обработчике вызываем десяток функций которые что-то вычисляют и меняют в других полях, в итоге получается лапша. А более декларативно, например что данное поле на форме является функцией вот этих трех полей. И если значение любого их этих трех полей поменяется, то перевычислится и значение данного поля. Причем не важно как оно поменяется, пользователь поменяет, или оно само зависит от 4го поля.
Вижу слова Redux, Redux-From, Final-Form, Formik это прямо комбо, сборище самого ущербного и бестолкового мусора… Неужели всё так туго и по сторонам смотреть не хотим? Redux головного мозга до сих пор по инерции никак не отпускает людей.
С MobX же любые вопросы в том числе и этот элементарно на раз два и никаких проблем с производительность вне зависимости от того, какой размер формы.
Основная проблема заключается в том, что при вводе каждой буквы в соответствующих полях вся форма будет перерисовываться, что влечет за собой проблемы с производительностью, особенно на мобильных устройствах.

Вы серьезно? Знаете что я делаю когда мне нужно отобразить сложные формы как в вашем случае когда у нас "в общей сложности более 80 разных полей"?
Я не использую никакие стейт-менеджеры или библиотеки для форм я просто использую обычный реакт и в каждом обработчике поля onChange пишу примерно такое


<input onChange={(e)=>{
   AppState.form.someField = e.target.value;
   //валидация или другая логика
   actualize() //однострочный хелпер который вызывает ReactDOM.render(<App/>, el)
}}/>

Увидев вызов ReactDOM.render(<App/>), вы наверное подумаете "о боги, это же перерисовка всего приложения при вводе каждой буквы!". Поэтому позвольте мне напомнить что такое "перерисовка" в терминах реакта. В реакте "перерисовка" это просто рекурсивное сравнение двух деревьев js-объектов чтобы изменить в html/dom только то что отличается. Сравнение очень быстрое — никаких медленных обращений к дом-элементам, алгоритм линейный (просто спуск по дереву объектов и сравнение свойств с соответствующим объектом от предыдущего вызова перерисовки), сам javascript умеет компилироваться в ассеблер и его скорость на уровне с++ или даже быстрее (https://www.youtube.com/watch?v=UJPdhx5zTaw). В общем за 1мс можно "перерисовать" или точнее сравнить дерево из 50к объектов. И на этом фоне ваши желания оптимизировать вызов "перерисовки" отдельных компонентов для формы из всего лишь 100 полей выглядят забавно

хотя бы раз нужно читать документацию…
чтобы форма не ререндерилась каждый раз при вводе символа в какой-либо инпут, нужно убрать подписку на values у всей формы
https://final-form.org/docs/react-final-form/examples/subscriptions


и, если нужно, использовать доступ только к определенным полям ближе к коду, где это необходимо (через Field или FormSpy)

Redux не лучшее решение для хранения состояний при работе с формами. Лучше хранить состояние локально в компоненте. Отличное решение работать с формой, как одним объектом, это с кастомными компонентами без библиотек. Новый проект делаю с react-hook-form. Выглядит лучше чем Formik или Redux-forms. Очень удобная валидация в компоновке с yup. Для новых проектом рекомендовал бы.
final-form — это написанная с нуля redux-forms (тот же автор, то же api), только без привязки к redux & react. yup также можно использовать без проблем.

в целом все «живые» библиотеки для форм плюс/минус одинаковые, я работал с redux-form 2 года, переехал на final-form.
причем у нас на проектах формы бывают и по 200 инпутов, и более. и где надо каждый инпут пересчитывать относительно значений в других (по типу гугл таблиц). final-form отлично справляется с производительностью. redux-form не справлялась

Мне одному кажется, что 80 полей для одной формы это признак не очень хорошего UX? Мне трудно представить случай, в котором такого монстра нельзя разбить на несколько маленьких форм по 3-8 полей и показывать пользователю по очереди (e.g. wizard). Это также решит проблему с перерисовкой и перевалидацией огромной формы.

Sign up to leave a comment.