如何使用Immutable.js在Flux商店之间提供依赖关系?

时间:2017-01-03 15:45:57

标签: javascript reactjs flux immutable.js

我有一个简单的聊天应用程序和以下商店:

  • MessageStore - 所有用户/聊天组的消息
  • ChatGroupStore - 所有聊天组
  • UserStore - 一般所有用户

我使用immutable.js存储数据。问题是,MessageStore需要使用ChatGroupStoreUserStore中的数据,每条消息的构造如下:

{
    id: 10,
    body: 'message body',
    peer: {...} // UserStore or ChatGroupStore item - destination
    author: {...} // UserStore or ChatGroupStore item - creator of the message
}

我如何根据MessageStoreChatGroupStore更新来更新UserStore个项目?

我正在使用AppDispatcher.waitFor()这样:

MessageStore.dispatchToken = AppDispatcher.register(function(action) {
    switch(action.actionType) {
    case UserConstants.USER_UPDATE:
        AppDispatcher.waitFor([
            UserStore.dispatchToken
        ]);

        // update message logic
        break;
    }
});

从我的角度来看,我必须等待UserStore更新,然后找到更新后的用户的所有消息并更新它们。但是我如何找到更新的同行?我认为通过引用在UserStore中进行搜索是不够的,因为不可变数据在数据更改时不会保留引用,那么我将不得不在查询上应用更多。但是我必须在MessageStore处理程序中应用其他商店的查询逻辑。

目前,我将同伴作为参考存储在每条消息中,也许我应该改为:

{
    id: 10,
    peer: {
        peerType: 'user', // chatGroup
        peerId: 20
    }
}

如果有人可以对此有所了解,那将会很棒。我真的很困惑。

1 个答案:

答案 0 :(得分:0)

我在所有情况下都可以看到的最佳解决方案是不要嵌套相关数据,并且避免对来自服务器的数据进行转换,这将减少我需要做的工作量,以使数据保持最新状态。任何时候都约会。然后,在您看来,您要做的就是订阅更改并汇总必要的数据。

替代通量

还有一个名为Redux且维护良好的状态容器解决方案,我建议所有人至少应该尝试一下。尽管您可以单独创建每个化简器,但它只有一个存储并将整个状态组合为一个深层对象。它也是将其与React集成的好方法,请参见Usage with React