
Pavel
21.03.2017
20:16:45
дык есть апи
1. У вас есть store который содержит некие сущности (entities)
2. У вас есть reducer-ы, которые позволяют осуществлять менеджмент этих сущностей на основе обробатываемых actions
3. У вас есть actionCreators, которые позволяют производить асинхронные запросы, делать вычисления и в конечном итоге делать dispatch в store некоторых action, что в последствии меняет state
4. У вас есть селекторы (selectors) которые позволяют на основе входых параметров взять часть state сделать преобразование и на выходе получить нормализованные данные для каких-то нужд
5. У вас есть react-redux и метод connect, который позволяет используя методы mapStateToProps и селекторы спроецировать state на props компонента и mapDispatchToProps, чтобы спроецировать набор actionCreators на props

MadMax
21.03.2017
20:17:22
Да
все 5 да

Pavel
21.03.2017
20:17:46
Сответственно настроив оперделенные правила селекторов вы получаете фильтрацию

Google

Play
21.03.2017
20:19:02
для новичка и не только рекомендую изучение официальной документации, прочитать которую будеть легче после курса по изучению частотного англо-русского словарика. В состав которого вошли 2553 выбраных из официальной документации React и React Native слов, изучение которого легче с мобильным приложением Memrise
https://www.memrise.com/course/1450006/react-react-native/
Сделал для себя, если найдете ошибки пишите, пофиксю.

Igor
21.03.2017
20:53:36


Razzwan
21.03.2017
22:14:40
так вот вопрос. Если есть какая то кнопка фильтрации/ сортировки. Где лучше эту фильтрацию сартировку проводить?
Зависит от объема данных. Большой объем данных лучше сортировать на сервере - и выдавать результат, т.к. в противном случае, придется слать большой объем данных клиенту, который просто будет занимать место. Если же количество данных необходимо всегда пользователю в полном объеме (например, список его задач на текущий момент), то конечно нет смысла сортировать задачи по типу на сервере. Нужно сортировать на клиенте, т.к. высока вероятность того, что пользователю понадобятся все данные.
Можно и более реальны пример привести, с городами. Мы вводим "Москва", а нам, оптимистично, выдает "Нью-Йорк". Разве не странное поведение?


Dmitry
21.03.2017
23:22:47

Pavel
21.03.2017
23:23:47
Наоборот, что именно?

Dmitry
21.03.2017
23:24:17
Упс, всё процитировалось. Имел в виду пункт 4

Pavel
21.03.2017
23:25:57
Упс, всё процитировалось. Имел в виду пункт 4
Нормализация процесс относительный от субъекта использования данных. В state данные нормализованы относительно логики работы reducer.
selector-ы и mapStateToProps позволяет сделать нормализацию относительно субъекта (Компонента) их использующих.

Dmitry
21.03.2017
23:27:59
Логично. Я почему прицепился - ну вот лично у меня не получается юзать стейт который плоский прям как БД. 2-3 уровня иерархии точно есть и это удобно

Pavel
21.03.2017
23:29:04
Для переиспользуемой архитекутры flatten state - обязательное условие. Когда мы говорим о сущностях БД. Могут быть отдельные разделы дерева, которые отражают не состояние сущностей. Там может быть достаточно сложная структура.

Dmitry
21.03.2017
23:29:19
и что-то парит меня эта ситуация. Наверное при нагрузке это выльется в оверхед от постоянного JSON.parse(JSON.stringify(state)) в редьюсерах
Мммм..

Google

Pavel
21.03.2017
23:29:34
Это позволяет максимально просто сделать кэширование и мэпинг dataToObject.

Dmitry
21.03.2017
23:30:57
т.е. предметные данные, которыми оперирует прога - храним плоско, а всякая служебная мелочевка - храним как удобно. Ок

Pavel
21.03.2017
23:31:08
Все верно.

Denis
21.03.2017
23:31:30

Pavel
21.03.2017
23:32:30
И для клиент-серверного взаимодействия стоит обратить внимание на GraphQL - это избавит от изобретения велосипедов в redux с обработкой хотя бы своего взаимдействия с сервером.
Многие проекты напрямую не работают с redux, а используют его как точка интеграции набора библиотек использующих через middleware redux.

Dmitry
21.03.2017
23:44:33
Чем плохо выделить шаренный код (редьюсеры и action creator'ы) в отдельный проект, подключить и на клиенте и на сервере и гонять голые actions json'ами по сети? Вполне себе взаимодействие, вполне себе синхронизированное состояние (ну или его общая часть)
Правда, тогда redux нужен и на сервере и на клиенте. Но опять же всю логику на нем можно и не делать

Alex
21.03.2017
23:47:23
А зачем редакс на сервере?

Pavel
21.03.2017
23:47:30
redux и так делается и на сервере зачастую и на клиенте, по крайней мере для компонент при SSR он нужен.
Потеря в масштабируемости для балансировки и проксирования запросов API.
Как эксперимент - почему нет! )

Котяй Негодяй
21.03.2017
23:52:10

Pavel
21.03.2017
23:53:04
Не просто имеем право, а имеем необходимость для SSR.

