
KlonD90
27.10.2016
20:23:52

Paul
27.10.2016
20:24:05

Damir
27.10.2016
20:46:36
как вам redux-act?

from
27.10.2016
20:50:00

Google

from
27.10.2016
20:53:02
как будто писать надо всё то же самое, что и без redux-act, только другим синтаксисом

Ilya
27.10.2016
20:54:41
Про реселлект в react-boilerplate было не плохо показано.

Brs
27.10.2016
21:00:07
Паш, а вы его используете у себя?

Paul
27.10.2016
21:00:31
Из 61?))

Brs
27.10.2016
21:00:41
Уже 85

Paul
27.10.2016
21:01:14
Да, понастоящему вкурить реселект было сложнее чем весь редакс.
Прочувствовать его так сказать)
Граф реселекта в итоге становиться похожим на некоторую immutable структуру, только в отличие от immutable реализаций и курсоров, где изменения распространяются по стору во время push данных, то в реселекте каскадно во время pull.
Это очень мощный концепт. Малюсенький reselect в итоге уделывает монструозные immutable библиотеки, но при это конечно низкоуровневый, поэтому за графом надо следить очень аккуратно иначе все на смарку

Владислав
27.10.2016
21:10:45

Paul
27.10.2016
21:11:33
Нет, я и говорю что он очень простой. Но то что в итоге получается - очень мощно)
Но из-за кажущейся простоты его часто путают с мемоизацией

Владислав
27.10.2016
21:12:32

Brs
27.10.2016
21:13:39
Ну она как бы тоже там есть

Google

Paul
27.10.2016
21:15:04
Ну можно рассматривать это как мемоизацию с длиной 1)
Можно свой мемоизатор подключить чтобы момоизировать долго, но это надо допилививать, в случае если селектор зависит от более чем одного селектора
Хотел было написать такое, но руки пока не дошли
Но опять же - это не главное, главное - граф зависимостей
И если подключать реальную мемоизацию, то надо ее уметь отделять если есть ssr - там она по понятным причинам не нужна и вредна


Bogdan
27.10.2016
21:28:47
но я бы советовал следующий learning curve:
- vanilla flux dispatcher
- redux
- mobx
На самом деле mobx это некое продолжение флюкса - во флюксе есть сторы - например user, folder, board, компоненты подписываются на их изменения и обновляются. Сторы также подписываются на друг друга через шину акшинов. В мобиксе все самое, но сторы называются моделями и нет необходимости в диспатчере и общей шине событий потому что благодаря getter-ам и setter-ам компоненты и зависимые сторы прозрачно подписываются на изменения и обновляются когда надо

Ostap
27.10.2016
21:41:50
в мобиксе теже stores. а все остальное - да
нормальный роутер с резолвером данных в стор
уже готовый лейзи роутинг
и еще куча всего что нужно собирать в реакте самому
это с одной стороны очень круто
а с другой утомляет
подход Абрамова и react create app очень крут
нужно чтобы как у эмбера
хуяк хуяк и в продакшн
а не собирать все по частичках и овертаймить чтобы все зависимости подтянуть к нужным версиям


