fullstack-development / react-redux-starter-kit

Modular starter kit for React+Redux+React Router projects.
https://demo.fullstack-development.com/
MIT License
91 stars 13 forks source link

Выпилить react-final-form. Вернуть redux-form #144

Open sk1e opened 4 years ago

sk1e commented 4 years ago

Мы не можем шарить стейт формы между фичами. С redux-form приложения лучше будут масштабироваться в общем случае потому что redux не накладывает ограничений на доступ к своему стейту. Уход от redux-form должен был как-то обосновываться, приведите эти обоснования пожалуйста

in19farkt commented 4 years ago

Одно очень весомое обоснование, redux-form на больших формах лагает безбожно.

in19farkt commented 4 years ago

и если тебе нужно дублировать стейт формы в редакс, ты можешь легко это сделать с помощью final-form.

sk1e commented 4 years ago

Одно очень весомое обоснование, redux-form на больших формах лагает безбожно.

за счёт чего лагает?

sk1e commented 4 years ago

и если тебе нужно дублировать стейт формы в редакс, ты можешь легко это сделать с помощью final-form.

single source of truth же. Дублирование - источник багов

in19farkt commented 4 years ago

за счет того что редакс)) а в форме очень много данных постоянно меняется, там же не только текущие значения инпутов, а еще много разной доп. информации, и на каждое изменение у тебя перерисовывается вся форма.

in19farkt commented 4 years ago

Ну вообще, если ты хочешь шарить весь стейт формы в другую фичу, то возможно ты что-то делаешь не так))

sk1e commented 4 years ago

за счет того что редакс)) а в форме очень много данных постоянно меняется, там же не только текущие значения инпутов, а еще много разной доп. информации, и на каждое изменение у тебя перерисовывается вся форма.

так а чо редакс) Редакс не добавляет лагов, если рендер оптимизирован. У нас просто не оптимизируют и это предмет отдельного обсуждения. Т.е. можно писать так чтобы не лагало всё это

sk1e commented 4 years ago

Ну вообще, если ты хочешь шарить весь стейт формы в другую фичу, то возможно ты что-то делаешь не так))

очень редко, но всё-таки появляется. И очень грустно будет когда она снова появится, но react-final-form мне не позволит(

in19farkt commented 4 years ago

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

in19farkt commented 4 years ago

Писал большой коммент и гитхаб его просрал... переписывать нет времени пока :(

В общем были конкретные кейсы на проектах, когда redux-form дико лагал и мы ничего с этим сделать не могли.

Znack commented 4 years ago

Вообще я предлагаю пока эту тему немного позже обсудить. Может быть мы свое type-safe решение для форм напилим на алгебраических типах.

sk1e commented 4 years ago

Писал большой коммент и гитхаб его просрал... переписывать нет времени пока :(

В общем были конкретные кейсы на проектах, когда redux-form дико лагал и мы ничего с этим сделать не могли.

Я не вижу в redux-form ничего что могло бы провоцировать лаги на самой форме. У тебя всё прозаично возможно было: redux-form обильно диспатчит экшены, а рендер контейнеров зачастую неоптимизирован и реагирует на эти диспатчи и вызывает лаги.

sk1e commented 4 years ago

Вообще я предлагаю пока эту тему немного позже обсудить. Может быть мы свое type-safe решение для форм напилим на алгебраических типах.

Во-первых, пока мы соберёмся это пилить, пока напилим, всё это время мы не будем иметь возможности идиоматично решать отдельный класс задач на новых проектах.

Во-вторых, не думаю что мы сможем напилить что-то значительно лучшее по сравнению с redux-form. Автор полировал API под десятки-сотни различных примеров форм, у нас такого количества нет.

Ну и не заметил особых проблем с типами в redux-form

in19farkt commented 4 years ago

я не хочу заниматься оптимизацией рендера форм, у меня нет на это времени.

В чем разница между redux-form и final-form - redux-form дает возможность управлять формой извне, если быть точным из любого уголка твоего приложения, т.к. ты можешь диспатчить экшены редакс-формы. И ситуация, когда тебе, в каком-то рядовом проекте, нужно залезть в потроха формы не из формы, мне кажется уже выглядит криво.

in19farkt commented 4 years ago

короч нужно из двух зол выбрать наименьшее))

Znack commented 4 years ago

Мне кажется, тут оставить просто как есть, чтобы не тратить время в пустую, пока есть final-form, который не имеет столь критичных недостатков, чтобы с него уходить. На других проектах, где реально нужно иметь всю полноту гибкости, можно юзать redux-form :)

