Size: a a a

2020 August 11

П

Первый 🦄 Император... in ☄️ effector
from earth
ты вообще это запускал oO
да
источник

DS

Dmitriy Shuleshov in ☄️ effector
from earth
А теперь такая задачка

На первом шаге есть условно кнопка "next"
По клику на неё
— если пользователь залогинен (== есть user address, считайте это айди пользователя), то направить на второй шаг
— если нет, кинуть ивент (типа address required), дождаться когда появится user address, когда появился — направить на второй шаг

Нагородил тут вот такое решение:


export const setAddress = createEvent<string | null>();
export const address = restore(setAddress, null);

export const next = createEvent();
const requireAddress = createEvent();

export const requireAddressFx = createEffect({
 handler: () => {
   requireAddress();
   const unsub = address.subscribe(value => {
     if (value) {
       next();
       unsub();
     }
   });
 },
});

export const addressDialogDismiss = createEvent();

guard({
 source: sample(address, next),
 filter: address.map(x => !x),
 target: requireAddressFx,
});

export const awaitingAddress = createStore(false)
 .on(requireAddress, () => true)
 .on(addressDialogDismiss, () => false)
 .on(address, (_, payload) => !payload);


названия мне не нравятся совсем, не хватает неймспейсинга наверное

Но основной вопрос — правильно ли делать эффект, который подписывается на стор и отписывается в коллбеке subscribe?
Ты можешь сделать репл?
источник

fe

from earth in ☄️ effector
Dmitriy Shuleshov
Ты можешь сделать репл?
да уже несколько сделал ж
источник

DS

Dmitriy Shuleshov in ☄️ effector
from earth
да уже несколько сделал ж
Можешь кинуть линк из чата?
источник

AO

Aleksandr Osipov in ☄️ effector
Not Dan, But...
Я правильно понимаю, что обернув в React.Memo компонент, юзающий useStore (под капотом которого есть мемоизация) реактивность изменения данных не сломается?
У меня в некоторых местах приложения компоненты не совсем верно скомпозированы и получается так, что RootCmp имеет доступ к огромному стору, при апдейте стора апдейтит в том числе и ребенка ChildCmp, у которого есть доступ к маленькому куску того же самого стора. Это вызывает некоторые проблемы с производительностью, которые хочу решить оборачиванием ChildCmp в React.Memo
React.memo никак не повлияет на полчение обновлений из useStore  UPD: тьфу ты, React.memo имелся ввиду
источник

fe

from earth in ☄️ effector
Dmitriy Shuleshov
Можешь кинуть линк из чата?
вот последний https://share.effector.dev/QYHNeknC
здесь например есть такой баг:

— жму next
— вижу модалку
— жму cancel (!)
— жму set address не в модалке
— попадаю на второй шаг, а должен остаться на первом
источник

NB

Not Dan, But... in ☄️ effector
Aleksandr Osipov
React.memo никак не повлияет на полчение обновлений из useStore  UPD: тьфу ты, React.memo имелся ввиду
спасибо огромное)
да, без ремарки я не понял сначала что ты имел в виду 😄
источник

AO

Aleksandr Osipov in ☄️ effector
Not Dan, But...
Я правильно понимаю, что обернув в React.Memo компонент, юзающий useStore (под капотом которого есть мемоизация) реактивность изменения данных не сломается?
У меня в некоторых местах приложения компоненты не совсем верно скомпозированы и получается так, что RootCmp имеет доступ к огромному стору, при апдейте стора апдейтит в том числе и ребенка ChildCmp, у которого есть доступ к маленькому куску того же самого стора. Это вызывает некоторые проблемы с производительностью, которые хочу решить оборачиванием ChildCmp в React.Memo
А стор кторый огромный он эффекторовский?
источник

AO

Aleksandr Osipov in ☄️ effector
Если да то можно юзать useStoreMap для того чтобы получать обновления только отдельных "частей" большого стора
источник

NB

