
Andrey
31.12.2017
12:21:28
А до осмысления?)

Igor
31.12.2017
12:21:38
а к фреймворку привязано?

Вертихвост
31.12.2017
12:21:42

Andrey
31.12.2017
12:21:58

Google

Вертихвост
31.12.2017
12:22:10
Я просто только присоединился к разговору)

Andrey
31.12.2017
12:22:14
Я примерно представил как оно работает. Однако только в реакте.
Есть хок, который регистрирует состояние в редакс и убирает за собой.

Дмитрий
31.12.2017
12:22:45
Это не столько идея (одна) сколько набор патчей к изначальной концепции) С учетом того что у нас сейчас всё типизировано

Вертихвост
31.12.2017
12:22:46
Можете рассказать или кинуть в меня сообщением?

Igor
31.12.2017
12:22:56
я представил без реакта
с реактом у меня тяжелая нелюбовь

Дмитрий
31.12.2017
12:23:12

Igor
31.12.2017
12:23:34

Andrey
31.12.2017
12:23:49

andretshurotshka?❄️кде
31.12.2017
12:24:26
роутер

Дмитрий
31.12.2017
12:24:34
Ага

Igor
31.12.2017
12:24:36
декораторы

Google

Andrey
31.12.2017
12:24:36

Дмитрий
31.12.2017
12:25:56
Короче исходим из принципа минимальной магии

andretshurotshka?❄️кде
31.12.2017
12:26:05

Andrey
31.12.2017
12:26:23
У меня в приложении вообще роутов нет, к примеру.

Дмитрий
31.12.2017
12:26:36
Да, no silver bullet
У нас если быть точным грузится в зависимости от ачинхронно подгружаемого чанка, а не непосредственно роута

Andrey
31.12.2017
12:27:22
У меня в проекте есть похожая штука, которая, вроде как, покрывает полностью реакт, но я не уверен, что там пробоин нет.
Но там просто. Когда грузится компонент, то он обёрнут хоком, на котором в componentWillMount и componentWillUnmount добавляется редьюсер и прогоняется экшен инициализации.
А так - каждому нужно своё условие добавления-удаления редьюсера делать.

Дмитрий
31.12.2017
12:30:46
Удаления редьюсеров нет, это в дефолтном виде приносит только проблемы

Andrey
31.12.2017
12:32:05

Igor
31.12.2017
12:36:21

Дмитрий
31.12.2017
12:36:28
Короче если схематично:
Экшны руками создавать не требуется, так как есть createAction(description: string)
Тип руками тоже не создаём, и не юзаем и вообще особо напрямую не используем
То есть везде у нас есть в первую очередь данные, они отправляются в actionCreator и они же читаются редьюсерами
Экшн типизируется не строками а данными которые они принимают при создании.
Это ключевая точка, единственное место в коде где мы напрямую указываем, какие типы будем передавать

Andrey
31.12.2017
12:36:50
Потому что ты n редьюсеров всегда можешь пред=вратить в один.

Дмитрий
31.12.2017
12:43:21
Далее на основе этих экшнов создаются редьюсеры. Я использую redux-act но фактически от него только обёртка осталась
Как можно заметить, все редюсеры без типов вообще

Google

Дмитрий
31.12.2017
12:43:58
Тем не менее полностью типизированные :)
Фича в том, что описав экшны на основе payload мы получаем возможность выводить тип сразу и их и редьюсеров
createReducer({} — это потому что в акте в первом аргументе reducer map, который нам больше не нужен. Во втором аргументе — defaults
.on — это поочерёдное добавление экшнов, на которые будет реагировать данный редьюсер

andretshurotshka?❄️кде
31.12.2017
12:46:57
off)

Дмитрий
31.12.2017
12:46:57
В .on в первом аргументе как и везде в других местах передаётся экшн-креатор, который теперь сам по себе символизирует тип экшна
off)
Вот перепишу act, выпилю ваще ? Реально пока нет unload редьюсеров — он ни зачем вообще
Далее улучшения — скоупы

Andrey
31.12.2017
12:50:15
Блин, а это офигенная идея.

Сергей
31.12.2017
12:50:21
это в каком проекте?

Дмитрий
31.12.2017
12:50:46

Andrey
31.12.2017
12:51:17
Подключать редьюсеры при первом вызове экшена, хотя тогда не понятно, когда убирать лишние редьюсеры.

Дмитрий
31.12.2017
12:51:53
Никак, я вижу основания об этом пока не думать, так как там есть тесная связь с более глубокими концепциями)

Andrey
31.12.2017
12:52:24

