动态创建项目的Reducers

时间:2017-05-30 16:25:46

标签: javascript reactjs redux

是否有任何特殊的"良好做法"在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;
}

2 个答案:

答案 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