是否有任何特殊的"良好做法"在Redux中减少动态创建项目的状态?在这种特殊情况下,我会处理可能随时加入/离开应用,桌面和游戏的用户列表。
let userReducer = (user, action) => {
switch(action.type) {
case 'table:create':
case 'table:join': return {
...user,
tables: [...user.tables, action.tableId]
}
case 'table:leave': return {
...user,
tables: user.tables.filter(tableId => tableId != action.tableId)
};
case 'game:join': return {
...user,
games: [...user.games, action.gameId]
};
case 'game:leave': return {
...user,
games: user.games.filter(gameId => gameId != action.gameId)
};
}
}
let usersById = (users = {}, action) => {
let user = users[action.userId];
switch(action.type) {
case 'user:join': return {
...users,
[action.user.id]: action.user
};
case 'user:leave': {
users = {...users};
delete users[action.userId];
return users;
};
case 'table:create':
case 'table:join':
case 'table:leave':
case 'game:join':
case 'game:leave': return {
...users,
[action.userId]: userReducer(user, action)
};
}
return users;
}
第二个函数的switch语句中的最后五个案例对我来说特别难看。也许我可以用if压缩它? (如果已定义用户,则将userReducer应用于它)。
let usersById = (users = {}, action) => {
let user = users[action.userId];
if(user)
return {
...users,
[user.id]: userReducer(user, action);
}
switch(action.type) {
case 'user:join': return {
...users,
[action.user.id]: action.user
};
case 'user:leave': {
users = {...users};
delete users[action.userId];
return users;
};
}
return users;
}
答案 0 :(得分:1)
我认为创建减速器并不是一种好的做法。
我个人更喜欢使用你的第一个例子的方法,因为它使你的代码更具可读性。此外,它还允许您为所有减速器保持相同的结构。
答案 1 :(得分:0)
相反,这看起来像一些组织良好的减速器逻辑。但是,是的,如果你想使用这样的if
语句,你绝对可以 - 根据Redux FAQ on using switch statements,可以在reducer中使用你想要的任何逻辑方法。
有关组织裁减器逻辑的方法的详细信息,请参阅Redux docs section on "Structuring Reducers"和我最近的博文Idiomatic Redux: The Tao of Redux, Part 2 - Practice and Philosophy