React-native + Redux(Combine Reducers):创建状态结构

Posted

技术标签:

【中文标题】React-native + Redux(Combine Reducers):创建状态结构【英文标题】:React-native + Redux(Combine Reducers): Create state structure 【发布时间】:2019-03-09 17:37:21 【问题描述】:

我正在开发一个 react-native 应用程序,并且是 redux 的新手。我有 3 个屏幕,几乎所有屏幕的所有状态都相互依赖。 例如,第一个屏幕扫描产品,第二个屏幕获取客户详细信息,第三个屏幕显示产品和客户的摘要。 自 2 天以来,我一直在碰壁以创建状态结构,最终得到 combineReducers。但是在 combine reducer 中,每个 reducer 都维护自己的状态切片,并且不允许我访问或更新另一个 reducer 的状态。 所以, Q1。我应该继续使用combieReducers 还是应该只维护单个reducer? Q2。如果 combineReducers 没问题,应该如何访问或更新所有 reducer 的相同状态?

【问题讨论】:

【参考方案1】:

对于您的第一个问题,是的,您必须合并,因为 combineReducers 将在单个对象中提供所有 reducers 数据

示例:

const rootReducer = combineReducers(
  posts: PostsReducer,
  form: formReducer
);

内部组件

function mapStateToProps(state) 
  return  posts: state.posts ;


export default connect(mapStateToProps,  createPost )(PostsIndex);

在上面的代码中通过 Redux connect 你可以访问由组合 reducera 产生的状态,比如 this.props.posts 在你的组件中

要更新,您需要触发一个通过所有 reducer 的操作,并根据类型更新状态

示例:

export function createPost(values, callback) 
  const request = axios
    .post(`$ROOT_URL/posts$API_KEY`, values)
    .then(() => callback());

  return 
    type: CREATE_POST,
    payload: request
  ;

【讨论】:

是的..我做到了。但是我卡住的地方是我如何访问或更新减速器之间的状态?或者我如何在两个减速器中保持相同的状态,在我的例子中 products array 将用于产品扫描的第一个屏幕和显示这些产品的第三个屏幕。 从“lodash”导入_;从“../actions”导入 FETCH_POSTS、FETCH_POST、DELETE_POST ;导出默认函数(状态,动作) 开关(action.type) case DELETE_POST:return _.omit(state,action.payload); case FETCH_POST: return ...state, [action.payload.data.id]: action.payload.data ; case FETCH_POSTS: return _.mapKeys(action.payload.data, "id");默认:返回状态; 这是我的减速器,这里的状态将具有所有范围 import * as Actions from '../Actions' import initialState from './State' const ProductReducer = (state = initialState, action) => switch (action.type) case Actions.SET_CUSTOMER: console.log('this called'); return ...state, bill: ...state.bill, customer: action.customer default: return state export default ProductReducer; 参考以下链接 ***.com/questions/42239302/…【参考方案2】:

使用中间件可以实现功能

export default ( dispatch, getState ) => next => action => 
  next(action);
 const newAction =  ...action, payload: "",state:getState () ;
    dispatch(newAction);
;

【讨论】:

以上是关于React-native + Redux(Combine Reducers):创建状态结构的主要内容,如果未能解决你的问题,请参考以下文章

在react-native中使用redux

React-Native + Redux 将 ID 传递给组件

使用 redux 在 react-native 应用程序中保存访问令牌的最佳实践是啥?

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

使用 react-redux 与 react-native 连接时的不变违规

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