
Vladimir
26.07.2016
11:18:42
ок, так проще?
connect(
...
dispatch=>({
onClick: dispatch=>dispatch(e=>dispatch=>fetch('google.com').then(()=>dispatch('CLICKED')))
})
)(MyButton)
короче вопрос такой. как минимальными средствами сделать асинхронный экшн?

Dmitry
26.07.2016
11:32:36
Ну да, в общем случае примерно так и выглядит ))
onClick = () => dispatch => fetch('google.com').then(() => dispatch({ type: 'LODED' }));
connect(
dispatch => ({
onClick: (...args) => dispatch(onClick.apply(null, args))
})
)
Короче bindActionCreators тебе нужно

Google

Aleh
26.07.2016
11:34:04
function someAsyncAction(dispatch) {
doSomeAsync().then(r => dispatch({type: "async", r});
}
connect(null, dispatch => ({ asyncAction: () => someAsyncAction(dispatch) }))(Component)
не?
ну в компоненте соответственно this.props.asyncAction()

Dmitry
26.07.2016
11:37:23
Но так ты не сможешь передать параметры функции
Можно конечно вторым и более аргументом, но каждый раз прокидывать dispatch как-то не айс ) В редаксе же все уже продумали
Вручную никто не биндит экшенкреаторы

Aleh
26.07.2016
11:39:04
это если их надо сложить в диспатч
а здесь не надо
можно карированием сделать
const someAsyncAction = dispatch => (all, your, args) => doSomeAsync(all, your, args).then(dispatch)
и тогда в mapDispatch будет проще
connect(null, dispatch => ({ asyncAction: someAsyncAction(dispatch) })

Алексей
26.07.2016
11:42:52
что бы не париться за аргументы, можно и так делать
const someAsyncAction = dispatch => (...args) => doSomeAsync(...args).then(dispatch)

Aleh
26.07.2016
11:43:19
ну это если они совпадают, мало ли надо еще какую фигню делать
типа +1 или склеить
или там в разные асинки их кинуть, но вообще да, конечно можно)

Алексей
26.07.2016
11:44:04
ну я так понял, тут идет проброс и склеивать лучше все таки в самой ф-ции doSomeAsync

Google

Aleh
26.07.2016
11:45:21
вообще я бы так не делал, но вопрос был в том как можно это сделать, вот ответ)

Den
26.07.2016
11:49:08
А что такое вообще async action? Не надуманная ли это штука?


DenJel
26.07.2016
11:49:45
childRoutes: [
{
path: comp1,
getComponent( nextState, cb ) {
require.ensure( [], ( require ) => {
cb( null, require( comp1 ).default );
}, comp1 );
}
},
{
path: comp2,
getComponent( nextState, cb ) {
require.ensure( [], ( require ) => {
cb( null, require( comp2 ).default );
}, comp2 );
}
},
{
path: comp3,
getComponent( nextState, cb ) {
require.ensure( [], ( require ) => {
cb( null, require( comp3 ).default );
}, comp3 );
}
}
]
Здравствуйте, разбираюсь с Code spliting. Делаю child роуты через require.ensure в react-router'e. Comp1 и Comp3 нормально собираются в отедльные чанки вебпаком, а Comp2 собирается в общую сборку. Следовательно никакой динамической подгрузки нет. Comp1 и Comp3 тупые компоненты без стейта, а Comp2 фактически приложение со своим стором: вот такой код примерно я requir'ю:
const Comp2 = () => {
return (
<Provider store={ store }>
<Root />
</Provider>
);
};
Comp2.displayName = Comp2;
export default Comp2;
Что я пропустил может кто сталкивался?


Илья
26.07.2016
12:08:13
Хай! а как то можно заставить работать запись const {...rest}=this.props вместе в typescript?

Aleh
26.07.2016
12:10:30
есть только в реакт шаблонах <Blabla {...props} />

Илья
26.07.2016
12:13:33
это печально

Den
26.07.2016
12:19:31
Тогда что такое action?

DenJel
26.07.2016
12:20:56

Vladimir
26.07.2016
12:21:08
вот блин, философия началась:)

Oleh
26.07.2016
12:21:23
это по сути обьект, который несет в себе название события и полезную нагрузку

Vladimir
26.07.2016
12:21:49
короче actionCreator вполне может жрать диспатч, если не использовать bindActionCreators
и тогда танк не нужен

Den
26.07.2016
12:29:18
Я просто хочу разобраться. Async actions обсуждаются уже давно и эта тема никак не исчерпает себя.
Ни танк, ни сага мне не нравятся. actionCreator должен создавать action, а reducer должен "редьюсить". Прошу прощения за тавтологию

Dmitry
26.07.2016
12:34:06
В сагах же так все и есть

Den
26.07.2016
12:38:07
Разве? Если правильно помню, то сайдэффекты описываются в редьюсере, не?

Brs
26.07.2016
12:38:50
ты путаешь с лупом, кажется

Google

DenJel
26.07.2016
12:39:06

Dmitry
26.07.2016
12:39:14
Нет, там просто подписываешься на запуск экшена и дальше в генераторе запускаешь все остальные нужные экшены

Den
26.07.2016
12:42:02
Да, может с лупом путаю
Нужно ещё раз сагу посмотреть

DenJel
26.07.2016
12:43:40
return {} vs dispatch( {} ), да грязновато, но все понятно

Aleh
26.07.2016
12:53:40

Den
26.07.2016
12:58:59
да, согласен, у redux-saga хороший подход. Хоть и слишком наворочено выглядит.

Vladimir
26.07.2016
13:04:27
возвращаясь к бойлерплейту, в него надо самый наглядный подход, чтобы надо было читать док по минимуму

