dag*_*oin 8 javascript state redux mobx
编辑:我最终选择了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,
//...
},
//...
}
Run Code Online (Sandbox Code Playgroud)
而这堂课(未经测试)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
想象一下,我在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]
},
//...
}
Run Code Online (Sandbox Code Playgroud)
这可以通过dispatch在构造函数中注入来完成
//...
constructor({WorldCollection, dispatch})
//...
Run Code Online (Sandbox Code Playgroud)
在每个setter中发送一个动作.
// setter
setHealth(hp){
this.life += hp;
dispatch({type:"HEAL_PLAYER", data:{id:this.id})
}
Run Code Online (Sandbox Code Playgroud)
并将所有逻辑放在reducer中(setter逻辑是确定性的和原子的).
...
case "HEAL_PLAYER":
return {
...state,
life: state.life + action.hp
};
...
Run Code Online (Sandbox Code Playgroud)
优点:
缺点:
{
players:[
001,
002
//...
]
}
Run Code Online (Sandbox Code Playgroud)
这可以通过使用也完成dispatch每个setter和每个二传手之后分派行动
// setter
setHealth(hp){
this.life += hp;
dispatch({type:"PLAYER_UPDATED", data:{id:this.id})
}
Run Code Online (Sandbox Code Playgroud)
当新树状态改变时.我调用mapStateToProps并WorldCollection.getPlayer()检索正确的实例并将其属性映射到视图.
优点:
缺点:
我希望我没有过多地简化这个案子.我的观点是澄清redux是否可以与某些类模型一起使用.
---这里非常实验---
我一周前发现了Mobx.js,它的简单/性能让我感到高兴.
我想我们可以观察每个班级成员(它们共同形成应用程序状态)
@observable life; //int
@observable lvl; //int
@observable buffs; //[objects]
@observable debuffs; //[objects]
@observable inventory; //[objects]
Run Code Online (Sandbox Code Playgroud)
而在其他地方有一个构建状态树的类,也许Redux在这里有意义吗?(注意我不知道如何做这个部分.必须在Mobx中深入挖掘)
对于我的案例,这是纯粹的redux/mobx比较中的优缺点.
优点:
缺点:
(MobX作者).有关MobX的问题的简短回答:
重做/撤消可以通过两种方式实现:
单状态树:
| 归档时间: |
|
| 查看次数: |
3056 次 |
| 最近记录: |