Котяй Негодяй
21.03.2017
23:53:40
Ну, я сейчас не только в контексте вебапп говорю, а вообще.
Допустим, нужно бота поднять на ноде для телеги.
В голове есть уже готовые паттерны, реализация которых встанет как родная.

Dmitry
22.03.2017
00:03:08
Насчет graph-ql. Согласен что есть все эти проблемы - кэш, аутентификация, балансировка. Но вот читаю про graph-ql - это тупо язык запросов. Какое он имеет отношение ко всем этим инфраструктурным проблемам...

Ywein
22.03.2017
00:04:19

Google

Ywein
22.03.2017
00:04:32
всмысле если у тебя масштабы и сложность не шкалит

Pavel
22.03.2017
00:04:50
Например у нас из простых конфигурационных файлов автоматически генерируется backend - БД + GraphQL API - front-end GraphQL API - CRUD + subscription и это очень лаконично.
Каждый модуль выглядит примерно так:
Интеграция же с компонентами делается посредством HOCFactory с заданием нужных параметров генерации запросов, где делать запросы и мутации, делать ли polling и прочие параметры.
Так же большим плюсом GraphQL является передача типа сущностей внутри ответа, что позволяет делать синхронизацию кэша даже из побочных ответов севера.

Dmitry
22.03.2017
00:19:10
В общем суровый Ынтырпайз. Спасибо за ликбез :)

Pavel
22.03.2017
00:19:42
Enterprise не Enterprise, но чертовски удобно! )

Anton
22.03.2017
00:21:29

Alex
22.03.2017
00:22:18

Pavel
22.03.2017
00:22:40
В соседней конфе смотрите какие люди! )

Pavel
22.03.2017
00:22:44

Dmitry
22.03.2017
00:24:10
А что за конфа? :)

Pavel
22.03.2017
00:24:39
Известный факт, самое большое react сообщество - https://www.reactiflux.com/

Dmitry
22.03.2017
00:24:45
Хочу посмотреть как они свой dnd объяснять будут

Ywein
22.03.2017
00:25:58

Pavel
22.03.2017
00:26:41

Dmitry
22.03.2017
00:26:42
Discord какой-то хотят, не телегу

Pavel
22.03.2017
00:27:05
Discord - это серьезный аппарат для подобных конференций.

Google

Pavel
22.03.2017
00:27:10
Telegram отдыхает.

Dmitry
22.03.2017
00:27:18
Верните irc пожалуйста xD

Pavel
22.03.2017
00:27:35
Вы можете запустить его в браузере.
Это изначально альтернатива TeamSpeak для геймеров.
А дальше разрослось.

Anton
22.03.2017
00:28:31

Yung
22.03.2017
00:28:38
slack для геймеров я бы сказал

Anton
22.03.2017
00:29:02
я знаю мессенджер, который тоже можно запустить в браузере
забыл какой

Admin
ERROR: S client not available

Dmitry
22.03.2017
00:29:24
Да, описание в аппсторе - чат для геймеров . Все оч серьёзно , ставлю
Слак.

Ywein
22.03.2017
00:30:24

Paul
22.03.2017
00:30:25

Anton
22.03.2017
00:31:20
а я про что

Pavel
22.03.2017
00:31:35

Ywein
22.03.2017
00:32:08

Yung
22.03.2017
00:32:15

Pavel
22.03.2017
00:32:24
Я уже писал выше про него. Да.
У меня сделана реализация с множественными подсистемами, каждая из которых имеет свою GraphQL схему и свой datastore => через sequelize и свой сервер подисок через ws.

Google

Pavel
22.03.2017
00:33:49
И это летает и очень компактно.

Ywein
22.03.2017
00:36:39
Apollo я так понял это для фронтенда, а на сервере что используете?

Pavel
22.03.2017
00:37:03
Его же. У них в стэке есть и серверная часть.
Сразу скину middleware сюда, чтобы было на чем базировать.

Котяй Негодяй
22.03.2017
00:38:04

Pavel
22.03.2017
00:38:44
https://gist.github.com/lokhmakov/ed6170cb085d070aa22bad44528e53e4

Alex
22.03.2017
00:39:18
Ващета нет.
Ноду на сервере только ужасные люди используют.

Pavel
22.03.2017
00:39:19
middleware комплексный, возьмите только базовые вещи без множественных схем.
Так же в моем примере processGraphiQL вытащенная реализация из их исходников, под наши нужды. Вам можно использовать настроку endpoint в graphqlExpress.
)

Anton
22.03.2017
00:50:09

Pavel
22.03.2017
00:51:18
Недавно избавились от этой зависимости, import не убрали

Anton
22.03.2017
00:51:24
а, понял
сильно ли критично не выносить проверку прав в модели, а делать это в резолверах?

Pavel
22.03.2017
00:56:14
Обычно это делается либо перед резолвером, либо в резолвере.
Контекст пользователя добавляется до middleware graphql
И уже потом передаётся в каждый резолвер
Ограничение прав делается на основании названия запроса, его параметров и контекста

Котяй Негодяй
22.03.2017
01:11:55

Anton
22.03.2017
01:14:12
ну это понятно. в резолвере делать не советуют, а советуют передавать контекст в модель, типо
User.update(user, context.user)
типо если есть еще и другие api, rest например