Ostap
23.09.2017
13:24:13
тебе нужен гибридный тип. который будет зависить от данных на входе
.union как раз оно
Stepan
23.09.2017
13:24:37
andretshurotshka?❄️кде
23.09.2017
13:26:41
Google
Ostap
23.09.2017
13:27:31
да. ты сам решаеш какой тип определить в рантайме
andretshurotshka?❄️кде
23.09.2017
13:30:24
я как понял там все равно надо список типов передавать?
Dmitry
23.09.2017
14:09:38
Всем привет, подскажите пожалуйста как в реакте лучше реализовать вызов библиотеки (например у меня есть scrollbar и он много где используется)
Max
23.09.2017
15:25:40
и потом был на нескольких конференциях где ребята жаловались что помирают от кучи сервисов
Какое-то полное непонимание. Сервисов в ангуляре или сторов в мобиксе не может быть много или мало - сторов должно быть ровно столько сколько сущностей в приложении. Вот есть приложение где юзер может создавать папки, в папках проекты в проектах задачи а в задачах комментарии. Сколько нужно создать сторов или сервисов? Мой ответ - ровно 4 - User, Folder, Project, Task, Comment, и я не могу понять в чем проблема количества сторов и их некосистентности
Dmitry
23.09.2017
15:27:05
И состояния часто пересекаются между собой и это все очень тяжело менеджить с сервисов
Max
23.09.2017
15:32:34
Dmitry
23.09.2017
15:36:46
в базе и на беке нету такой штуки как отображение. А на юайке этот фактор может влиять на поведение и на постороение (из-за каких-то юайных запросов) и это усложняет задачу постороения правильной архитектуры фронтенда. Часто в какой-то сущности которая никак не связанна с остальными приходится знать очень много инфы про остальные сервисы и при этом иметь собственое состояние. Редукс упрощает задачу менджмента всего этого т.к у тебя в любом месте может быть инфа про все состояние приложения и ты можешь изменить любую часть приложения при этом данные остануться консистентными
Дмитрий
23.09.2017
15:37:41
В базах кстати есть view, но он не для фронта))
Хотя суть та же, да
Dmitry
23.09.2017
15:38:33
А если все строить с архитектурой сервисов, то кто-то или случайно или под просто из-за недостатка времени впедалит в сервис какуе-то переменную isButtonToggled и это переменную надо будет обновлять с десятка других сервисов
и завязываться на нее
Google
Dmitry
23.09.2017
15:38:46
и выходит каша из взаимосвязей
Stepan
23.09.2017
15:40:52
Dmitry
23.09.2017
15:42:14
Ну так fuck this guy
Я примерно говорю. Кто-то сделал неправильное архитектурное решение которое вылезло только при скейлинге или при запросе следующей пачки фич.
Max
23.09.2017
15:45:47
Dmitry
23.09.2017
15:46:32
у нас в текущем проекте такая же архитектура
проект очень большой
и выглядит это как дичь
когда ты пишешь
parent(‘Toolbar’).set(‘qwe’, ‘qer); parent(‘Toolbar’).save()
разобраться в этой каше хреново, дебажить еще хуже
все мутируется и это тяжело отследить.
разширить какуе-то логику (что-то тип мидлвар), то это вообще какой-то костыль приходится придумывать
code4aman
23.09.2017
15:49:08
Про папки, проекты и комментарии
no offense, keep talking ?
Dmitry
23.09.2017
15:51:59
редукс это правильный подход в разработке веб приложений, хоть и не самый лучший. В экосистеме vue, vuex выглядит удобнее и с меньшим количество боилплейта
Max
23.09.2017
15:54:32
разобраться в этой каше хреново, дебажить еще хуже
Хорошо, а как ты сделал бы в редаксе этот пример с юзером, папками, проектами, задачами и комментариями? Учитывая что в редаксе нельзя создавать ссылки между объектами нам бы пришлось стор нормализировать и записывать в свойства айдишники вместо ссылок и приходим к тому что нужно на каждый чих вытаскивать айдишник из стора. И получам целую портянку вот такого кода
const store = getStore();
store.folders[store.projects[store.boards[store.tasks[comment.taskId].boardId].projectId].folderId].name
вместо лаконичного и простого
comment.task.board.project.folder.name
Dmitry
23.09.2017
15:55:43
ну если говорить за правильный подход, то тут правильно было бы нормализировать структуру
и взять просто по айдишке фолдера
нужный нейм, но может быть куча других кейсов когда надо структура со вложенностью
Google
Dmitry
23.09.2017
15:56:53
и там да приходится выкручиваться под каждый кейс и думать с реселектом
Ну а если суть задачи стоит в получении нейма фолдера для коментария
У меня была похожая задача, то я через контекст получаю айдишку перента и потом обращаюсь к стору
Max
23.09.2017
16:00:28
и взять просто по айдишке фолдера
у нас нет айдишника папки, у нас есть компонент комментария где мы должны в обработчике проверить какое-то свойство папки чтобы разрешить какое-то действие. В объекте комментария у нас есть только айдишник таска и нам теперь нужно вытаскивать всех по очереди - вытащив таск узнать айдишник борда, вытащив борд узнать айдишник проекта, и только вытащив проект узнать айдишник папки, чтобы прийти к объекту папки и узнать нужное свойство
Ilya
23.09.2017
16:01:04
Пытаюсь понять проблему которой тут идёт обсуждение и не вижу никакой проблемы или чего-то сложного
Dmitry
23.09.2017
16:01:55
который мы вытянем с контекста
Ilya
23.09.2017
16:02:16
Если прикинуть структуру компонентов то если я правильно понял, одно вложено в другое?
Dmitry
23.09.2017
16:02:22
да
Ilya
23.09.2017
16:02:41
И вы используете context?
Dmitry
23.09.2017
16:03:05
сталкивался с похожей проблемой и использовал контекст для того что бы не делать огромную выборку
Ilya
23.09.2017
16:04:38
Ага, и по контексту вы из глубокого компонента ползёте вверх за нехватающими свойствами?
Dmitry
23.09.2017
16:04:38
была система тулбаров которые были должны были быть связанны между собой и состояние одного тулбара могло влиять на поведение другого и это связывалось с помощью айдишек в контексте
Ilya
23.09.2017
16:06:00
А почему вы не прокидываете все пропсами сверху вниз?
Max
23.09.2017
16:06:13
вот что бы такого небыло когда мы вызываем сервис мы можем с контекста в сервис/екшин передать нужный айдишник фолдера или борда для проверки
А как передать? мы можем передавать только пропсами что-то в компонент, но вот этот вариант еще хуже потому что каждый раз когда глубоко вложенному компоненту потребуется какая-то новая инфа мы должны менять рендер всех вышестоящих компонентов чтобы пробросить нужную инфу, в данном случае айдишник паки через все промежуточные, и это все ведет к разрастанию пропсов. Поэтому уж лучше компонент сам будет вытаскивать по айдишнику нужные ему объекты но все равно необходимость постоянно вытаскивать по айдишниками и код подобно
const store = getStore();
store.folders[store.projects[store.boards[store.tasks[comment.taskId].boardId].projectId].folderId].name
значительно уступает возможности получить нужный объект пройдясь по ссылкам используя мобикс
comment.task.board.project.folder.name
Dmitry
23.09.2017
16:06:32
Ilya
23.09.2017
16:07:39
Ничего не портит, максимум с чем у вас могут быть проблемы при таком подходе, это если на цепочке компонентов окажется HOC
Google
Dmitry
23.09.2017
16:07:53
он и оказывается
штук 20
Stanislav
23.09.2017
16:08:09
Ilya
23.09.2017
16:08:16
Stanislav
23.09.2017
16:08:28
Не надо работать, когда мозг отказывает
Dmitry
23.09.2017
16:08:48
это все хоки
и потом это еще раз компоузится
Andrey
23.09.2017
16:09:03
Ох...
Я кончил
Dmitry
23.09.2017
16:09:09
на разные специфические компоненты
даже для лайтбокса есть хок
Stanislav
23.09.2017
16:09:29
Функциональщина в Реакте?
Dmitry
23.09.2017
16:09:46
Дмитрий
23.09.2017
16:10:09
Dmitry
23.09.2017
16:10:15
еще плануем все хоки оборачивать в другие хоки
что бы можно было писать геттеры
для параметров
в хок
Andrey
23.09.2017
16:10:43
А потом спрашивают. Почему браузер столько оперативы жрёт?
Google
Stanislav
23.09.2017
16:10:49
Dmitry
23.09.2017
16:10:51
ну это в теории
Andrey
23.09.2017
16:11:19
Слушаешь?
Дмитрий
23.09.2017
16:11:46
Хз что это
Andrey
23.09.2017
16:12:03
А, я думал, что ты завтракаст слушаешь.
Dmitry
23.09.2017
16:15:03
Ilya
23.09.2017
16:15:44
ну это в теории
Так, а чем обусловлено кстати обусловлено такое количество хоков?
Dmitry
23.09.2017
16:15:59
ее надо как-то реюзать между компонентами
без изменения кода компонентов
andretshurotshka?❄️кде
23.09.2017
16:16:30
Dmitry
23.09.2017
16:17:08
тот же спейс