sk1e commented 4 years ago

я не хочу заниматься оптимизацией рендера форм, у меня нет на это времени.

я не говорил про оптимизацию форм. Я говорил про все контейнеры в принципе, потому что они все откликаются на любые диспатчи, включая диспатчи от redux-form. У тебя в любом случае в любой момент может появиться требование от заказчика с каким-нибудь высоко-интенсивным обновлением стейта приложения и тогда тебе всё равно придётся оптимизировать рендер. В этом нет ничего сверх сложного, просто надо учитывать в самом начале.

В чем разница между redux-form и final-form - redux-form дает возможность управлять формой извне, если быть точным из любого уголка твоего приложения, т.к. ты можешь диспатчить экшены редакс-формы. И ситуация, когда тебе, в каком-то рядовом проекте, нужно залезть в потроха формы не из формы, мне кажется уже выглядит криво.

Что значит потроха? Нужен доступ к стейту формы за пределами формы. Регулярно такие требования возникают. Ничего кривого не вижу: у тебя могут возникать моменты в которых тебе необходимо заполнить форму из других частей приложения

sk1e commented 4 years ago

короч нужно из двух зол выбрать наименьшее))

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

ещё раз подчеркну. У redux-form нет проблем с производительностью, связанные с ним проблемы могут быть только у всего приложения. Проблемы в реации на высокоинтесивный диспатч экшенов. Такой диспатч может понадобиться и при других требованиях заказчика. Отказ от redux-form это попытка ухода от необходимости оптимизировать приложение

sk1e commented 4 years ago

Мне кажется, тут оставить просто как есть, чтобы не тратить время в пустую, пока есть final-form, который не имеет столь критичных недостатков, чтобы с него уходить. На других проектах, где реально нужно иметь всю полноту гибкости, можно юзать redux-form :)

так ты не сможешь на старте определить насколько гибко нужно работать со стейтом формы. Когда ты уже напилишь кучу форм c final-form и тебе понадобится гибкость - будет поздно менять всё это на redux-form

Znack commented 4 years ago

А почему final-form менее гибкая? Может быть эта либа не позволяет легко залезть в стейт извне, но в целом там ты тот же класс задач можешь решить, что и на redux form, насколько я понимаю. И мне кажется норм, что если тебе надо нарушать абстрагирование форм, то это будет не так просто — заводи тогда явный контракт у контейнера-держателя формы и явно там прописывай как извне могут влиять на стейт.

in19farkt commented 4 years ago

По поводу гибкости final-form мне кажется даже обходит redux-form, там можно писать декораторы для формы и вклиниваться в работу формы, подписываться на какие-то изменения в форме, как-то на них реагировать и в том числе взаимодействовать с формой (изменять ее стейт/поведение). Тут код реализации calculated fields, тут демка. Хз как такое сделать на redux-form (без задротства).

sk1e commented 4 years ago

А почему final-form менее гибкая? Может быть эта либа не позволяет легко залезть в стейт извне, но в целом там ты тот же класс задач можешь решить, что и на redux form, насколько я понимаю. И мне кажется норм, что если тебе надо нарушать абстрагирование форм, то это будет не так просто — заводи тогда явный контракт у контейнера-держателя формы и явно там прописывай как извне могут влиять на стейт.

Мне не нужно нарушать абстрагирование форм. Формы в redux-form предоставляют интерфейс в виде экшен креаторов, которые я могу передать в любую часть приложения и диспатчить там. Это их публичный интерфейс и он не нарушает абстракцию. Это единый механизм по предоставлению доступа к стейту в react-redux архитектуре в принципе.