Bogdan
27.10.2016
21:53:55
Я б с радостью, но тут за меня уже всё решили. Больше всего смущает, что в отличии от редакса нет единого стора и я не могу понять, как мне собрать в одном несчастном обработчике клика по кнопке необходимые мне данные, которые, как я понимаю, раскиданы по разным частям приложения
с mobx-ом данные данные не раскиданы по разным частям приложения - они просто связанны ссылками (one-to-one, one-to-many, many-to-many). И соотвественно если нужно добраться к каким-то данным (будь они хоть на несколько уровней вверх или вниз ) нужно просто простись по ссылкам через точку. Пример нужно получить аватарку юзера какого-то комментария для которого пишется ответ (модель древовидных комментариев как на хабре) - имеем такую структуру состояния приложения -
class User {
id;
posts = [];
}
class Post {
comments = [];
user;
}
class Comment {
comments = [];
parentComment;
user;
post;
}
в самом начале мы инициализируем App компонент текущим юзером
React.DOM.render(<App user={new User({id: 'guest', ....})}/>)
и потом в компонентах просто рендерим структуру постов и комментов просто как обычные вложенные объекты
<div>
{user.posts.map(post=><Post post={post}/>)}
</div>
<div>
{post.comments.map(comment=><Comment comment={comment}/>)}
</div>
при этом не нужно передавать текущего юзера в пропсах потому что текущий юзер всегда связан с сущностью - Post и Comment имеют ссылку на создателя - поле user (также как и user_id в базе данных) и мы можем где нужно (например глубоко в дереве комментариях) написать <div>{comment.user}</div> (кто написал комментарий) а также <img src={comment.parentComment.user.avatar} /> (аватарка комманта юзера на который отвечают)
То есть мы моделируем данные в виде связей а компоненты просто рендерят нужную разметку получая информацию по ссылкам и таким образом не нужно передавать в пропсах кучу зависимостей и не нужно писать стену кода mapStateToProps в редаксе. И в обработчиках тоже достаточно просто изменить нужные данные какого-то объекта (например
onClick=(e)=>{
this.props.comment.text = e.target.value
}
и не нужно парится с тем что нам нужно вернуть полностью иммутабельное дерево всех данных как в редаксе на каждое изменение


Vladimir
27.10.2016
21:55:33
В редаксе тоже можно держать обычное дерево
Нормалайзр зло

Google

Ostap
27.10.2016
21:56:05
мобикс можно узать также как редакс
1 в 1
но получать бенефиты от "умного" чендж детекта мобикса
и не писать свои костыльные scu

Vladimir
27.10.2016
21:57:48
А мобикс можно без декораторов?

Ostap
27.10.2016
21:58:00
а еще есть как по мне пушка от создателя мобикса - https://github.com/mweststrate/mobx-state-tree
можно
https://mobxjs.github.io/mobx/best/decorators.html
про ненужность/нужность декораторов и мобикса

Bogdan
27.10.2016
22:00:17
В редаксе тоже можно держать обычное дерево
в редаксе когда держим данные в виде дерева нельзя делать циклические ссылки а значит нужно передавать недостающие сущности в пропсах (или мапить через стейт) а это очень неудобно когда много many-to-many связей
кстати в случае с деревом комментариев (когда динамическая вложенность) без нормализации вообще не обойтись

Vladimir
27.10.2016
22:02:27
А в чем проблема?

Дмитрий
27.10.2016
22:02:51
редакс вообще против деревьев, это же редюсер, а не tree traversal

Vladimir
27.10.2016
22:02:52
Если ты можешь до редюсера включительно сделать дерево

Paul
27.10.2016
22:21:54

Ches
27.10.2016
22:51:01
подскажите из за чего картинка взятая из json'a при переходе на Link в первый раз прогружается не в тот размер как указано в стилях? но если потом перейти опять на эту ссылку или просто изменить размер экрана, становится как нужно
хотя вроде разобрался, она с текстом делила место, задал тексту % места

Alexander
27.10.2016
22:56:53
реакт

Leonid
27.10.2016
23:10:41
Кто чем пользуется для удаления задержки 300ms на tap на touch девайсах? Нужно чтобы работало как вне, так и с реактом. Простые решения - это meta width=device-width и touch-action: manipulation;, но что делать с остальными браузерами? Дружит ли fastclick с реактом?

Art
27.10.2016
23:37:09
> an easier way to create websites
Ну не

Google

Alexander
27.10.2016
23:37:59

Ches
27.10.2016
23:50:34
а правильно ли вообще делать реакт приложение с некоторым html + div с реактом? вроде можно было не обращать внимание даже, но теперь Link не перекидывает на # ссылку в простом html ... как правильнее сделать?

Leonid
27.10.2016
23:51:07
да, дружит
спс. Подтверждаю. Но будьте внимательны при импорте с npm. Он не соответствует доке.
В доке:
import attachFastclick from 'fastclick';
attachFastclick(document.body);
Должен быть
import Fastclick from 'fastclick';
Fastclick.attach(document.body);

Alexander
27.10.2016
23:52:08

Ches
27.10.2016
23:53:39
Link с реакт роутера
на определенный id в простом html

Damir
28.10.2016
03:09:23
import {LOGIN_USER_SUCCESS} from './constants'
LOGIN_USER_SUCCESS дает undefined, при этом в constants.js такой код:
export default {
LOGIN_USER_SUCCESS: 'LOGIN_USER_SUCCESS'
}
кто-нибудь сталкивался с таким багом?

Pavel
28.10.2016
03:10:09
классика
ща
у тебя экспорт дефолт не экспортирует именованные экспорты
в последнем бабеле
http://stackoverflow.com/questions/33505992/babel-6-changes-how-it-exports-default

Damir
28.10.2016
03:13:30
так вроде изменения в require? у меня es6-модуль

Pavel
28.10.2016
03:13:56
второй ответ прочитай
а так вот https://ponyfoo.com/articles/es6#modules

Damir
28.10.2016
03:15:46
теперь без плагина значит никак для ес6-модулей?

Pavel
28.10.2016
03:16:38
export {
hueta: 'hhh'
}
export const LOGIN_USER_SUCCESS = ...
в общем когда-то неправильно понятый синтаксис отсекли
в целом ничего особо не изменилось

Google

Pavel
28.10.2016
03:19:31
да кстати, теперь если ты делаешь просто export и хочешь импортировать как объект, то import * as someActionCreators from ...

Damir
28.10.2016
03:41:12

Lev
28.10.2016
07:19:31

Damir
28.10.2016
07:30:27
ребят, почему на эту строку ругается? там где восклицательный
[CHANGE_ROUTE]: (state, payload) => !{...state, currentType: payload}
реакт не желает компилиться
такую строку съедает без проблем
[CHANGE_LAYOUT]: (state, payload) => {
return {...state, currentType: payload}
}

Vladimir
28.10.2016
07:31:18
[CHANGE_ROUTE]: (state, payload) => (!{...state, currentType: payload})

Malgalad
28.10.2016
07:32:03
[CHANGE_ROUTE]: (state, payload) => ({...state, currentType: payload}) ...

Vladimir
28.10.2016
07:32:03
освежи знания про arrow functions немного

Damir
28.10.2016
07:33:07
да, теперь порядок, спасибо ?
забыл про ({})

Владимир
28.10.2016
09:17:27

Evgeny
28.10.2016
09:20:57
Компонент для ретина-имейдж подскажите

Eugeniy
28.10.2016
09:36:14
можно так сделать)