Rest 与Angular2 ngrx类似的Twitter应用程序。结构化应用状态
我最近一直在研究ngrx和redux模式,我在想如何将现有的Angular2应用程序重写为使用ngrx/store。 我拥有的是一个应用程序,用户可以在其中查看(如果已登录)并喜欢和发布引用。 典型的引用对象如下所示:Rest 与Angular2 ngrx类似的Twitter应用程序。结构化应用状态,rest,angular,routing,redux,ngrx,Rest,Angular,Routing,Redux,Ngrx,我最近一直在研究ngrx和redux模式,我在想如何将现有的Angular2应用程序重写为使用ngrx/store。 我拥有的是一个应用程序,用户可以在其中查看(如果已登录)并喜欢和发布引用。 典型的引用对象如下所示: { 课文:“成功是在不丧失热情的情况下从一次失败走向另一次失败的能力。”, 发布者:user12345, 职级:14, //更多数据 } 应用程序结构如下所示: 主页-带有注册/登录表单或随机引用(如果已登录) 带有选项卡的配置文件页面 选项卡,其中包含用户发布的所有引用以及
{
课文:“成功是在不丧失热情的情况下从一次失败走向另一次失败的能力。”,
发布者:user12345,
职级:14,
//更多数据
}
应用程序结构如下所示:
- 主页-带有注册/登录表单或随机引用(如果已登录)
- 带有选项卡的配置文件页面
- 选项卡,其中包含用户发布的所有引用以及发布新引用的表单
- 配置文件信息
- 引文提要页
- 页面以查看与上述结构类似的其他用户的配置文件。(当用户单击引文发布者时)
AppState {
UserState {
UserCitationsState,
UserInfoState,
AuthState
},
RouterState,
UserPageState //State representing the other user's page viewed
//etc
}
主要的问题是-由于所有数据都是从后端REST api的每个请求中获取的,所以我应该在每个状态中存储什么。是否只是布尔值,例如:
UserPageState {
loading: false,
loaded: true
}
或者它也应该存储所有信息,并在每次请求新用户页面时替换它?当用户每次导航到其他用户页面时,所有数据都从后端获取。
这就是我最困惑的地方——如何用redux处理这类应用
编辑
目前,我用5个状态(5个减缩器)来表示整个应用程序:
导出接口AppState
{
localUser:AuthState
//主页
家庭引文:引文州
//档案页
profileInfo:UserState
简介引文:引文列表状态
收藏夹引文:引文列表状态
订阅者:UserListState
//userPage(当本地用户导航到引文发布者的配置文件时)
userInfo:UserState
用户引用:引文列表状态
userSubscribers:UserListState
//提要页
提要:引用列表状态
//.....
}
我对此的最初想法是,考虑应用程序状态,就像考虑数据库一样
我将使用以下减速器进行结构调整:
AppState: {
CitationState
UserProfileState,
UserInfo,
RouterState
}
interface CitationState {
citations: Citation[]
}
interface UserProfileState {
userProfiles: UserProfile[]
}
interface UserInfo {
userInfo: UserInfo
}
interface Citation {
id: number;
publisherId (userId): number;
rank: number;
text: string;
}
interface UserProfile {
userId: number;
citationIds: number[]
}
interface UserInfo {
userId: number;
authToken: string;
}
然后,每个智能组件将根据渲染视图的需要合成数据。例如,您可以通过检查路由的用户配置文件是否与UserInfo reducer中的配置文件匹配来确定用户配置文件是否是您自己的
不要担心在状态中创建加载/加载,这是您可以从存储的状态派生出来的。由于所有数据都是可观察的,因此当您从中查询时,您将获得可用数据的最新快照
加载用户引用时,不要绑定到存储的加载属性,而是为该数据构建查询
例如:
let userCitation$ = state.select(appState => appState.citations)
.map(citations => {
let userCitation = citations.find(c => c.id === userId);
return {
loaded: !!userCitation,
userCitation: userCitation
};
});
你能看看我做的编辑吗。你觉得这种结构怎么样?因为目前我只能想象我的应用程序状态为每页。这取决于每个状态的内容。例如,homeCitation(主页)中包含哪些数据?在我看来,你应该试着概括一下数据。不要认为这个页面需要这些数据并将其放在页面缩减器中,而是应该考虑如何将这些数据放在其他页面可以使用的地方。除非你有一个特定的属性要保存,否则我不会对页面进行缩减。我看到引用列表状态有多种用途。请记住,如果您在应用程序中的任何位置都有重复的数据,那么您可能是做错了。例如,引用是否可以同时存储在Favorite引文和提要中?如果答案是肯定的,那么您需要创建一个名为引文的缩减器,并将所有引文都收集在那里。@PeterSmith,您完全正确。我的意思是,我只有一个缩略词——引文。但是,AppState包含多个子状态,这些状态使用引文缩减器。我在这里的一个单独问题中更详细地描述了我的问题:。如果你能看一看,我将非常感激。