我有一个简单的聊天应用程序和以下商店:
MessageStore
- 所有用户/聊天组的消息ChatGroupStore
- 所有聊天组UserStore
- 一般所有用户我使用immutable.js
存储数据。问题是,MessageStore
需要使用ChatGroupStore
和UserStore
中的数据,每条消息的构造如下:
{
id: 10,
body: 'message body',
peer: {...} // UserStore or ChatGroupStore item - destination
author: {...} // UserStore or ChatGroupStore item - creator of the message
}
我如何根据MessageStore
和ChatGroupStore
更新来更新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
}
}
如果有人可以对此有所了解,那将会很棒。我真的很困惑。
答案 0 :(得分:0)
我在所有情况下都可以看到的最佳解决方案是不要嵌套相关数据,并且避免对来自服务器的数据进行转换,这将减少我需要做的工作量,以使数据保持最新状态。任何时候都约会。然后,在您看来,您要做的就是订阅更改并汇总必要的数据。
还有一个名为Redux且维护良好的状态容器解决方案,我建议所有人至少应该尝试一下。尽管您可以单独创建每个化简器,但它只有一个存储并将整个状态组合为一个深层对象。它也是将其与React集成的好方法,请参见Usage with React。