Ввод каких-то особенных штук со своим локальным стейтом, со своими контрактами которые нужно по-особенному заполнять портит эту архитектуру: т.е. на верхнем уровне при коммуникации между фичами у меня к привычным контейнерам, экшенам и селекторам начнут появляться особенные штуки, которые отвечают отдельно за работу со стейтом форм. Чем это формы так особенны?

Ну и я не думаю что эта либа позволит залезть в стейт в принципе. Как ты себе это представляешь?

Сам автор пишет, что для тесной интеграции с redux react-final-form не подойдёт

sk1e commented 4 years ago

Хз как такое сделать на redux-form (без задротства).

мне кажется тут легко реализовать: слушать экшены по изменению филдов, селектить значения зависимых филдов и диспатчить экшен по изменению калькулируемоего филда

in19farkt commented 4 years ago

Это их публичный интерфейс и он не нарушает абстракцию.

Сысле не нарушает? Ты видел что там с формой можно творить из "любой части приложения"? Нужно всего-то знать имя формы и возможно имена интересующих полей.

Сам автор пишет, что для тесной интеграции в redux

Мне кажется прежде чем пытаться тесно интегрироваться с чем-то, нужно сотню раз подумать, а стоит ли настолько глубоко связываться с этим чем-то, и можно ли обойтись какой-то менее тесной интеграцией. В случае с редакс форм мы можем нахреновертить такого, что потом концов не найдешь. Файнал форм такого не позволяет делать, и это ящитаю правильно.

sk1e commented 4 years ago

Мне кажется прежде чем пытаться тесно интегрироваться с чем-то, нужно сотню раз подумать, а стоит ли настолько глубоко связываться с этим чем-то, и можно ли обойтись какой-то менее тесной интеграцией. В случае с редакс форм мы можем нахреновертить такого, что потом концов не найдешь. Файнал форм такого не позволяет делать, и это ящитаю правильно.

Так требования нахреновертить идут от бизнес-требований. Если есть требование ткнуть в одно место и заполнить форму или засабмитить форму совершенно в другом месте то redux-form тут ни в чём не виноват. Наоборот, позволяет легче сделать

in19farkt commented 4 years ago

мне кажется тут легко реализовать: слушать экшены по изменению филдов, селектить значения зависимых филдов и диспатчить экшен по изменению калькулируемоего филда

У меня сразу возникает много вопросов касательно того где и как должна быть написана такая логика:

Тут по-моему выход один, придется эту форму делать фичей, тем самым делая структуру проекта и дерево зависимостей между фичами немного сложнее.

sk1e commented 4 years ago

кто будет запускать эти дополнительные саги?

фича в которой находится эта форма

что делать если инстансов форм может быть несколько?

делать несколько инстансов фичи

что если одна и та же форма с одинаковой калькуляцией понадобилась в двух других фичах?

сделать два инстанса фичи и передать контейнеры с формами

in19farkt commented 4 years ago

ткнуть в одно место и заполнить

это реализуемо

засабмитить форму совершенно в другом месте

А это немного противоестественное требование, и решение будет соответствующим, что в случае с редакс форм (диспатч сабмита формы хз откуда), что в случае с файнал форм (можно сделать через рефку). Согласен с редакс форм будет проще, но это по мне всё равно остаётся костылем.

sk1e commented 4 years ago

это реализуемо

как? дублированием стейта формы с прокидыванием в филд?

in19farkt commented 4 years ago

как? дублированием стейта формы с прокидыванием в филд?

Инициализацией формы, насколько я помню Form обновляет значения филдов при изменении пропса initialValues.

sk1e commented 4 years ago

как? дублированием стейта формы с прокидыванием в филд?

Инициализацией формы, насколько я помню Form обновляет значения филдов при изменении пропса initialValues.

для этого надо дублировать стейт. А имя initialValues говорит что туда надо передавать начальные значения, оно не говорит что это свойство для значений формы из внешнего, продублированного стейта. Тут как раз ломается абстракция. Ещё оно изменяет другую часть стейта формы, которую не должно изменять https://github.com/final-form/react-final-form/issues/195#issuecomment-403201851

Safr commented 4 years ago

автор Erik Rasmussen создал Final Form и сказал не использовать redux-form, в крайнем случае в зависимости от проектов юзать Formik