【问题标题】:previous state in reducers in redux with reactredux 中减速器的先前状态与反应
【发布时间】:2017-06-14 01:19:54
【问题描述】:

这是我的减速器的样子:

export default function catalogReducer(state = initialState.catalogItems, action){
  switch (action.type) {
    case types.LOAD_CATALOG_SUCCESS:
      return {
         count:action.count,
        products :[...state['products'],
        action.catalogItems  ?
        [...action.catalogItems['products']]
          :
          []
      ]
    default:
      return state;
  }
}

我想做什么:

  1. 这是一个用于加载目录项的减速器

  2. 项目来自分页 API。

  3. 我需要将结果从 api 添加到现有的列表 产品

问题:

我希望 state 参数应该与之前的状态相关联,但不,它总是从我在应用程序启动时初始化状态的 initialState 中获取值。

这是为什么呢?有什么办法呢?

基本上,我需要通过分页 api 返回完整的项目集,而不仅仅是 products 数组中给定页面的产品。 我最终得到的只是上次 api 调用的产品数组,因为 state.products 总是被初始化为一个空数组

另外,一般来说,我对在 react 和 redux 中处理分页 api 感到非常困惑,并且无法找到一个简单的示例。

一个方向将不胜感激。

这是 initialState.js 文件的样子:

import cookie from 'react-cookie';

export default {
 categories:[],
  sessionId: cookie.load('sessionId') || '',
  youMayLikeItems : [],
  catalogItems: {'products': []}
}

//这个文件是为了集中初始化store中的状态

【问题讨论】:

  • 你能提供你的initialState吗?
  • @IlyaLyamkin:请。更新

标签: reactjs redux


【解决方案1】:

基本上,你需要记住你不应该改变状态。

export default function catalogReducer(state = initialState, action) {
  switch (action.type) {
    case types.LOAD_CATALOG_SUCCESS:
      return {
        ...state,
        catalogItems: {
          count: action.count,                          
          products: [
            ...state.catalogItems['products'],
            action.catalogItems  ?
              action.catalogItems['products']
              :
              {}
          ]
        }
  default:
    return state;
  }
}

你可以找到更多有用的例子here

另外,最好在没有深层对象的情况下创建简单状态 (docs) 并使用 Immutable.js

【讨论】:

  • 但是由于某种原因,阵列没有散开。你能确认一下为什么会这样吗?
  • 你想达到什么目的?在这种情况下,我们有一个对象catalogItems 包含count 和一个数组product 与多个对象。如果我们想要多个products,我们需要更改代码
  • 因此,如果您想拥有包含许多数组的数组 products,请尝试将对象包装在数组 action.catalogItems ? [action.catalogItems['products']] : []
  • 嘿,我有几个问题: 1. 为什么从 reducer 返回整个状态对象而不仅仅是目录项? 2. 我需要将reducer 在上次调用中返回的产品与当前调用中返回的产品合并,以便目录项目将迭代所有产品。产品在 catalogItems 内的产品数组中
  • 1.这就是减速器的工作原理。他们应该返回整个状态。但是您可以使用combineReducers 创建多个具有不同状态的reducer 以避免大状态。在您的情况下,您可以仅为产品项目创建catalogReducer,并使用sessionId 等创建pageReducer。 2. 我认为产品数组中的对象应该分散开来。目前您只能从当前通话中检索产品吗?
猜你喜欢
  • 1970-01-01
  • 2016-04-23
  • 2016-11-24
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多