DenJel
26.07.2016
13:41:28
может кто по requre.ensure проконсультировать?

Konstantin
26.07.2016
13:44:14
Denjel, у тебя в вебпак конфиге скорее всего подключён AggresiveMergePlugin который склеивает чанки, чтоб оптимизировать их подгрузку. Хотя, как вариант, можно явно указывать в какой чанк какой компонент должен идти, вот здесь пример:
https://github.com/kriasoft/react-static-boilerplate/blob/master/routes.json#L13 (на базе кастомного рутинга)

DenJel
26.07.2016
13:46:20
только вот мне бы внутри понять как бандл узнает куда ajax делать? при перезаливке всего это на боевой сервер будет ли это работать? или это магия WDS?
И если да как это настраивается
и еще вопрос по сборке нужно ли выносить vendor'ы типо react react-dom в отдельный чанк? В каких случаях это делается?


Alex
26.07.2016
13:54:28
когда у тебя vendor библиотеки делятся между абсолютно всеми чанками.

DenJel
26.07.2016
13:56:51

Dmitry
26.07.2016
13:56:53

Google

Alex
26.07.2016
13:57:56
Чтобы вендоры хранились отдельно от чанков, в таком случае разные чанки не будут дублировать вендорные библиотеки.

Dmitry
26.07.2016
13:58:18
Поэтому я не выношу вендорные библиотеки по умолчанию в отдельный бандл

Alex
26.07.2016
13:58:33
С ними возни много имхо.

Dmitry
26.07.2016
13:58:36
require.ensure сам сольёт общеиспользованное в главный

DenJel
26.07.2016
14:00:21

Alex
26.07.2016
14:01:01
В этом не всегда есть смысл, но когда это нужно такой функционал есть, тем вебпак и крут

DenJel
26.07.2016
14:02:01

Admin
ERROR: S client not available

Dmitry
26.07.2016
14:07:45
Ну там в настройках publicPath влияет на это
в настройках вёбпака

Владимир
26.07.2016
14:07:52

Dmitry
26.07.2016
14:08:14
Откуда именно у тебя будут тягаться файлики
Т.е. если у тебя оно будет в domain.my/staic/1.1.js
То, publicPath должен быть такой '/static/' вроде как
В доках написано
Ну и собственно когда на сервер будешь класть всё это - ты должен убедиться, что они там есть :)
Задеплоить их туда, где они должны быть


DenJel
26.07.2016
14:10:13
чето меня прорвало на вопросы сегодня) извиняйте) А если тебе надо 2 перезагружаемых dev сервера: один для серверной части приложения, другой для UI. Я вчера ковырялся с этим, в итоге пришел к выводу сделать express сервер через nodemon для первого и webpack-dev-server для второго, и в index.html который отдаешь с экспресса подключать bundle с webpack-dev-server'a. Впринципе схема рабочая, но не очень адекватная, в react-starter-kit это делается в рамках одного процесса ( с дочерними наверное ), я вчера пытался смотреть, но понял что без бутылки водки там не разобраться. Так вот есть адекватные примеры у кого по настройке такого окружения? Если тебе надо и серверную и UI часть в одно время дебажить, чтобы они перезагружались при изменениях сами

Alex
26.07.2016
14:20:18
сделай файлик который будет два экспресса на разных портах запускать

Google

DenJel
26.07.2016
14:26:59
я делал так вчера, ставил dev-middleware. Там вся соль в сборке UI если back процесс можно спокойно перезапустить при изменении, то UI процесс перезапускать нельзя, а то он занового начинает собирать фронт и это оочень долго, надо чтобы он постоянно включен был, впринципе да не сложно запустить 2 процесса наверно так и сделаю, прост интересно как гуру такие вопросы решают в рамках одного процесса на ноде)

Alex
26.07.2016
14:37:21
У меня бэкенд вообще не на ноде, просто открываю в соседней вкладке терминала
Можно вот так: http://stackoverflow.com/questions/30950032/how-can-i-run-multiple-npm-scripts-in-parallel

Ilya
26.07.2016
14:43:38

Владимир
26.07.2016
14:43:49
Есть кто в Epam работает?

Konstantin
26.07.2016
15:13:36
Как вам новое название для проекта
https://twitter.com/koistya/status/757955779458654208

Andrey
26.07.2016
15:14:49
отличное название, странно, что не заняли уже)

Dmitry
26.07.2016
15:38:49
https://facebook.github.io/react/blog/2016/07/22/create-apps-with-no-configuration.html а эту штуку кто-нибудь смотрел? Все хорошо там?)

Konstantin
26.07.2016
15:39:49

S
26.07.2016
15:48:38
А тут сидят чуваки из kriasoft, авторы react-starter-kit?

Владимир
26.07.2016
15:49:14
Вон Костя выше

S
26.07.2016
15:53:27

Konstantin
26.07.2016
15:54:21
Yeoman пока не умеет билдить и запускать проект с поддержкой code splitting, async chunk loading, HMR и т.п.

S
26.07.2016
15:55:09
умеет, yoman это система для дистрибуции бойлерплейтов, как там внутри напишешь, так и будет работать

Alex
26.07.2016
15:59:37
Всем привет!
Народ, подскажите, пожалуйста, как вообще принято писать поджинацию на реакте?

Vladimir
26.07.2016
16:00:21
"паджинация", как и везде

Roman
26.07.2016
16:00:52
react-virtualized / react-list

Vladimir
26.07.2016
16:03:07
а вообще - кладешь в стейт текущую страницу, и в зависимости от нее делаешь запросы

Nikita
26.07.2016
16:13:32
кто-то юзает package.json внутри компонентов, вместо index.js?
https://github.com/benmosher/eslint-plugin-import/issues/458 - поддержите issue, а то ща наворотят(