Size: a a a

2020 June 12

𝐁𝐏

𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯... in ☄️ effector
Спасибо за разъяснения!
источник

DS

Dmitriy Shuleshov in ☄️ effector
Paruyr🛸🪐🌏
спасибо, это я имел и ввиду ))
Согласен с тем, что всю логику роутинга аппы нужно делить на чтение и запись. При чем в идеальном мире, читать из урла хотелось бы только при первичной загрузке.

С тем что навигация не относится к модели , в корне не согласен. Считаю, что каждый степ в навигации - это лишь следствие достижения модели или части модели определенного состояния.
Вполне себе возможны ситуации, когда урл сменился,а во вью все осталось как есть😉.
SsoT в идеальном мире должна быть модель (по крайней мере в спа), а не урл.
Урл - это всего лишь репрезетация состояния...
История браузера - это всего лишь линейная репрезентация снепшотов (определенных поинтов\меток, которые должен указать разработчик) состояния приложения, с возможностью навигации...

Что должен обеспечивать роутер как библиотека?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Разработчику:
- предоставить возможность определить\расставить поинты\метки в модели, описать иерархию\связи этих поинтов.
(Поинты в итоге должны составлять DAG, каждый поинт может обладать собственным произвольным состоянием) (Разработчик стремится к минимальному количеству поинтов)  
- предоставить возможность связать (статически) поинты состояния в репрезентацию url-path (c возможностью выбора типа этого представления : path | query | hash | custom)
- предоставить возможность добавлять \ удалять такие связи в рантайме

Приложению:
- предоставить возможность синхронизировать модель с репрезентацией ее состояния из урла при первичной загрузке.  
URL => point of app state (model)
`````````````````````````````
- предоставить возможность синхронизировать навигацию юзера по истории (туда\сюда\вооооон туда) со снепшот-поинтами состояния модели
browser history navigation => point of app state (model)
``````````````````````````````````````````````````
- предоставить возможность синхронизировать url c состоянием приложения (моделью) по достижению того или иного снепшот поинта.  
point of app state (model) => URL
`````````````````````````````
- предоставить возможность синхронизировать стек истории браузера с движением по графу снепшот поинтов состояния приложения. (Станет возможна оптимизация записи в стек, пропуск записей по признаку идентичности поинта и его состояния, по иерархическому признаку)
points navigation => browser history stack
источник

yv

yumaa verdin in ☄️ effector
𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯
Подскажите, как правильно работать с сервером?
Пытаюсь по примеру с доки получить данные - в песочнице работает, на локалхосте нет. После получения данных добавляю их в стор, но перебрать данные с него не получается, так как получение асинхронное - их попросту в сторе ещё нет.
При этом в песочнице перебрать напрямую результат эффекта получается.
https://share.effector.dev/7KXdxDeI
> После получения данных добавляю их в стор

в этом проблема, ты пытаешься мыслить императивно, «получили данные → засунули в стор вручную», эффектор работает декларативно, ты описываешь сущности и связи между ними, и всё.

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

𝐁𝐏

𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯... in ☄️ effector
yumaa verdin
> После получения данных добавляю их в стор

в этом проблема, ты пытаешься мыслить императивно, «получили данные → засунули в стор вручную», эффектор работает декларативно, ты описываешь сущности и связи между ними, и всё.

когда стор подписан на doneData эффекта — он получит их когда эффект завершится, не нужно предварительно дожидаться получения данных, ты просто запускаешь эффект и всё работает. стор автоматически обновится.
Вот как раз пытаюсь понять, как правильно мыслить и все связывать. Пробую и тыкаю разными способами, смотрю проекты c awesome-effector, как там реализовано.
источник

𝐁𝐏

𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯... in ☄️ effector
Не планируется ли хотя б какие-то мини-видео/статьи, как работать с effector?
Перечитал/пересмотрел все, что нашел - заходит туго.
источник

yv

yumaa verdin in ☄️ effector
𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯
Не планируется ли хотя б какие-то мини-видео/статьи, как работать с effector?
Перечитал/пересмотрел все, что нашел - заходит туго.
на awesome-effector же вроде есть клёвые видео? от Климова, например
источник

yv

yumaa verdin in ☄️ effector
вот это? я давно смотрел, но там вроде Илья нормально с нуля объясняет, насколько я помню. для прикладного использования.
https://www.youtube.com/watch?v=fdjc5ZPckNo
источник

𝐁𝐏

𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯... in ☄️ effector
yumaa verdin
на awesome-effector же вроде есть клёвые видео? от Климова, например
пересмотрел там все видео, больше всего зашло вот это с youtube
https://www.youtube.com/watch?v=daaVMSod-aM&t=0s
источник

VI

Vadim Ivanov in ☄️ effector
Зайди в чат CodeDojo. Он запишет видео, если будет спрос. 👍
источник

𝐁𝐏

𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯... in ☄️ effector
Не совсем понятно с forward и .?
Когда используем effect, то для изменения состояния store, нужно его пробрасывать с помощью forward  в event?
А  .?  - что б если на данных нельзя применить map, то вывести undefined вместо исключения?
источник

yv

yumaa verdin in ☄️ effector
𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯
Не совсем понятно с forward и .?
Когда используем effect, то для изменения состояния store, нужно его пробрасывать с помощью forward  в event?
А  .?  - что б если на данных нельзя применить map, то вывести undefined вместо исключения?
нет, forward просто для удобства. у тебя view дёргает евент, а внутри модели уже делается реакция на этот евент, в случае с forward — этот эвент дальше дёргает эффект. но если тебе нужна более сложная логика, например, если ты не хочешь чтобы два нажатия кнопки подряд запускали два запроса — ты можешь вместо forward поставить guard, который будет фильтровать события, и запускать эффект только если он уже не запущен.

