Это несколько похоже на проблему приложения todo в примерах редуксов. (https://github.com/reduxjs/redux/tree/master/examples/todos).
Я бы посоветовал сохранить один редуктор, отвечающий за таймеры и ход активного игрока, а не по одному на каждого игрока, поскольку функция редуктора будет одинаковой для всех из них. Когда игрок отправляет действие, сообщающее об обновлении своего счетчика, ему также необходимо указать в действии, что такое идентификатор этого игрока, и вы можете проверить, соответствует ли активный игрок идентификатору игрока, отправляющего действие, затем обновить этот идентификатор в состоянии. иначе проигнорируй это. Ваше состояние будет примерно таким:
{
count: {
'0': 1,
'1': 0,
'2': 3
},
activePlayer: 2,
amountOfPlayers: 3,
}
(или используйте массив-индекс вместо значения ключа, если хотите)
И ваши действия будут выглядеть примерно так:
{
type: 'TICK',
playerId: id
}
А твой редуктор:
const myReducer = (state = {}, action = {}) => {
switch( action.type ){
case TICK :
if(action.playerId !== state.activePlayer) {
return state; // ignore tick actions coming from players that are not the active one
}
return Object.assign({},
state,
count: {
[action.playerId]: state.count[action.playerId]+1
}
}
}
case RESTART :
return {
...state,
{
count: Object.assign({},
state.count,
{[action.playerId]: 0})
}
}
}
case ADD_PLAYER:
return Object.assign({},
state,
{amountOfPlayers: state.amountOfPlayers+1},
{
count: Object.assign({},
state.count,
{[state.amountOfPlayers]: 0}
})
}
);
return state;
}
И, наконец, если вам нужно сопоставить свое состояние с реквизитом, просто возьмите с подсчета, используя идентификатор этого игрока. Возможно, лучше написать редуктор, но я надеюсь, что вы поняли идею.