>>> Еще хотел бы добавить свое мнение на тему обме

Еще хотел бы добавить свое мнение на тему обмена данными между компонентами.

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

Во-первых, как я и говорил, я не использую редукс. Пара основных причин:

  1. Не копал очень глубоко, но мое предположение, что он использует что-то типа [а-ля lodash].cloneDeep, скорее всего для того, чтобы иметь разницу состояний, чтобы можно было потом эту разницу отловить в методах типа componentWillReceiveProps. Из-за этого я наблюдал кучу тормозов в своих интерфейсах, для устранения которых приходилось исхищряться с методами типа shouldComponentUpdate.
  2. Мне не нравится эта децентрализованность в описании редюсеров и экшенов.

В итоге я перешел на flux (который как раз и использует immutablejs). Но и его я чуть под себя модифицировал. Теперь у меня примерно такие конструкции используются:

store.getDispatcher().dispatch(store.actions['UPDATE'], item, newState);

Как видно, тут пляшешь от одного исходного объекта store. И это я еще оптимизирую, чтобы вовсе было store.reduce("UPDATE", item, data);

Такие действия не вызывают изменений в стейтах и пропсах, но в нужных компонентах просто подписываешься на диспетчер через store.getDispatch().register и все, там уже сам решаешь когда что принимать и что с этим делать.

Есть несколько преимуществ в этом.

  1. Самое главное: я в хранилищах могу хранить реальные действующие объекты и в дальнейшем обновлять их как напрямую (если очень хочется), так и находить их с помощью соответствия имеющегося объекта. Пример:
items.map(item => <Button
    onClick={event => {store.getState().find(n => n === item)}.do(...)}
>{item.name}
</Button>)

Мне не нужно в таком случае никаких идентификаторов. Именно это позволяет создавать сразу несколько временных объектов, даже пустых, а потом нелинейно их редактировать.

  1. Производительность. Из-за отсутствия каких-либо операций копирования, даже множественные обходы не дают какой-то ощутимой нагрузки.