在React和Redux中处理关系的惯用方法

时间:2017-10-16 00:35:35

标签: reactjs react-redux

我想知道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;
    }
}

对于这种情况,让我们说角色非常静态。他们只需要在登录时刷新。但是,约会数据会更频繁地刷新,并且有一个单独的操作/缩减器来获取约会数据(无需获取用户/角色数据)

2 个答案:

答案 0 :(得分:1)

在我看来,您的缩减器和操作需要基于工作流而不是基于实体。

在您的情况下,您可以使用一个loginReducer来处理与用户相关的所有状态更新,而不是使用userReducer,rolesReducer和appointmentReducer。

答案 1 :(得分:0)

很难说你的应用程序实际上有多复杂,但这里有一些评论:

  • 您不需要多个减速器。只需使用reducer和一个reducer功能就可以保存API到您所在州的整个响应。 (如果您的状态结构略有不同,您可以在减速器内进行修改。)

  • 我认为你只需要让你的主要状态结构正确,然后从一个处理所有不同动作的大型减速器开始。如果它变得太大你可以开始在不同的文件中切片,但从架构的角度来看,它仍然是一个减速器。

  • 如果稍后你有一个不同的API,只提取约会,例如,为它添加一个reducer函数(不是新的reducer),并在该状态下更新该用户。

  • 我认为让角色缩减器听取用户操作是没有错的。但是再次在你的情况下,它们应该是相同的减速器,因为它们访问相同的状态。

  • 在设计状态时,尽量保持状态(稍后从React访问它时很有用)并尝试永远不要复制数据。

祝你好运