
Dmitry
04.08.2016
14:38:18
У тебя сработает componentWillUpdate два раза. На второе срабатывание будут и пропс, и стейт новые

from
04.08.2016
14:38:52
Интересно, как выкрутиться правильнее

Nikita
04.08.2016
14:39:54
например в sCU не давать апдейт, если состояние не то, что ты ожидаешь) Но фиддл сделай, да)

Google

Dmitry
04.08.2016
14:40:57
Ну очевидно, что рендер сработает два раза подряд, и на второй раз все будет ок, если ты логику в componentWillUpdate опишешь. Или тебе принципиально, чтобы эта логика стаботала один раз с новыми пропс и стейтом?

from
04.08.2016
14:43:08
в componentWillReceiveProps происходит так же setState, который не стоит пихать в willUpdate

Dmitry
04.08.2016
14:44:47
А, ну тогда да, коллбэком в setState() вызывай функцию из родителя на изменение пропс. Ну или пересмотри реализацию этих компонентов )

from
04.08.2016
15:00:51
уффф
в общем как-то так https://jsfiddle.net/69z2wepo/51669/
сорри, что предназначение свойств не очень понятно
дело короче в том, что типа дерево элементов рендерится
в общем "средний" элемент одновременно выставляет стейт в методе и одновременно реагирует на приходящие пропсы

Алексей
04.08.2016
15:04:59

Ostap
04.08.2016
15:05:09
hello world

from
04.08.2016
15:05:13
блин )
https://jsfiddle.net/69z2wepo/51669/

blkmrkt
04.08.2016
15:06:08

from
04.08.2016
15:06:32
сорри )

Google

from
04.08.2016
15:06:40
вроде упростил по максимуму
из-за этого может цель перестала быть ясной
проблема в общем внутри <SomeComponent />
а <RecursiveComponent /> слушает клик
че-то вообще не приходит в голову, как правильно сделать или переиграть (
можно тупо к компоненту свойство прицепить ) но это именно тупо )

blkmrkt
04.08.2016
15:14:07
получается у тебя набор компонентов и чайлдов, и каждый чайлд должен знать, был ли его родитель раньше кликнут?

from
04.08.2016
15:14:38
эээ не, чайлд о родителе ничего не должен знать

blkmrkt
04.08.2016
15:15:02
ну получается то так, раз родитель передает это в чайлд через пропсы

from
04.08.2016
15:16:18
не, ты не так интерпретируешь )) Когда компоненту что-то передаётся через пропсы, это не называется "компонент знает о родителе". На то и пропсы )
SomeElement получает информацию isActive он или нет
Иерархия правильная

Алексей
04.08.2016
15:17:30
@everdimension он не про имплементацию говорит а о том что на самом деле здесь происходит.. он при этом прав.

blkmrkt
04.08.2016
15:17:37
а мне кажется что ты стейт выводишь из пропсов тут, и это неправильно)

from
04.08.2016
15:18:26
Где именно?
а, ну да, в componentWillReceiveProps собственно

blkmrkt
04.08.2016
15:29:25
Где именно?
у тебя RecursiveElement1 рендерит SomeElement, который рендерит RecursiveElement2. Проучается что SomeElement создает себе стейт из пропсов RecursiveElement1, вот RecursiveElement2 и дергается 2 раза
блин, если убрать рекурсию, то гораздо проще будет же

from
04.08.2016
15:29:49

Google

from
04.08.2016
15:31:34
Так, насчёт того, что стейт выводится из пропсов.
Да, нехорошо, но логика такая — компонент, став активным, имеет право выставлять стейт того, какой именно чайлд будет активным

blkmrkt
04.08.2016
15:33:31
хм, еще RecursiveComponentы прокликиваются, наверное так не задумывалось?

from
04.08.2016
15:34:39
задумывалось
Если компонент кликнулся где-то "глубоко", то такой же компонент где-то "наверху" тоже должен на клик реагировать
в общем-то бабблинг тут работает прекрасно
И вообще всё получалось очень складненько вплоть до вот этого момента

Grigory
04.08.2016
15:55:07
Коллеги, а кто нибудь делает стейт, в котором храниться массив элементов и рядом эти же элементы byId? Если да, расскажите плиз, как реализуете.

Dmitry
04.08.2016
15:58:14
Я :)
import { keyBy } from ‘lodash’;
var list = [];
const z = {
list,
listById: keyBy(list, ‘id’)
};
Вот так нагляднее:
import { keyBy } from 'lodash';
import { ITEMS_LOADED } from '../constants/actionsTypes';
const initialState = {
items: [],
itemsById: {}
};
const reducer = (state = initialState, action) => {
if (action.type === ITEMS_LOADED) {
return {
items: action.payload,
itemsById: keyBy(action.payload, 'id')
};
}
return state;
};
export default reducer;

Evgeny
04.08.2016
16:02:09
Используй handleActions из redux-actions

Dmitry
04.08.2016
16:03:12
https://github.com/paularmstrong/normalizr

Grigory
04.08.2016
16:05:14
@azrael25 add/remove делаешь Object.assign({} itemsById, obj) ?

Dmitry
04.08.2016
16:06:11
Ага, чтоб новый объект каждый раз возвращался

Grigory
04.08.2016
16:06:52
Ок, спасибо
Что-то лень руками поддерживать сразу и items и itemsById на каждое действие

Алексей
04.08.2016
16:08:22
а зачем вообще это нужно? если не сикрет

Grigory
04.08.2016
16:08:58
Чтобы массив каждый раз не переберать. O(1) доступ к айтемам

