【问题标题】:Dependency between branches in state tree in ReduxRedux 状态树中分支之间的依赖关系
【发布时间】:2018-01-05 19:19:26
【问题描述】:

我有一个具有以下分支的状态对象(试图遵守"Normalizing the state shape"):

用户

一个元素数组,如

{
  id: 1,
  name: "Werner"
}

来自某个服务器。

用户位置

一个元素数组,如

{
  userId: 1,
  latitude: 45,
  longitude: 70
}

来自某个服务器。

问题

用户可能会因一些操作而改变:SET_USERS_ACTIONADD_USER_ACTIONDELETE_USER_ACTION

每当用户发生某些事情时,我都想更新用户位置(这是一个异步操作,因为数据需要来自服务器)。问题的如何是我正在努力解决的问题。

显然,我无法在 reducer 中获取用户位置(更新用户时),因为在这种情况下,reducer 将不再是纯的。

我可能会在 thunk 中执行此操作,但这意味着我必须将用户位置注意事项添加到每个涉及用户操作的操作创建者中,这在我看来就像 mixing concerns

此外,一旦添加了以某种方式更改用户数组的操作,开发人员需要记住来更新用户位置。我的经验是,这样的事情几乎总会在某个时候被遗忘。

其他并发症

更复杂的是,我们并不总是需要获取位置。仅当显示包含所有用户的地图的组件处于活动状态时,获取用户位置才有意义。并非每个动作都是在我(事先)知道该组件是否可见的地方生成的。一个例子是当我们从服务器(使用 Web Sockets)收到添加或删除用户的通知时。

解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: redux redux-thunk


    【解决方案1】:

    我建议使用https://github.com/kolodny/immutability-helper 使用update 助手的好处是您可以一次进行许多更改而无需多次接触状态。例如:

    import update from 'immutability-helper';
    
    ...
    case SET_USERS_ACTION:
      return update(
        state,
        {
          users: {
            [idx]: { status: { $set: 'ready' }}
          },
          locations: {
            $push: [{...}]
          }
        }
      );
    break;
    

    【讨论】:

    • 感谢您的反应。恐怕我不是很清楚。问题不在于一次更新状态树的两个分支,而是两者都需要同时更新,而两者都需要分别从服务器获取。我宁愿不要用这个新的关注点“污染”所有的动作创作者。此外,当我不打算使用这些位置时,我希望能够跳过从服务器获取新位置。
    猜你喜欢
    • 2017-01-15
    • 2021-02-16
    • 2021-08-04
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2010-11-18
    相关资源
    最近更新 更多