Pull to refresh
-2
0
Send message
Куда угодно.

Можно пример? Я, видимо, недостаточно глубоко копал MobX, мне не очевидно, как такой подход использовать.


Данные-то откуда? Из формы? Ну вот и складывайте где-то там, где у вас обработчики событий формы.

Из формы или ещё откуда-нибудь. В вашем примере мы присваиваем значение переменной. Эту переменную надо где-то хранить, чтобы потом использовать в форме. Надо создавать класс для компонента, чтобы хранить this.model, или функциональный компонент. Тоже ручная работа.


Но это всё ерунда, а вот как заставить компонент перерисовываться на изменениях модели? https://mobx.js.org/refguide/observable.html ни слова об этом не говорит, зато перечисляет аж 5 правил конвертации значений, которые нужно знать. И исключения для MobX версии 4, о которых тоже надо знать.


Зачем? Чтобы сделать форму с тремя полями?


Эм. Взять этот обсервабл и прочитать, что в нём?

Для этого надо сперва понять, что он изменился. См. предыдущий пункт.


Где же? Примеры из документации mobx очень часто написаны без декораторов.

Я не видел таких примеров для React + MobX. В документации MobX есть много примеров использования MobX в вакууме, но мне это не интересно. Я по работе использую React, мне нужно, чтобы компоненты отрисовывались по изменению состояния.


Примеров с React без использования классовых компонентов я не нашёл. Плохо искал?

А куда вы этот код сделаете, и как будете вызывать, чтобы а) данные туда сложить, и б) данные оттуда вытащить? И когда?


Нет, мне правда интересно. Почему-то во всех примерах с MobX используются именно классы и тонна магии. Почему?

Спасибо за ссылку, я в MobX копал вполне глубоко. На мой взгляд, именно работа с классами является неестественным усложнением в большей части случаев.


Ну честно, вам когда форму с полями нужно сделать, зачем для этого нужно создавать класс, поля, методы для работы с ними, да ещё и обмазывать эти методы магией @observable? В Statium всё гораздо проще: вот модель (API), вот поля с данными (initialState), вот список, какие значения куда скормить (Bind). И всё.


А если в форме нужно показывать значение из вышестоящего состояния? Имя юзера, например, или поле из родительского компонента. В Statium банальнейше, в MobX больно (ручками).


Вы посмотрите пристальнее, вдруг понравится. От ненависти до любви один шаг. :)

Это бизнес (или, вернее, менеджеры), который всё время «хочет странного».

С точки зрения этого бизнеса (или, вернее, менеджеров), вы тоже всё время хотите чего-то странного. Зарплаты, например.


Вот просто забить большой болт и всё.

Я хочу вдаваться в подробности на тему, почему "забить большой болт и всё" нельзя. Это отдельная большая тема.


Я вам о другом говорю: забить большой болт не работает. Можно забивать сколько угодно, это не поможет. Никак. Потому что у 95% пользователей всё равно будут разные браузеры, разные платформы, и разные устройства. От мощных десктопов до туповатеньких Chromebook, от последних iPhone до дешёвых китайских клонов какой-нибудь младшей модели Samsung Smartwatch. Какие критерии вы предлагаете использовать для исключения тех и этих, чтобы ваша жизнь была попроще? Назад в будущее, к This site is best viewed in IE6?


По вашим словам мне очевидно, что вы просто не владеете предметной областью. Так и должно быть, front end не ваша специализация. Это моя специализация, и я отлично знаю из опыта и толстой мозоли на лбу, почему нельзя "просто взять и сделать" сайт, чтобы всё работало и все были довольны.


Я стараюсь не вспоминать о битвах с нативным скроллингом документа, который есть сущее, адское зло — а виртуальный скроллинг это тоже сущее, адское зло. У меня в печёнках сидят поля ввода в HTML, обработка фокуса, маски и валидирование значений. Меня тошнит от touch events, от распознавания жестов по таймауту и ловли утёкших таймеров (ручками, всё ручками!). Я молча посылаю пламенные лучи ненависти и поноса в сторону HP, Lenovo и прочих умников, выпускающих лаптопы с тачскринами, которые никак особенно не определяются в браузере и потом к чертям ломают всю обработку событий, потому что смешать pointer events и touch events это — а чо, у нас в Windows работало? Я плачу кровавыми слезами каждый раз, когда мне нужно лезть в caniuse.com и подтверждать, какие фичи из CSS3 работают в последнем мобильном Сафари, а какие нет. И т.д. и т.п., конца и края этому нет (и не будет).


