Feb 25, 2014 23:22
React охуенен. Я как все устаканю отпишу обязательно.
Для полного экстаза оперденестроения, хочется понять как решать такую задачку:
В оперденях есть формы. У них есть какой-то "основной" стейт, грубо говоря все поля - то что мы умеем получать с сервера и сохранять туда же. Объект, который мы редактируем, и ничего более. Ну, типа для формы с полем "Name" и списком с добавить/удалить в элементах которого - дропдаун и поле ввода для чисел, стейт будет с каким-то таким типом: { string orderName, [{ int productId, int amount}]}.
Поверх этого основного стейта работают механизмы загрузки/сохранения, валидации, обнаружения что юзер что-то менял, отмены изменений, в перспективе - можно и undo сделать, или обнаружение одновременных изменений.
Чтобы все эти save/cancel/undo работали, стейт хочется держать монолитным и сериализуемым. по крайней мере иметь возможность в любой момент его вынуть и вставить другой.
С другой стороны, есть компоненты, которые делают что-то типа "если чувак выбрал что-то в дропдауне, надо в табличку навалить элементы из словарика по выбранному ключику". И с этой стороны хочется давать этим компонентам возможность влезть в момент когда дропдаун обновляет стейт, и заодно обновить стейт таблички. Чтобы работали механизмы типа undo, стейт должен поменяться атомарно, никакие события типа "что-то в стейте поменялось" - не катят.
Само собой, хитрожопые пары из дропдауна и таблички, нужно вкладывать в другие такие же хитрожопые штуки, и чтобы оно оставалось атомарным.
Я изобразил пока наколенный data binding - есть обертка над общим стейтом, от которой можно кусочек с get()/set() отколоть и отдать, а от него - можно еще кусочек рекурсивно. Что-то на линзы похожее короче. Оно работает, но пахнет императивным пиздецом.
Может быть кто посоветует чего? Мне видится что-то типа гибрида FRP и линз - от FRP возможность гибко содинять и "врезаться в провод", от линз - двунаправленность. Или может я FRP не раскурил, и через него это все решаемо?
Также не откажусь от любых советов/ссылок/книжек по теоретическому и прикладному оперденестроению.