Использовать один root-reducer не правильно по идеологии. Надо разбивать на несколько.
Как я понял на каждый "ключ" state должен быть редюсер.
Например у меня в state есть элементы с ключами: users(у каждого есть tags массив с идами тэгов), tags, selectedUserId
users и tags - два редюсера разных и один не знаю о существовании друг друга.
Хорошо, но если мне надо получить что за тэг у пользователя?
Если мне надо это сделать, у меня вообще не главного редюсера, только по отдельным полям, я не могу обработать действие по всем данным, т.к. combineReducers не позволяет сделать еще и главный.
Редюсер для selectedUserId отдельный, сразу писать выбранного пользователя, разве не надо проверить пользователя на существование в users?
Или это такой концепт и надо следовать, т.к. можно "навелосипедить", испортить и себе навредить из-за того что в голове другая привычка, где классы и скоупы и всегда можно получить доступ к любым данным.
- combineReducers можно использовать не только на корневом уровне.
- попробуйте не заморачиваться "правильно / не правильно", а просто делать как вам удобно, и если начинают возникать трудности - переделывать.
P.S. круто про редьюсеры рассказано во втором туториале от Дэна (создателя redux). Так же можно и первый посмотреть, если еще не смотрели (оба на английском, но речь понятная + к каждому видео есть транскрипция (текст))
Мне не понятно, зачем из одного редьюсера Вам необходим доступ в другой?
В контейнер через connect получите список всех тегов, прогоните по id'шкам тегов у юзера и отобразите их.
После получения всех юзеров, можно вызвать action creator (selectUser), которому вы передадите id выбранного пользователя и запишите ID(!!!) в store.
Для вывода "выбранного пользователя", в контейнер через connect подключаете список всех юзеров, и выводите нужного юзера по ID.