【问题标题】:React-Redux state management: Proper way to store "selected" list items?React-Redux 状态管理:存储“选定”列表项的正确方法?
【发布时间】:2018-01-09 15:04:45
【问题描述】:

我有一个电子邮件应用程序。收件箱页面显示电子邮件列表;每个列表项都有一个复选框,允许用户选择多封电子邮件(他们以后可以删除、移动等)。

我的问题是,存储“选定电子邮件”状态的正确方法是什么?现在,我的州有一个包含一些属性(id、主题、发件人等)的电子邮件对象列表。我应该添加另一个属性“isSelected”吗?或者我应该在商店中创建一个全新的状态,比如“selectedEmails”,然后保存一组当前选定电子邮件的 id?

我的一部分不想将“isSelected”属性添加到电子邮件列表中,因为我不认为这是电子邮件对象应该关注的信息。但是存储另一个选定电子邮件的 id 数组会使根据是否选择了哪些电子邮件来更新 UI 变得更加困难(例如,如果我可以简单地检查 email.isSelected 属性,那么更新 UI 会很容易,比较检查每个电子邮件项目的“selectedEmails”数组以查看它是否被选中)。还是有其他更好的解决方案?谢谢

【问题讨论】:

  • 将其添加到电子邮件列表对象没有意义。您可以创建另一个数据结构,或者直接使用复选框,因为它们已经拥有自己的状态。

标签: reactjs redux react-redux


【解决方案1】:

如果您想将 selectedIds 放在单独的数组中,您可以将 emails 列表标准化,然后创建一个 selectedIds 列表,并使用选择器获取 selectedIds。

想象一个标准化状态,例如:

{
  ids: [1, 2],
  map: {
   1: {id: 1, subject: '1', ...},
   2: {id: 2, subject: '2', ...}
  },
  selectedIds: [2]
}

然后你会有一个选择器函数来获取状态,例如:

const getEmails = (state) => {
  return state.emails.ids.map(id => {
    ...state.emails.map[id], 
    isSelected: state.emails.selectedIds.indexOf(id) !== -1
  });
};

但我认为这个选择器的复杂性太高了,我只会用 isSelected 属性更新电子邮件对象本身。

【讨论】:

  • 谢谢,这似乎是一个更好的方法,而不是在 store 中创建一个新的 state,以及一个新的 reducer。虽然,在考虑之后,我认为甚至没有必要为 id 设置一个单独的数组。我可以简单地拥有所有电子邮件的原始数组,然后是一组选定的电子邮件,它将保存对已选择的每个电子邮件对象的引用,因此我不必担心浪费内存(假设我了解 redux正确状态对象)
  • 我喜欢将“isSelected”状态封装为单独的状态属性,因为它表示 UI 状态并且不是对象的一部分,但我与此作斗争。有什么推荐的资源来了解更多信息吗?
猜你喜欢
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2019-09-12
  • 2016-04-21
  • 2019-09-30
  • 2018-03-04
相关资源
最近更新 更多