Можно всё это игнорировать, для личных проектов сойдёт — кому они нужны, кроме вас. А для коммерческих проектов не сойдёт, и игнорировать уже не получится. Добро пожаловать в добрый, светлый мир front end. :)

Это всё же не совсем то, о чём я говорил. Прокси-сервисы и middleware тоже ломаются иногда, настройки слетают, и всё такое.


Но в back end практически не бывает так, чтобы без каких-либо изменений в вашем коде/настройках/Dockerfile/K8s/whatever, вдруг внезапно всё сломалось и перестало работать.


А на frond end — легко. Домен третьесторонней интеграции кто-то добавил в чёрный список, и привет. Узнать об этом, кроме как из разъярённых воплей обиженных клиентов, вообще никак нельзя. Это не хаос?

Вы так говорите, как будто я front end не делал. Делал. И не раз. Нет там никакого хаоса.

При всём уважении, ваши слова только подтверждают разницу между "делал, и не раз" и "занимаюсь этим постоянно". Вы этот хаос или намеренно игнорировали, или просто не успели заметить.


Если даже не вдаваться в поэзию, то самый поверхностный анализ ситуации позволяет увидеть, что благодаря наличию:


  • Различных браузеров, разных версий
  • Различных платформ и устройств
  • Абсолютно неконтролируемых сетевых условий
  • Абсолютно неконтролируемых условий среды в браузере

… и т.д., и т.п., поверхность потенциально проблемной области в front end разработке в разы больше, чем в back end. Если не на порядки.


Просто для примера, из свежего: у вас в практике часто бывало, чтобы на серверной стороне в код без спросу внедрился случайный третьесторонний модуль и начал блокировать вызовы к каким-либо микросервисам? И его не убрать никак. А у нас это норма жизни, ad blockers или какие-нибудь расширения в браузере могут в любой момент поломать что угодно. И объясняй потом бизнесу, почему их интеграция с каким-нибудь Appcues не работает и как её починить (а починить нетривиально).


И таких ситуаций, факторов, ошибок, особенностей, да просто багов — сотни, тысячи их. И каждый день что-то новое.


Мы из Хаоса (tm).

Вот странно, какие всё же плохие и громоздкие подходы вы имеете в виду… На мой взгляд, Statium гораздо проще и понятнее того же Redux, да и MobX тоже.


А коллегам, между прочим, вполне понравилось. :)

Да, пардон, я не посмотрел исходники до конца, и не увидел, что оно всё заканчивается контекстами.

Фух, спасибо, отлегло. А то я уже в исходники полез, вдруг что-то где-то течёт… :)


Я не буду спорить за идеологию реакта (хотя бы потому, что не считаю её в принципе хорошей),

Ага, вот тут уже понятнее. Если честно, я с вами вполне согласен — React это не самое лучшее решение, как идеологически, так и практически. Но по разным совершенно не техническим причинам, React есть реальность, данная нам в ощущениях. Можно это оспаривать сколько угодно, но если вы сравните количество вакансий на React со всем остальным, то...


В общем, в заголовке репозитория так и написано: Statium это прагматичный подход к управлению состоянием в React. :)


но «нет» в первую очередь потому, что состояние — это не компонент, и нет ни малейшей необходимости делать его таковым.

Состояние это не компонент, состояние это просто набор данных. Компонентом является хранилище состояния, фактически это просто API для доступа к объекту с данными.


Необходимо ли было делать это API в виде компонента? Нет конечно, есть и другие варианты; у этого же подхода есть как минимум одно большое преимущество: лёгкость использования в функциональных/презентационных компонентах. Гораздо проще и быстрее написать вот такой код:


const Component = () => (
    <ViewModel ...>
        ...
    </ViewModel>
);

… чем функцию, которая что-то с чем-то соединяет, или @observable магию, которая рассыпается без поддержки декораторов, etc.


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

Да, вы правы. В какой-то момент мне надоело бодаться с ветряными мельницами. If you cannot beat them, join them и всё такое.


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


Но выглядит это как нагромождение абстракций там, где вообще-то можно гораздо проще.

