我有一个简单的聊天应用程序和以下商店:
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
}
如何根据ChatGroupStore
和UserStore
更新MessageStore
项目?
我是这样使用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
}
}
如果有人能澄清一下那就太好了。我真的很困惑。
作为一种解决方案,我认为在任何情况下最好的选择都是不嵌套相关数据,避免对来自服务器的数据进行转换,这将减少我在任何时候保持数据最新所需的工作量。然后,在您看来,您所要做的就是订阅更改并将必要的数据组合在一起。
焊剂的替代品
还有一个良好且维护良好的状态容器解决方案,名为Redux,我建议每个人至少尝试一下。它只有一个存储区,并将整个状态组合到一个单独的深层对象中,尽管您可以单独创建每个reducer。它还有一个很好的方法将其与React集成,请参阅React的用法。