编辑:我最终选择了Mobx.js,请参阅@mweststrate答案了解详情。
关于redux的所有学习资源都展示了如何将它与普通对象模型一起使用。 但是当你使用一些es6 Class模型时,我无法弄清楚如何使用它。
例如,让我们采用这种状态:
{
players:{
000:{
life:56,
lvl:4,
//...
},
023:{
life:5,
lvl:49,
//...
},
033:{
life:679,
lvl:38,
//...
},
067:{
life:560,
lvl:22,
//...
},
//...
}
这个课程(未经测试)
class Player{
id; //int
life; //int
lvl; //int
buffs; //[objects]
debuffs; //[objects]
inventory; //[objects]
_worldCollection; //this class know about the world they belongs to.
constructor({WorldCollection}){
this._worldCollection = WorldCollection;
}
healPlayer(targetId, hp){
this._worldCollection.getPlayer(targetId).setHealth(hp);
}
// setter
setHealth(hp){
this.life += hp;
}
}
想象一下,我在WorldCollection中收集了100名玩家。什么是最好的方式?
{
players:{
001:{
life: 45,
lvl: 4,
buffs: [objects]
debuffs:[objects]
inventory:[objects]
},
034:{
life: 324,
lvl: 22,
buffs: [objects]
debuffs:[objects]
inventory:[objects]
},
065:{
life: 455,
lvl: 45,
buffs: [objects]
debuffs:[objects]
inventory:[objects]
},
//...
}
这可以通过在构造函数
中注入dispatch
来完成
//...
constructor({WorldCollection, dispatch})
//...
在每个setter中发送一个动作。
// setter
setHealth(hp){
this.life += hp;
dispatch({type:"HEAL_PLAYER", data:{id:this.id})
}
将所有逻辑放在reducer中(setter逻辑是确定性的和原子的)。
...
case "HEAL_PLAYER":
return {
...state,
life: state.life + action.hp
};
...
临:
缺点:
{
players:[
001,
002
//...
]
}
这可以通过在每个dispatch
中使用setter
并在每个setter之后发送操作来完成
// setter
setHealth(hp){
this.life += hp;
dispatch({type:"PLAYER_UPDATED", data:{id:this.id})
}
更改新树状态时。我调用mapStateToProps
和WorldCollection.getPlayer()
来检索正确的实例并将其属性映射到视图。
优点:
缺点:
我希望我没有过多地简化这个案子。我的观点是澄清redux是否可以用于某些类模型。
---非常预先实验---
我在一周前发现了Mobx.js,它的简单/性能让我感到高兴。
我认为我们可以观察每个班级成员(它们共同构成应用程序状态)
@observable life; //int
@observable lvl; //int
@observable buffs; //[objects]
@observable debuffs; //[objects]
@observable inventory; //[objects]
并且其他地方有一个构建状态树的类,也许Redux在这里有意义吗? (注意我不知道如何做这个部分。必须在Mobx中深入挖掘)
这是纯粹的redux / mobx比较中的优点/缺点对于我的情况。
优点:
缺点:
答案 0 :(得分:9)
我想补充一点,如果你要使用Redux ,你就不会在课堂上存储状态。在Redux中,这个逻辑将在reducers中描述,reducers将在普通对象而不是类实例上运行。您将保持数据规范化,以便每个实体通过其ID保存在对象映射中,并且对子实体的任何引用都是ID数组而不是实际引用。然后,您将编写选择器来重建您关注的数据部分以进行渲染。
您可能会发现this discussion有用,以及这两个示例:
答案 1 :(得分:6)
(MobX author). For a short answer on the questions about MobX:
Redo / undo can be implemented in two ways:
Single state tree:
答案 2 :(得分:3)
您可能希望查看redux-orm,这几乎就是这样。它为Redux状态下的实际普通对象数据提供了一个类似于模型的外观,并且非常好地处理关系数据。