【问题标题】:Passing redux state to reducer将 redux 状态传递给 reducer
【发布时间】:2019-02-17 19:31:33
【问题描述】:

我正在尝试通过单击从 dom 中删除一个元素。我在没有 redux thunk 的情况下没有问题,但现在我遇到了问题。我的减速器不知道状态。如何让他知道物品是什么?

行动:

export function deleteItem(index) {
    return {
        type: 'DELETE_ITEM',
        index
    };
}

我的减速器显示未定义。

export function deleteItem(state = [], action) {
    switch (action.type) {
        case 'DELETE_ITEM':
            const copy = state.items.slice()
            console.log(copy)
        default:
            return state;
    }
}

这是我的实际代码https://github.com/KamilStaszewski/flashcards/tree/develop/src

【问题讨论】:

  • deleteItem 被触发了吗?我认为问题不在上面列出的代码上。
  • 动作被触发。它正在通过索引。问题在于reducer,他不知道应用程序的实际状态(state.items)
  • 为什么要从store 本身中删除它?您可以将其从组件状态中删除。为什么要从store 中删除?
  • 正确的做法是什么?
  • @Abinthaha : 如果商品应该从商店中使用,它们不应该也从商店中移除吗?

标签: reactjs redux redux-thunk


【解决方案1】:

我看到了你的代码,你正在为你想要对你的项目完成的每个操作(ei itemsHaveError,deleteItem,...)定义一个新的减速器,但是这样做的正确方法是存储所有项目的相关函数到单个减速器,该减速器保存每当对项目发生某些操作时需要更改的数据,但是按照您的操作方式,任何时候发生任何操作,因为您的减速器是分开的,初始状态会像您一样为空传递给函数,reducer 不知道它们的相关数据,所以他们用空的初始状态覆盖它们,正确的方法是为项目编写单个 reducer:

    const initialState = {
      isLoading: false,
      hasError: false,
      items: [],
    };

    export default function(state = initialState, action) {
      switch (action.type) {
        case ITEMS_HAVE_ERROR:
          return {
            ...state,
            hasError: action.hasError,
          };
        case ITEMS_ARE_LOADING:
          return {
            ...state,
            isLoading: action.isLoading,
          };
        case ITEMS_FETCH_DATA_SUCCESS:
          return {
            ...state,
            items: action.items,
          };
        case DELETE_ITEM:
          const copy = state.items.slice()
          return {
            ...state,
            items: copy,
          };      
        default:
          return state;
      }
    }

所以这将是您的 item.js 和您的 item reducer,并且是唯一应该使用 combineReducer 函数的。

【讨论】:

  • 现在我有错误:没有为关键“减速器”提供减速器商店没有有效的减速器。确保传递给 combineReducers 的参数是一个对象,其值为 reducers “Reducer”是传递给 combineReducers 的 mainreducer,有什么问题?感谢您的回复。
  • 我能看到你的reducer文件和你的index.js在修改后吗?
  • 作为一个猜测,我认为从你的 index.js 中你正在导入 reducer,比如 import {items} from './items' 但是在上面的代码中我使用了导出默认函数,所以你应该导入它喜欢:从 './items' 导入项目不像 {items}
【解决方案2】:

默认表示reducer的初始状态,状态是一个空数组,你不能访问state.items,因为它是未定义的。假设:

const x = [];
x.foo.slice();

这将返回一个错误。因此来自:

state = []

改成:

state = {
     items:[]
}

将其应用于您的代码:

export function deleteItem(   
state = {
     items:[]
}, 
action) {
    switch (action.type) {
        case 'DELETE_ITEM':
            const copy = state.items.slice()
            console.log(copy)
        default:
            return state;
    }
}

【讨论】:

  • items 数组用 componentdidmount 填充了 api 数据,我想访问这个数组
  • 持有整个数组的Reducer也应该连接到操纵数组本身的reducer。如果未连接,则需要将整个数组传递给函数。
  • 我知道出了什么问题,但我不知道如何解决。如何将填充了 api 数据的项目传递到该 reducers 状态?
  • 您是否尝试过记录状态?试试 console.log(state) 看看里面有什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2017-08-12
  • 2020-10-29
  • 2017-10-18
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多