我在 react-native 和 redux 中处理 API 调用的地方

Posted

技术标签:

【中文标题】我在 react-native 和 redux 中处理 API 调用的地方【英文标题】:Where I handle API calls in react-native and redux 【发布时间】:2016-11-08 11:04:40 【问题描述】:

我正在使用 react-native + redux + immutable 构建一个 android 应用程序

我的应用是这样构建的

/src
 -/components
 -/actions (where I have action types and actions)
 -/reducers
 -/api (I'm not sure if I'm doing this right)

好的,所以我有一个操作需要使用 fetch 进行 API 调用,如下所示:

import * as types from './casesTypes'

export function getCases() 
    return 
      type: types.GET_CASES
    

这是case reducer:

const initialState = fromJS(
  isLoading: false,
  cases: null
)
export default function cases(state = initialState, action = ) 

    switch(action.type) 

        case types.REQUEST_CASES:
          return state.set('isLoading', true)

        case types.RECIVE
          return state.set('cases', //set here the array that I recive from api call)

        default:
          return state
    

所以,问题是我真的不明白,我应该在哪里进行 API 调用,以便在 reducer 中我可以将我的初始状态与我从 API 调用中收到的内容合并?

【问题讨论】:

【参考方案1】:

您的应用程序结构合理。

我还推荐使用 redux-thunk 来处理调度。以下是它在您的情况下的工作方式:

假设您的状态树中有“案例”。 我会按照您的建议将 API 调用放入您的操作中以获取新案例:

import * as types from './casesTypes'

export function getCases() 
    return fetch(...)
             ...
             .then((json) => 
               dispatch(         
                 type: types.RECEIVED_CASES,
                 isLoading: false,
                 cases: json,
               

现在在你的 reducer 中,只需获取新调度的操作即可将新案例与状态树合并:

const initialState = fromJS(
  isLoading: false,
  cases: null
)

export default function cases(state = initialState, action = ) 

    switch(action.type) 

        case types.REQUEST_CASES:
          return state.set('isLoading', true)

        case types.RECEIVED_CASES:
          return Object.assign(, state, 
            cases: state.cases.merge(action.cases),
          );

        default:
          return state
    

我目前正在使用这种结构,并且效果很好。希望对您有所帮助!

【讨论】:

【参考方案2】:

您应该尝试redux-thunk 或redux-saga,它们是为处理异步操作(如进行 API 调用)而创建的 redux 中间件。

查看这个使用 redux-thunk 的项目:sound-redux-native

【讨论】:

以上是关于我在 react-native 和 redux 中处理 API 调用的地方的主要内容,如果未能解决你的问题,请参考以下文章

我无法在带有 redux 的 react-native 中使用地理定位

在 React-native 中使用 Redux Toolkit 持久化存储

路由器状态没有通过 redux 保持在 react-native

React-Native Redux reducer switch 语句忽略类型

无法使用react-native app中的redux-persist检查索引/主文件上是否已加载持久状态

如何在 App.js (React-Native) 中访问 redux 状态