Вполне возможно, что оно так выглядит из-за плохого изложения материала. Над документацией мне ещё работать и работать, это факт. Потому что с моей точки зрения, абстракций в ViewModel как раз почти нет: это тупо тот же самый setState, только вынесенный в отдельный компонент.


И скорее всего это всё очень небесплатно для производительности.

Понятно, раздел с анализом производительности надо поднять наверх. :) Я его в конец README засунул, так не работает.


Вообще всё с точностью до наоборот: ViewModel работает безобразно быстро. Т.е. настолько, что я сколько ни пытался профилировать на работающих приложениях, ViewModel и сопутствующий код даже не заметно в Call Tree, надо очень глубоко копать.


А если подумать, то чему там тормозить? Собственно данные ViewModel лежат в обычном объекте, который связан по прототипной цепочке с родительскими объектами. Чтение по ключу из объекта это как раз то, что JavaScript умеет делать очень быстро. :)


Обновление состояния тоже ненамного дороже родного для React this.setState(). А поскольку ключ обновляется в модели-владельце, то рендеринг отрабатывает только для этой модели и её детей. Ну т.е. в самом худшем случае, если у вас абсолютно все ключи в одной модели в корне приложения, получаете такой как бы аналог Redux. :)


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


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

Спасибо за отзыв. :) Можно поинтересоваться, что именно вызвало у вас такую реакцию? Концепция хранения данных в компоненте, иерархическая связь, кривизна API, или код примера? Или всё вместе? Ну правда, интересно же. :)

Спасибо за критику, очень интересно. Можно по пунктам?


Да, давайте в компоненты еще и модель затащим.

А почему нет? Этот подход идеологически ничем не отличается от this.setState() в компонентах; практически разница только в том, что состояние делегировано в отдельный, предназначенный для этого компонент. Специализированность компонента позволяет решать проблемы доступа к данным без текущих абстракций, а то, что хранилище является компонентом, позволяет использовать все оптимизации, наработанные в React с его появления.


Внутри ViewModel используется именно setState, вполне ванильно.


Я, собственно, ничего особо против вашего проекта не имею, но вот загаживать DOM тем, чему в ней явно не место — это сильный моветон.

Подождите, какой DOM? ViewModel ничего не рендерит в DOM, это виртуальный компонент с хранилищем для данных. Или я как-то не так вас понял?

Глас вопиющего в пустыне… Людям, которые работают с простыми, очевидными, и прекрасно контролируемым условиями в back end, никогда не понять хаоса и дикого Запада front end.

Так что использовать, контексты или Redux?

Ни то, ни другое. Надо использовать (бесстыжая самореклама!) Statium: https://github.com/riptano/statium. RealWorld example: https://github.com/nohuhu/react-statium-realworld-example-app


State colocation из коробки, наглядно, и, что самое важное — с доступом к состоянию родительских компонентов, тоже из коробки. И многое другое.

Всё верно, только не как будто. Это и есть аргументация в суде против вас.


Я тоже не особо читал договоры и верил в человеческую порядочность, пока не привелось получить судебный иск на миллион долларов от бывшего партнёра и работодателя в своё честное, открытое физическое лицо, проживающее в социалистическом штате Канифольния. В процессе узнал много нового и интересного, например: если на вас подали иск и вы не подали прошение о защите, то истец признаётся правым автоматически, и получает всё, что запросил. Это закон. Процесс защиты долгий и сложный, документы должны быть подготовлены аккредитованными персонами — т.е. надо нанимать адвокатов. Хороший адвокат с рекоммендациями стоит $450 в час, и часов нужно много — десятки, если не сотни. Никакой "бесплатной защиты", как в кино, не положено, потому как это не уголовный иск, а гражданский. Всё за свои.


Обжегшись, начал читать договоры внимательно. И да, в сложных случаях нанимаю адвоката — это несоизмеримо дешевле, чем судебные издержки. И да, торгуюсь об условиях трудового договора. Обычно получается.


Один раз пришлось отказаться, т.к. в договоре были прописаны совершенно дичайшие вещи — компания получала право в любой момент затребовать у меня все имеющиеся документы, электронные устройства, носители, и т.д., с целью контроля, а не тырю ли я их конфиденциальную информацию. И не только в течение трудоустройства, но и 3 года после увольнения. И в течение этого срока я также обязался отчитываться перед компанией, где я живу, на кого работаю, на каких условиях, чем конкретно занимаюсь, и т.д. Плюс ещё несколько интересных пунктов.