в целом тут многие считают, что модель должна экспортировать только евенты как публичный интерфейс.

но можно дёргать и напрямую эффект, если тебе этого остаточно — ничего плохого в этом нет.
источник

yv

yumaa verdin in ☄️ effector
𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯
Не совсем понятно с forward и .?
Когда используем effect, то для изменения состояния store, нужно его пробрасывать с помощью forward  в event?
А  .?  - что б если на данных нельзя применить map, то вывести undefined вместо исключения?
.? — это optional chaining и в целом в моём примере не нужен, т.к. в сторе изначально есть пустой массив. если бы стор инициализировался null, тогда да.
источник

𝐁𝐏

𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯... in ☄️ effector
yumaa verdin
нет, forward просто для удобства. у тебя view дёргает евент, а внутри модели уже делается реакция на этот евент, в случае с forward — этот эвент дальше дёргает эффект. но если тебе нужна более сложная логика, например, если ты не хочешь чтобы два нажатия кнопки подряд запускали два запроса — ты можешь вместо forward поставить guard, который будет фильтровать события, и запускать эффект только если он уже не запущен.

в целом тут многие считают, что модель должна экспортировать только евенты как публичный интерфейс.

но можно дёргать и напрямую эффект, если тебе этого остаточно — ничего плохого в этом нет.
Спасибо!
источник

l

lllla in ☄️ effector
Коллеги, как правильно сделать такой кейс?

type Hardware = {
 id: number;
 title: string;
 quantity: number;
 price: number;
 totalAmount: number;
};

const contentFilled = createEvent<Hardware>();

const $title = hardwareModel.store("");
const $price = hardwareModel.store("");
const $quantity = hardwareModel.store("");

contentFilled({…})


и мне надо по одному ивенту заполнить три store по ключу
источник

🦜

🦜 in ☄️ effector
lllla
Коллеги, как правильно сделать такой кейс?

type Hardware = {
 id: number;
 title: string;
 quantity: number;
 price: number;
 totalAmount: number;
};

const contentFilled = createEvent<Hardware>();

const $title = hardwareModel.store("");
const $price = hardwareModel.store("");
const $quantity = hardwareModel.store("");

contentFilled({…})


и мне надо по одному ивенту заполнить три store по ключу
Просто on навесь)
источник

DS

Dmitriy Shuleshov in ☄️ effector
lllla
Коллеги, как правильно сделать такой кейс?

type Hardware = {
 id: number;
 title: string;
 quantity: number;
 price: number;
 totalAmount: number;
};

const contentFilled = createEvent<Hardware>();

const $title = hardwareModel.store("");
const $price = hardwareModel.store("");
const $quantity = hardwareModel.store("");

contentFilled({…})


и мне надо по одному ивенту заполнить три store по ключу
создай один стор и с ивентом в on и три мапа)
источник

l

lllla in ☄️ effector
Dmitriy Shuleshov
создай один стор и с ивентом в on и три мапа)
мне нельзя один стор)
источник

𝐁𝐏

𝐁𝐨𝐡𝐝𝐚𝐧 𝐏𝐞𝐭𝐫𝐨𝐯... in ☄️ effector
yumaa verdin
нет, forward просто для удобства. у тебя view дёргает евент, а внутри модели уже делается реакция на этот евент, в случае с forward — этот эвент дальше дёргает эффект. но если тебе нужна более сложная логика, например, если ты не хочешь чтобы два нажатия кнопки подряд запускали два запроса — ты можешь вместо forward поставить guard, который будет фильтровать события, и запускать эффект только если он уже не запущен.

в целом тут многие считают, что модель должна экспортировать только евенты как публичный интерфейс.

но можно дёргать и напрямую эффект, если тебе этого остаточно — ничего плохого в этом нет.
Вот о таких нюансах я и спрашивал, планируются ли статьи/видео:
- как дёрнуть данные с сервера и положить в стор
- как дёрнуть данные со стора, к примеру для тех же динамических списков;
- как объединять сторы,
- как подписывать сторы на ивенты/эффекты, и аналогично как делать отписки - видел, что необходимо в видео redux=>effector.
- как это все делать с учетом futerslices.

В доках вроде все это и есть, но сложить все вместе сложно.

И не до конца понял момент - effect без event не отрабатывает? То есть effect просто делает асинхронную функцию, а для взаимодействия со store нужно добавлять event?
источник

DS

Dmitriy Shuleshov in ☄️ effector
lllla
Коллеги, как правильно сделать такой кейс?

type Hardware = {
 id: number;
 title: string;
 quantity: number;
 price: number;
 totalAmount: number;
};

const contentFilled = createEvent<Hardware>();

const $title = hardwareModel.store("");
const $price = hardwareModel.store("");
const $quantity = hardwareModel.store("");

contentFilled({…})


и мне надо по одному ивенту заполнить три store по ключу
const $title = hardwareModel.store("");

А как это воопще?)
источник

l

lllla in ☄️ effector
Dmitriy Shuleshov
const $title = hardwareModel.store("");

А как это воопще?)
const hardwareModel = createDomain();
const $title = hardwareModel.store(“”);
источник