与相关实体打交道时防止无效状态

时间:2019-01-07 15:41:22

标签: javascript reactjs relationship application-state

考虑一个(ReactJS)应用程序,其中GroupUser实体通过多对多关系相互关联。

状态树如下:

{
  groups: {
    "1": {id: "1", name: "..."}, 
    ...
  },
  users: {
    "42": {id: "42", name: "..."}, 
  ...
  },
  memberships: [
    {groupId: "1", userId: "42"}, 
    ...
  ]
}

在UI中,用户可以“选择”零个或多个组,每个组零个或多个关联用户。当前以这种状态表示:

{
  selectedGroupIds: {
    "1": {selectedUserIds: ["42", ...]}, 
    ...
  }
}

(顺便说一句,下面的设计可能比上面的设计更可取,因为它更明确;希望对此​​发表评论):

{
  selectedGroupIds: [
    {id: "1", selectedUserIds: ["42", ...]}, 
    ...
  ]
}

无论如何,回到主要问题:

当前,当在一个组的上下文中选择一个用户,并且在某个时刻该组和用户断开连接(成员身份终止,用户被删除等)时,selectedGroupIds将处于无效状态州。在编写此代码时,我现在意识到,当删除组或用户时,这也适用于memberships

有什么方法可以设计状态树,从而防止上述情况的发生?还是在改变关系的情况下不可避免地要进行人工整理?

1 个答案:

答案 0 :(得分:1)

membership ends, user gets deleted, etc.时,您必须以层叠方式更新状态并删除断开的关系。这与其他基于关系的状态更新没有什么不同。

如果您不想更新数据中的关系,还可以使数组成为条件数组:

memberships: [
    groups["1"] && users["42"] && {groupId: "1", userId: "42"}, 
    ...
  ].filter(o => o); // the filter is to ensure to remove null values that could be generated by conditions