@react_js

Страница 2263 из 5115
andretshurotshka?❄️кде
07.10.2017
14:03:22
омг

мы же айди храним только

Max
07.10.2017
14:04:52
относится тем что многие жалуются на тормоза с редаксом из-за которого решают не хранить какие-то данные в сторе

Maksim
07.10.2017
14:05:38
относится тем что многие жалуются на тормоза с редаксом из-за которого решают не хранить какие-то данные в сторе
так мы о чем говорим? о бэнчах или о том как данные хранить? про бенчи мне не интересно

Google
Viktor
07.10.2017
14:07:35
меняются только ссылки на объекты рекурсивно до изменившегося примитива, чему там тормозить?

Max
07.10.2017
14:12:57
так мы о чем говорим? о бэнчах или о том как данные хранить? про бенчи мне не интересно
как данные хранить, из-за требования иммутабельности хранение вложенных объектов в редаксе будет тормозить, хранить объекты которые ссылаются друг на друга вообще не получится, а нормализация данных выливается в кучу костылей как в сообщении выше

меняются только ссылки на объекты рекурсивно до изменившегося примитива, чему там тормозить?
не меняются ссылки а пересоздаются, код {...task, comments: [...task.comments, {...comment, text: 'new text}]} создает новый объект таска и копирует туда все свойства, создает новый объект массива и копирует туда все текущие комментарии при этом если в массиве тысячу объектов то редаксу нужно перекопировать ссылки на все эти тысчячу объектов, и создает новый объект комментария который нужно изменить и копирует туда ссылки свойства которые не были изменены. И это только один уровень, а перед таском стоит проект с массивом тасков а перед проектом папка с массивом проектов. А теперь сравни с версией mobx-а : comment.text = 'newText' - ничего не создается, ничего не копируется

Dmitry
07.10.2017
14:18:20
ну если чистый мобх, то он довольно быстро работает

но не хватает таких фич как в mst со всем деревом состояний

Maksim
07.10.2017
14:23:33
не меняются ссылки а пересоздаются, код {...task, comments: [...task.comments, {...comment, text: 'new text}]} создает новый объект таска и копирует туда все свойства, создает новый объект массива и копирует туда все текущие комментарии при этом если в массиве тысячу объектов то редаксу нужно перекопировать ссылки на все эти тысчячу объектов, и создает новый объект комментария который нужно изменить и копирует туда ссылки свойства которые не были изменены. И это только один уровень, а перед таском стоит проект с массивом тасков а перед проектом папка с массивом проектов. А теперь сравни с версией mobx-а : comment.text = 'newText' - ничего не создается, ничего не копируется
так это в твоей версии стора так хранится одна сущность внутри другой, ничто не мешает хранить индексы параллельно друг другу (ну как в базе таблицы с сылками по id), тогда изменение таска в твоем примере не повлечет за собой изменение проекта

blkmrkt
07.10.2017
14:28:37
ребят, не начинал нового проекта на реакте уже год. Где почитать про что сейчас круто. Как насчет: -рутер для сервера и клиента -что-нибудь к mobx для нормализации -koa умерла? -сжималка/обфускатор к вебпаку Может стартер кит есть готовый? Я брал тот что от nightwolfz последний раз

blkmrkt
07.10.2017
14:30:41
create react app
мне с SSR надо

andretshurotshka?❄️кде
07.10.2017
14:30:48
хм

Max
07.10.2017
14:32:27
так это в твоей версии стора так хранится одна сущность внутри другой, ничто не мешает хранить индексы параллельно друг другу (ну как в базе таблицы с сылками по id), тогда изменение таска в твоем примере не повлечет за собой изменение проекта
ок, с нормализацией у нас будет примерно такая схема state = { tasks: { .... 2123: {id: 2123, name: 'task1', comments: [23, 444, 22]} }, comments: { ... 23: {id: 23, text: 'comment1'} } }тогда да, при изменения комментария нужно будет обновить только комментарий а поскольку task хранит айдишники его менять не нужно. Но проблема остается! Как мы меняем состояние когда нужно обновить комментарий? Делаем обычно такое newState = {...state, {comments: {...state.comments, 23: {...state.comments[23], text: 'new text'}}}} - пусть и в меньшем размере но имеем точно такую же проблему - при изменении одного поля text в комментарии нам нужно создать новый объект комментария перекопировать все остальные поля комментария, создать новый объект хеша и перекопировать ссылки на все остальные комментарии - причем не только текущего юзера а вообще все - а это могут быть тысячи комментариев ну и также нужно будет создать новый рутовый объект состояния и перекопировать туда ссылки на все обекты-хеши

Google
andretshurotshka?❄️кде
07.10.2017
14:34:23
immutable)

вообще это не проблема, у меня редьюсер только ложит в стор данные которые прислал normalizr

blkmrkt
07.10.2017
14:36:18
ок, с нормализацией у нас будет примерно такая схема state = { tasks: { .... 2123: {id: 2123, name: 'task1', comments: [23, 444, 22]} }, comments: { ... 23: {id: 23, text: 'comment1'} } }тогда да, при изменения комментария нужно будет обновить только комментарий а поскольку task хранит айдишники его менять не нужно. Но проблема остается! Как мы меняем состояние когда нужно обновить комментарий? Делаем обычно такое newState = {...state, {comments: {...state.comments, 23: {...state.comments[23], text: 'new text'}}}} - пусть и в меньшем размере но имеем точно такую же проблему - при изменении одного поля text в комментарии нам нужно создать новый объект комментария перекопировать все остальные поля комментария, создать новый объект хеша и перекопировать ссылки на все остальные комментарии - причем не только текущего юзера а вообще все - а это могут быть тысячи комментариев ну и также нужно будет создать новый рутовый объект состояния и перекопировать туда ссылки на все обекты-хеши
mobx state tree нашел, вроде это сейчас пушка. Единственный минус - нужно дефинировать все сущность заново в клиенте, ну и с чистым мобксом еще больше работы: https://github.com/kriasoft/react-starter-kit Может с GraphQL с какой либой это все из коробки работает?

blkmrkt
07.10.2017
14:37:57
https://medium.com/front-end-developers/a-look-at-relay-and-apollo-96fcb215e1d
>2016 Тогда помню не было straightforward way в релее как-то роли юзеров разграничивать

Nikita
07.10.2017
14:41:01
Ни у кого небыло проблем с добавлением других лоадеров в babelrc если уже есть emotion. У меня такой babelrc конфиг { "presets": [ "next/babel" ], "plugins": [ [ "emotion", { "inline": true }, "inline-import-data-uri" ] ] } и последний лоадер не подключается почему то, emotion отключаю все нормально работает.

Maksim
07.10.2017
14:41:18
ок, с нормализацией у нас будет примерно такая схема state = { tasks: { .... 2123: {id: 2123, name: 'task1', comments: [23, 444, 22]} }, comments: { ... 23: {id: 23, text: 'comment1'} } }тогда да, при изменения комментария нужно будет обновить только комментарий а поскольку task хранит айдишники его менять не нужно. Но проблема остается! Как мы меняем состояние когда нужно обновить комментарий? Делаем обычно такое newState = {...state, {comments: {...state.comments, 23: {...state.comments[23], text: 'new text'}}}} - пусть и в меньшем размере но имеем точно такую же проблему - при изменении одного поля text в комментарии нам нужно создать новый объект комментария перекопировать все остальные поля комментария, создать новый объект хеша и перекопировать ссылки на все остальные комментарии - причем не только текущего юзера а вообще все - а это могут быть тысячи комментариев ну и также нужно будет создать новый рутовый объект состояния и перекопировать туда ссылки на все обекты-хеши
еще раз говорю, что проблемы быстродействия меня не интересуют, меня интересует как удобнее хранить данные, а будут они в редаксе или еще где-то мне все равно

Max
07.10.2017
14:47:55
еще раз говорю, что проблемы быстродействия меня не интересуют, меня интересует как удобнее хранить данные, а будут они в редаксе или еще где-то мне все равно
так удобней хранить и работать именно со вложенными объектами - не нужно создавать контейнеры чтобы замапить айдишники на объекты, не нужно обмазываться постоянными простынями mapStateToProps, достаточно просто вывести<div>{task.comments.map(comment=><Comment comment={comment}/>)}</div> и компонент комментария получит не айдишник а сразу объект и может просто вывести <div>{this.props.comment.text}</div>. и не нужно никаких mapStateToProps. Или вот нужно например в компоненте комментария отреднерить имя папки - с айдишниками нам нужно вытаскивать несколько раз родительские объекты - state.folders[state.projects[state.tasks[comment.taskId].projectId].folderId].name чтобы добраться до папки, когда же в мобиксе можно просто пройтись по ссылками и это намного чище и проще выглядит - comment.task.project.folder.name

Dmitry
07.10.2017
14:49:42
Кстать, а что думаете про https://cerebraljs.com/docs/api/index.html ?

Maksim
07.10.2017
14:51:42
так удобней хранить и работать именно со вложенными объектами - не нужно создавать контейнеры чтобы замапить айдишники на объекты, не нужно обмазываться постоянными простынями mapStateToProps, достаточно просто вывести<div>{task.comments.map(comment=><Comment comment={comment}/>)}</div> и компонент комментария получит не айдишник а сразу объект и может просто вывести <div>{this.props.comment.text}</div>. и не нужно никаких mapStateToProps. Или вот нужно например в компоненте комментария отреднерить имя папки - с айдишниками нам нужно вытаскивать несколько раз родительские объекты - state.folders[state.projects[state.tasks[comment.taskId].projectId].folderId].name чтобы добраться до папки, когда же в мобиксе можно просто пройтись по ссылками и это намного чище и проще выглядит - comment.task.project.folder.name
Не нужно смешивать разные вещи, есть хранение к данных, есть доступ к ним, есть их рендер. До этого мы о говорили о хранении, сейчас внезапно перешли на доступ, с чего бы?

Max
07.10.2017
14:53:11
Не нужно смешивать разные вещи, есть хранение к данных, есть доступ к ним, есть их рендер. До этого мы о говорили о хранении, сейчас внезапно перешли на доступ, с чего бы?
это же взаимосвязано, ограничения редакса и необходимость хранить айдишники вместо объектов несет кучу неудобств работы на уровне рендера в компонентах

Алексей
07.10.2017
15:55:20
Нет, всё таки прихожу к выводу, что Redux для подавляющего числа веб приложений - это не очень хорошая вещь.

andretshurotshka?❄️кде
07.10.2017
16:03:11
а для больших?)

Artyom
07.10.2017
16:06:24
А я попробовал redux-act и сижу радуюсь теперь

Алексей
07.10.2017
16:08:47
а для больших?)
думаю, что даже для больших он не очень видимо он для особо специфичных, когда одно действие может очень сильно изменить стейт (например совершенно разные части стейта) но я что-то не могу придумать пример такого приложения

Алексей
07.10.2017
16:09:40
в любом случае всё равно уж больно много кода поулчается, даже с redux-act

Google
Алексей
07.10.2017
16:09:55
У меня такое везде
а что за приложение, если не секрет?

andretshurotshka?❄️кде
07.10.2017
16:10:01
телеграм на реакте

а разве в mobx state tree нельзя то же самое сделать

то есть обновлять разные куски стейта

от одного экшена

Алексей
07.10.2017
16:12:15
ну не знаю, мне кажется что для телеграма можно и не реагировать кучей редьюсеров на один экшн, но я могу и ошибаться

andretshurotshka?❄️кде
07.10.2017
16:12:27
там API требует такого

Алексей
07.10.2017
16:12:31
а

Admin
ERROR: S client not available

andretshurotshka?❄️кде
07.10.2017
16:12:38
В одном экшене приходят юзеры, чаты и все остальное

Алексей
07.10.2017
16:12:49
понял

andretshurotshka?❄️кде
07.10.2017
16:12:49
Можно конечно разбить на много экшенов

Но это еще больше кода писать)

Алексей
07.10.2017
16:13:08
просто мне кажется, что для подобных штук редакс как раз будет удобнее, чем mobx или mobx-state-tree

но для обычных CRUD, когда ты жмакаешь на кнопку и с сервера подтягиваются данные - это не затрагивает весь стейт

надеюсь mobx наберёт хорошую такую популярность, чтобы потеснить redux, а то как мне кажется многие пихают redux во все приложения, потому что это стильно-модно-молодёжно и альтернатив особых не было раньше (Flux не берём в расчёт)

хотя mobx тоже не идеален

andretshurotshka?❄️кде
07.10.2017
16:17:23
ну просто я уже костыли начинаю пилить для нормализации/денормализации, @zerobias там уже какую-то свою штуку поверх редакса пилит

Алексей
07.10.2017
16:17:55
это тоже нехорошо

Google
Алексей
07.10.2017
16:18:20
я вообще считаю, что нормализация не нужна

это же не СУБД

andretshurotshka?❄️кде
07.10.2017
16:18:39
мне кажется надо бд обычную на фронт)

Алексей
07.10.2017
16:18:50
а вот не надо нихрена

именно что не надо

потому что СУБД хороша на больших объёмах данных, которых на фронтенде нет и не будет

andretshurotshka?❄️кде
07.10.2017
16:19:25
ну редакс вполне себе бд уже со всеми этими ids byId

Алексей
07.10.2017
16:19:31
на фронте всё спокойно размещается в оперативе

andretshurotshka?❄️кде
07.10.2017
16:19:39
так я про in memory db

Именно нормализация/денормализация и язык запросов для редакса, без ререндеров

Страница 2263 из 5115