Адвокат, честно, ох... немножечко впал в оторопь и посоветовал не соглашаться, что в общем и так было понятно. Нанимающий менеджер тоже впал в тихую оторопь после того, как я в переписке озвучил претензии к пунктам договора и привёл анализ адвоката, и начал блеять на тему: Но мы же никогда… Но это же просто рыба… Да вообще!


Что интересно, через пару месяцев после отказа они таки вернулись и сказали, что пофиксили договор, может, чёрт возьми, нам снова?.. Но паровоз уже отчалил.


Немаленький финтех-стартап в SF это был, дочка немаленького лидера на рынке онлайн CRM систем.

Дожив до возраста и доходов, позволяющих работать по 12-14 часов в день в выделенном домашнем офисе, обставленном мебелью Herman Miller, я понял, что уже вполне могу себе позволить не работать по 12-14 часов в день.


Чего и вам желаю.

Из альтернатив кроме ag-Grid есть ещё Bryntum Grid.

5 лет, полёт нормальный.

Ну беруши же.

Можно ж хобби не только для себя, а и для народа тоже :)

Что вы, всё уже украдено до нас. :) Например: http://www.owwm.org. Я там в режиме чтения участвую, ибо добавить к этому кладезю знаний мне почти нечего.

Вы почему-то воспринимаете два этих занятия, как взаимоисключающие. Это просто хобби, сегодня одно, завтра другое. :)


А перепродавать точно не буду, это совершенно невыгодно. Затраты по времени никогда не окупить.

Спасибо за фото и пояснения, теперь стало понятно, о чём вы говорили. Такие станки сделать действительно не проблема, при наличии рабочего пространства (пыли будет много), большого количества времени и достаточного опыта. Что-то мне подсказывает, что вы подходили к этому делу не совсем с нуля. Ну, или просто у меня руки кривые и мой опыт здесь плохо применим. :)


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


Но тут есть другой момент: ваши задачи для этих станков сводятся к самым простым операциям с готовыми материалами. Каких-то чуть более сложных операций фанерный станок из старой циркулярки просто не потянет. Скажем, пазование без боли на нём не сделать, и что-то толще готового щита не распилить. Отрезать под углом (beveling)? Без шансов. Сделать прорези для стыков (tenoning)? Забудьте, не сойдётся. И т.д.


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


А когда человек начинает чем-то заниматься, он ничего толком не знает. И более универсальные инструменты как раз в помощь: увидел/вычитал методику, попробуй применить и посмотри, подходит тебе или нет. Промышленный станок легко позволит это сделать и, самое главное, снять большую долю неуверенности в своих действиях. "Это инструмент плохой или у меня руки из жопы?" Если инструмент хороший, то вопрос даже не стоит. :)


Кроме того, любые инструменты имеют погрешность. Деревянные инструменты, тем более самодельные, имеют погрешность более высокую, чем промышленные железные инструменты. В некоторых случаях, существенно более высокую. Понимать, как именно эта погрешность вылезет в конечном изделии, как это обходить, и какие запасы в размерах оставлять для доводки напильником — это непросто. Это и с опытом совсем непросто, а для начинающего столяра это добавит целое измерение фрустрации, к которому человек будет не готов. Потому что если посмотреть видосики на Йутубе, то всё это абсолютно не очевидно: там люди в основном хвастаются достижениями, но мало кто удосуживается указать на подводные грабли и подсказать, как их обойти. Всё выглядит так легко: вжик, бац-бац, и склеил. А на практике получается, что всё криво, косо, углы не сходятся, фанера нифига не плоская, ты её струбцинами, а коробка-то вышла кривая… И уже не поправишь.


Вы же в ИТ небось работаете, про понятие learning curve знаете. И что порог входа в технологию лучше понижать, тоже. Так вот, изготовление самодельных станков, особенно как первый шаг в столярном деле, эквивалентно задиранию кривой до небес. А покупка готовых инструментов, как ни парадоксально звучит, порог входа заметно понижает.


И, раз уж требуете фото — что ж стесняетесь приложить свои?

По двум причинам: а) я сейчас в командировке, б) этот шкаф я уже распилил. :) Очень много места занимал, зараза. А сама пила большого интереса не представляет, т.к. покупная.

Information

Rating
Does not participate
Registered
Activity