我想知道React / Redux中用于处理返回关系数据的API响应(以及如何更新redux存储)的惯用方法。比如说,当用户登录时,我们发出这样的API请求来检索用户数据:
GET /users/[:id]
返回:
{
"id": 14,
"first_name": "Bob",
"last_name": "Smith",
"appointments": [
{
"id": 234,
"time": "morning"
},
{
"id": 456,
"time": "afternoon"
}
],
"roles": [
{
"id": 789,
"description": "EYE_DOCTOR"
},
{
"id": 654,
"description": "EAR_DOCTOR"
}
]
}
我对这两种方法中的哪一种“更好”(或者如果还有另一种方法)感到困惑。
方法1:将关系操作(rolesFetched,appointmentmentsFetched)导入userActions.js
并从那里调度。适当的Reducer将处理他们感兴趣的操作。将roleActions导入userActions文件这是“好”做法吗?
// userActions.js
export function login(data) {
return dispatch =>
usersApi.fetch(data).then(user => {
dispatch(userFetched(user));
dispatch(rolesFetched(user.roles));
dispatch(appointmentsFetched(user.appointments));
});
}
方法2:只调度userFetched操作并让rolesReducer和appointmentmentsReducer监听(如果你是一个角色缩减器,那么监听用户操作是“好”的做法吗?):
// userActions.js
export function login(data) {
return dispatch =>
usersApi.fetch(data).then(user => {
dispatch(userFetched(user));
});
}
// rolesReducer.js
export default function rolesReducer(state = initialState, action = {}) {
switch (action.type) {
case USER_FETCHED:
return action.user.roles;
default:
return state;
}
}
对于这种情况,让我们说角色非常静态。他们只需要在登录时刷新。但是,约会数据会更频繁地刷新,并且有一个单独的操作/缩减器来获取约会数据(无需获取用户/角色数据)
答案 0 :(得分:1)
在我看来,您的缩减器和操作需要基于工作流而不是基于实体。
在您的情况下,您可以使用一个loginReducer来处理与用户相关的所有状态更新,而不是使用userReducer,rolesReducer和appointmentReducer。
答案 1 :(得分:0)
很难说你的应用程序实际上有多复杂,但这里有一些评论:
您不需要多个减速器。只需使用reducer和一个reducer功能就可以保存API到您所在州的整个响应。 (如果您的状态结构略有不同,您可以在减速器内进行修改。)
我认为你只需要让你的主要状态结构正确,然后从一个处理所有不同动作的大型减速器开始。如果它变得太大你可以开始在不同的文件中切片,但从架构的角度来看,它仍然是一个减速器。
如果稍后你有一个不同的API,只提取约会,例如,为它添加一个reducer函数(不是新的reducer),并在该状态下更新该用户。
我认为让角色缩减器听取用户操作是没有错的。但是再次在你的情况下,它们应该是相同的减速器,因为它们访问相同的状态。
在设计状态时,尽量保持状态(稍后从React访问它时很有用)并尝试永远不要复制数据。