javascript - 用于动态创建项目的 reducer

标签 javascript reactjs redux

在减少动态创建项的状态方面,Redux 中是否有任何特定的“良好实践”?在这种特殊情况下,我正在处理可能随时加入/离开应用程序、牌 table 和游戏的用户列表。

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 来浓缩它? (如果定义了 user,则对其应用 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;
}

最佳答案

我认为没有任何好的实践来创建 reducer 。

我个人更喜欢使用第一个示例的方法,因为它使您的代码更具可读性。此外,它还允许您对所有 reducer 保持相同的结构。

关于javascript - 用于动态创建项目的 reducer ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44267424/

相关文章:

javascript - antd 上传控件需要 action 函数,但我不需要它

javascript - react native Redux : Error Can't find variable mapStateToProps

reactjs - React hook 等待上一个调用完成

reactjs - 返回什么?

javascript - Redux reducer 的替代品

javascript - 为什么 react native redux reducer 有时被调用两次有时只被调用一次?

javascript - 如何根据另一个元素的左值将一个类添加到一个元素?

javascript - 在我的特定 div 上实现视差效果的简单方法?

reactjs - 使用 Apollo 和 React 捕获身份验证失败后如何正确重定向

javascript - 使砌体画廊在表格单元格 div 内工作?