Дмитрий
31.12.2017
12:52:35
code splitting
Непосредственно связано со следующей вещью о которой я хочу рассказать)

Andrey
31.12.2017
12:53:24
code splitting
Я не думаю, что у меня и у тебя одинаковое понятие этой вещи. Что ты имеешь ввиду?

andretshurotshka?❄️кде
31.12.2017
12:55:13
lazy подгрузку чанков

Andrey
31.12.2017
12:55:32
Ок, понял.

andretshurotshka?❄️кде
31.12.2017
12:55:39
то есть по роуту

Google

Andrey
31.12.2017
12:55:54
А без роутов никак?)


Дмитрий
31.12.2017
12:58:13
На самом деле это функция importReducer которую ты вызываешь перед тем как у тебя появляется код который использует данные редьюсеры
В нашем случае это роуты, потому что scope
Далее улучшения — скоупы
Обнаружив у себя кучу экшнов вида user/auth/logout, я сделал вывод, что скоупы уже существуют как факт и можно только сделать их объявление проще
import { actionScope } from 'Store'
const authAction = actionScope('auth')
const loginAction = authAction.childrenScope('login')
const doLogin: Action<{ user: string, pass: string }> = loginAction('doLogin')
В дев тулсах при этом будет экшн [xx] auth/login/doLogin то есть это чисто вопрос удобства
Дальнейшим шагом становится то, что стор можно положить рядом с кодом его использующим, как раз будет деление по скоупам
(отдельно хочу отметить, что номинально скоупы — это просто строки текста и ни на что сами по себе не влиять не будут, чтобы не забивать голову проблемами)
То есть если мы делаем допустим страницу регистрации, то можем положить папку state прямо в директорию со страницей регистрации (подразумеваю, что используется атомик или просто что-либо кроме деления components/containers)
И грузить редьюсер по требованию, бонусом имеем экшны в шаговой доступности от компонентов и простоту рефакторинга — сразу понятно кто и где будет юзать эти экшны и эти данные в childReducer
То есть получается такой сабстейт без проблем сабстейта так как у нас всё по прежнему — единый стор, но рабитый не физически а логически

Admin
ERROR: S client not available

Дмитрий
31.12.2017
13:12:01
Короче я чот подустал (это ещё не всё), кому там интересно было)
@iRbisaDm @thekiba

Igor
31.12.2017
13:14:45
Прости, я рублю оливье, пристану к тебе попозже

Вертихвост
31.12.2017
13:15:02
Понял. У нас похожим способом сделано за исключением того, что единого стора нет

Дмитрий
31.12.2017
13:15:16
Да я вот тоже понял что продолжать стоит числа так второго)

Igor
31.12.2017
13:35:13
ваше здоровье!

Ҫѐҏӗѫӑ
31.12.2017
16:55:00
накатим

Aleh
31.12.2017
16:57:01
еще вроде и рано, но почему бы и нет
накатим)

Mike
31.12.2017
17:06:05
Я еще в поезде. Сойду через пол часа, остальные поедут в новый год в вагоне. Четырех парней перебравших с водочкой уже сняли.

Andrew
31.12.2017
17:07:49
Сурово :)

Google

Mike
31.12.2017
17:08:12
В целом все мирно

Igor
31.12.2017
18:31:10
Накатим!

Сергей
31.12.2017
18:39:24
лол

Igor
31.12.2017
20:48:11
Вопрос не по теме. А кто как приваты делает недоступными в итоговой сборке?

Mike
31.12.2017
21:39:04
За типизацию!

Dmitry
31.12.2017
21:41:13
Боже, храни типизацию!

Сергей
31.12.2017
21:41:47

Igor
01.01.2018
18:13:25
Привет выжившим!

Alesia
01.01.2018
19:07:08
✋

Mike
01.01.2018
20:00:17
доброе утро

Igor
01.01.2018
20:01:10
утро да, такое

Dmitrii
01.01.2018
22:07:11
Всем привет. Только начинаю вникать в ts, можно ли как-то заставить работать 3й случай? - https://clck.ru/CS7PU

andretshurotshka?❄️кде
01.01.2018
22:08:40
applyMods({
size: 's',
theme: 'normal',
});

Dmitrii
01.01.2018
22:11:21
да, это 1 случай
мне нужно 3й

Eugene
01.01.2018
22:13:54
as SomeProps

andretshurotshka?❄️кде
01.01.2018
22:15:14

Dmitrii
01.01.2018
22:17:44
тут цель в том, чтобы один объект несколько раз использовать и сходу не врубился, почему тс считает несовместимыми типы

Vasiliy
01.01.2018
22:18:26
String enums как вариант