在Redux中删除标准化状态中的相关实体的最佳实践

时间:2018-03-20 16:12:41

标签: reactjs redux normalization

从标准化数据中删除实体时,我们如何处理删除被删除实体所拥有的其他实体?例如,对于以下规范化数据,如果我要删除user1,我还要删除user1发布的所有帖子和评论。对于这种情况,是否有任何已知的方法或最佳实践?

{
    posts : {
        byId : {
            "post1" : {
                id : "post1",
                author : "user1",
                body : "......",
                comments : ["comment1", "comment2"]    
            }
        },
        allIds : ["post1"]
    },
    comments : {
        byId : {
            "comment1" : {
                id : "comment1",
                author : "user1",
                comment : ".....",
            },
            "comment2" : {
                id : "comment2",
                author : "user1",
                comment : ".....",
            },
        },
        allIds : ["comment1", "comment2"]
    },
    users : {
        byId : {
            "user1" : {
                username : "user1",
                name : "User 1",
            }
        },
        allIds : ["user1"]
    }
}

1 个答案:

答案 0 :(得分:0)

您可以通过多种方式查看此内容:

  1. 每个元素的reducer负责清除删除用户的任何操作的数据,或者;
  2. 删除用户的操作具有删除多个关联项目的副作用(或调度了许多相关操作)
  3. 选项1

    我们假设你有以下行动:

      const deleteUser = userId => {
        return ({
          type: 'DELETE_USER',
          userId
        })
      }
    

    user的缩减器可能如下所示:

      const users = (state = {}, action) => {
    
        switch (action.type) {
          case 'DELETE_USER':
            // delete user logic
            break;
        }
    
      }
    

    在Redux技术上没有什么可以阻止您对DELETE_USERposts缩减器中的comments操作做出反应:

      const posts = (state = {}, action) => {
        const newState = Object.assign({}, state);
        switch (action.type) {
          case 'DELETE_USER':
            // delete posts for action.userId
            break;
        }
      }
    

    选项2

    如果你不喜欢上述内容,并希望保持某种程度的关注点分离,那么请考虑一种触发与行为相关的副作用的方法,例如redux-saga或{ {3}}

    实施将根据库而有所不同,但想法是:

    1. 倾听DELETE_USER行动
    2. 触发一些操作:
      1. 删除用户(DELETE_USER
      2. 删除用户的帖子(DELETE_USER_POSTS
      3. 删除用户的评论(DELETE_USER_COMMENTS