Алексей
04.08.2016
16:10:31

Grigory
04.08.2016
16:11:46
Как думаете, а что если написать кастомный класс, унаследованный от массива, который будет возвращать новый массив на действия addAt(), removeById, removeByIndex и будет реализовывать поддержание byId?
@Ai_boy сортировки — да, не поможет. Но когда есть несколько хранилищ данных и для отоюражения нужно бегать в соседнии — это облегчит жизнь. Например, у тебя есть массив юзеров и массив публикаций этих юзеров. Ты рендеришь 100 публикаций от 100 юзеров, тебе нужно взять из массива юзеров имена авторов. В одном случае ты переберешь 100 раз массив из n айтемов, в другом — прост сто раз заберешь byId

from
04.08.2016
16:17:29
для упрощение примера, естесственно. Представь что там if какой-нибудь, в чем проблема)

Google

blkmrkt
04.08.2016
16:18:05

Grigory
04.08.2016
16:20:37

blkmrkt
04.08.2016
16:23:55

Алексей
04.08.2016
16:24:08
> @gkuznetsov
В одном случае ты переберешь 100 раз массив из n айтемов, в другом — прост сто раз заберешь byId
А о каких величинах идет речь? В этой ситуации IndexDB, его враппер или https://github.com/agershun/alasql выглядит логичнее

Grigory
04.08.2016
16:25:08

Алексей
04.08.2016
16:26:04
Тысячи, иногда 10-ки тысяч элементов
Ну тогда почему не AlaSQL какойнибудь ?
// B) SQL on array of objects
var data = [{a:1,b:10}, {a:2,b:20}, {a:1,b:30}];
var res = alasql('SELECT a, SUM(b) AS b FROM ? GROUP BY a',[data]);
console.log(res); // [{"a":1,"b":40},{"a":2,"b":20}]

Grigory
04.08.2016
16:26:46
Ну тогда почему не AlaSQL какойнибудь ?
// B) SQL on array of objects
var data = [{a:1,b:10}, {a:2,b:20}, {a:1,b:30}];
var res = alasql('SELECT a, SUM(b) AS b FROM ? GROUP BY a',[data]);
console.log(res); // [{"a":1,"b":40},{"a":2,"b":20}]
Посмотрю в эту сторону, спасибо

Admin
ERROR: S client not available

Алексей
04.08.2016
16:30:14
Посмотрю в эту сторону, спасибо
FYI - у них очень хорошая WIKI https://github.com/agershun/alasql/wiki/Data-manipulation и вот к примеру пример :) https://github.com/agershun/alasql/wiki/How%20to%20add%20own%20keys%20for%20grouped%20output

Yevhenii
04.08.2016
16:38:17
Посоветуйте хороших книжек по реакту, желательно на английском. А то на амазоне столько мусора и сложно найти что-то стоящее

Vadim
04.08.2016
16:40:39
Актуальный проект самая лучшая книга

Алексей
04.08.2016
16:41:01

Vadim
04.08.2016
16:41:03
Ну и всякие бойлерплейты

Yevhenii
04.08.2016
16:41:13

Vadim
04.08.2016
16:41:37
Смотришь готовый код, повторяешь, думаешь, пишешь свой

Vladimir
04.08.2016
17:08:15
кто блин придумывал работу с рефами в 14 реакте

from
04.08.2016
17:09:51
а что не так?

Vladimir
04.08.2016
17:09:58
если реф - простой тег, возвращается нода. если сложный компонент - возвращается компонент, ну и все это если не депрекейтед, то легаси
ну не так что неединообразно
что когда смотришь в коде на this.refs.someRef, надо выяснять, что там вообще

Google

Vladimir
04.08.2016
17:16:22
ну и намек на скорый выпил не добавляет оптимизма

Alexey
04.08.2016
17:22:31

Vladimir
04.08.2016
17:23:03
ну да, мое любимое занятие переписывать полтыщи компонентов на новые апи

lamo2k
04.08.2016
17:24:16
Может есть у кого примеры склейки изоморфного приложения react + redux + universal-router. Интересно что получилось.

from
04.08.2016
17:24:55

Alexey
04.08.2016
17:25:11
Ну, всегда можно версию зафиксировать :)

Vladimir
04.08.2016
17:25:11
Note:
Although string refs are not deprecated, they are considered legacy, and will likely be deprecated at some point in the future. Callback refs are preferred.

from
04.08.2016
17:25:18
выпиливать хотят ref="string", но ref={this.handleMount} вроде никуда не собирается

Vladimir
04.08.2016
17:26:04
ну вот не очень ясно, зачем выпиливать ref=string, простите

from
04.08.2016
17:27:36
коллбэк удобная штука тем, что если её правильно написать (а именно n => this.node = n), то не надо следить, есть ли в доме чайлд — this.node станет null, если компонент-реф анмаунтился
А в остальном разницы использования никакой, так что в чем проблема
То, что реф может быть и чисто дом-элементом, и реакт элементом — актуально для обоих способов (вроде?)

Alexey
04.08.2016
17:30:46

lamo2k
04.08.2016
17:32:12

from
04.08.2016
17:32:56
ну вот )

Vladimir
04.08.2016
17:42:57
Проблема в том, что опять горы кода лопатить
Ладно, к проблемам этого дня. Как благородные доны решают такой кейс: при нажатии кнопки в некоторое место страницы подгружаются данные и в это место необходимо проскроллить окно?
В редуксе, это важно

Konstantin
04.08.2016
17:52:30