Redux存储 - 不使用数组时访问对象的键

时间:2016-09-01 09:15:05

标签: reactjs redux

我有一个像这样的redux商店:

 {
  '1f458697-e2c0-4d11-ada0-ee7b113c2429': {
    name: 'Jim',
    title: 'Developer',
    active: true
  },
  '4498eb08-3786-495a-a66c-21a65138ab24': {
    name: 'Darren',
    title: 'Human Resources',
    active: false
  },
  'c7975551-153f-4eab-a875-ed5445f76252': {
    name: 'Francesa',
    title: 'Chief of Internal Operations',
    active: false
  }
}

我有一个可以获得活跃用户的选择器。

export const getActiveUser = (users) => _.find(users, { 'active': true });

我的问题是,在我的React组件中使用的有效负载中包含用户ID的最好方法是什么:

  1. 这是一种不好的做法,而且是我应该使用数组的标志。

  2. 我是否应该更改用户有效负载以包含ID。这是错误的,因为我会复制数据。

  3. 我是否应该操纵该特定选择器以包含用户ID。

2 个答案:

答案 0 :(得分:1)

是的,使用数组表格式数据和filter函数来过滤结果集(如果一次可以激活多个用户)。如果一次只能有一个用户处于活动状态,请考虑更改数据库模式并创建单独的变量activeUserId,而不是让所有用户都包含不必要的有效负载(并相应地更改redux存储的形状)。

答案 1 :(得分:0)

- 这是一种不好的做法,也是我应该使用数组的标志    代替。

规范化数据,因此您可以在O(1)中编辑或删除项目(您的案例中的用户)是一种很好的方法,Dan Abramov的idiomatic redux course也包含了这一点。

- 我是否应该更改用户有效负载以包含ID。由于我要复制数据,这感觉不对。

由于您通常不会更改ID,因此在用户对象中添加ID应该不是问题,它应该可以让您快速访问ID。但是,如果你不愿意复制那也是可以接受的。

- 我是否应该操纵该特定选择器以包含用户ID。

选择器角色的一部分是创建派生数据,就像您过滤用户时所做的那样。因此,如果您想要每个用户的ID,这是一个很好的地方。不要改变对象,只需用ID创建新的用户对象。但是,如果您拥有大量用户,则应使用memoized selectors或将ID添加为有效负载的一部分,以防止出现性能问题。