Not Dan, But... in ☄️ effector
Aleksandr Osipov
А стор кторый огромный он эффекторовский?
Он не супер-огромный, просто содержит в себе достаточно много полей. Разделять его по логике - бессмысленно. Часто информация нужна вся вместе. Редкие кейсы использования частей стора.
Да, как раз useStoreMap выручает)
Про React.Memo - логично, он вроде только на пропсы смотрит, а до хуков ему дела нет
источник

DS

Dmitriy Shuleshov in ☄️ effector
from earth
А теперь такая задачка

На первом шаге есть условно кнопка "next"
По клику на неё
— если пользователь залогинен (== есть user address, считайте это айди пользователя), то направить на второй шаг
— если нет, кинуть ивент (типа address required), дождаться когда появится user address, когда появился — направить на второй шаг

Нагородил тут вот такое решение:


export const setAddress = createEvent<string | null>();
export const address = restore(setAddress, null);

export const next = createEvent();
const requireAddress = createEvent();

export const requireAddressFx = createEffect({
 handler: () => {
   requireAddress();
   const unsub = address.subscribe(value => {
     if (value) {
       next();
       unsub();
     }
   });
 },
});

export const addressDialogDismiss = createEvent();

guard({
 source: sample(address, next),
 filter: address.map(x => !x),
 target: requireAddressFx,
});

export const awaitingAddress = createStore(false)
 .on(requireAddress, () => true)
 .on(addressDialogDismiss, () => false)
 .on(address, (_, payload) => !payload);


названия мне не нравятся совсем, не хватает неймспейсинга наверное

Но основной вопрос — правильно ли делать эффект, который подписывается на стор и отписывается в коллбеке subscribe?
Вот это постановка полная задачи?
источник

AO

Aleksandr Osipov in ☄️ effector
Not Dan, But...
Он не супер-огромный, просто содержит в себе достаточно много полей. Разделять его по логике - бессмысленно. Часто информация нужна вся вместе. Редкие кейсы использования частей стора.
Да, как раз useStoreMap выручает)
Про React.Memo - логично, он вроде только на пропсы смотрит, а до хуков ему дела нет
Кстати можно и без useStoreMap, можно разбить большой стор на мелкие через Store.map
источник

AO

Aleksandr Osipov in ☄️ effector
и уже подписыватьс в компонентах на эти части
источник

fe

from earth in ☄️ effector
Dmitriy Shuleshov
Вот это постановка полная задачи?
нууу вроде бы)
и вот тут мне кажется в двух строчках понятно изложено желаемое https://t.me/effector_ru/152866
источник

NB

Not Dan, But... in ☄️ effector
Aleksandr Osipov
Кстати можно и без useStoreMap, можно разбить большой стор на мелкие через Store.map
наверное в моем случае это более логично, да
источник

fe

from earth in ☄️ effector
Dmitriy Shuleshov
Ты можешь сделать репл?
кажется опять получилось что-то
https://share.effector.dev/2SYYMpSr
источник

fe

from earth in ☄️ effector
from earth
кажется опять получилось что-то
https://share.effector.dev/2SYYMpSr
с вот таким стейтом дополнительным
источник

DS

Dmitriy Shuleshov in ☄️ effector
from earth
блин вот реально императивно решается до смеха просто:

<button onClick={() => {
 if (address) {
   next();
 } else {
   showAddressDialog({ onSuccess: next });
 }
}} />


При этом другой код может спокойно тоже вызывать showAddressDialog и по итогу принимать другие действия

А с эффектором пока трудновато идёт решение
так если тебя устраивает императивно тогда не понял вопроса
источник

fe

from earth in ☄️ effector
Dmitriy Shuleshov
так если тебя устраивает императивно тогда не понял вопроса
эм ну я как бы тут решаю целый сложный виджет реализовывать на эффекторе или нет)
Вот на днях я писал про инпуты которые зависят друг от друга – это как раз сам первый шаг
источник

fe

from earth in ☄️ effector
Dmitriy Shuleshov
так если тебя устраивает императивно тогда не понял вопроса
Ну и гипотетически именно этот переход можно было бы так сделать если бы не получалось по-другому

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

Пока идея была такая чтобы во вьюхе виджета не было логики вообще
источник