我正在使用react-redux webapp
,直到现在,所有操作都与ajax
请求相关,因此我使用的是redux thunk and axios
。
现在,我正在使用一个组件来创建一个名为“tasks”的对象列表。这应该非常简单:动作调用发送任务对象,减速器将它添加到“任务”状态内的数组中。
问题是,当调用reducer时,总是会重写tasks对象数组。在reducer调用开始时执行console.log我发现状态总是为空。
以下是代码:
import {DROP_TASK} from '../actions/types'
export default function (state = {}, action) {
switch (action.type){
case(DROP_TASK):
console.log("state", state); // here is shows object{}
console.log('tasks', state.tasks);
if(state.tasks === undefined || state.tasks === null ) {
return {...state, list: [action.payload]}
}
return {...state, list: [...state.tasks.list, action.payload]};
default:
return state
}
}
在index.js的createStore
我在做:
const createStoreWithMiddleware = applyMiddleware(reduxThunk, logger)(createStore);
其中logger只是console.log在每次调度之前和之后的整个状态。所以我知道在调度reducer函数之前,“任务”会在第一次调用后填充。
以下是我如何组合减速器:
import { combineReducers } from 'redux';
import {reducer as form} from 'redux-form';
import {reducer as uiReducer} from 'redux-ui';
import authReducer from './auth_reducer';
import treeReducer from './tree_reducer';
import media_asset_list_reducers from './media_asset_list_reducers';
import tasks from './tasks';
const reducers = combineReducers({
form: form,
auth: authReducer,
tree: treeReducer,
media_asset_list: media_asset_list_reducers,
tasks: tasks,
ui: uiReducer
});
export default reducers;
任何人都可以帮助我吗?
由于
答案 0 :(得分:0)
您没有展示如何组合减速器。但在我看来,你的一半reducer被编写为在表单tasks.list中获取子状态,但它只返回表单中的新状态。
如果使用combineReducers组合reducer,则每个组合的reducer只获得它的子部分(也就是它应该返回的部分)
答案 1 :(得分:0)
尝试:
import {DROP_TASK} from '../actions/types'
export default function (state = {}, action) {
switch (action.type){
case(DROP_TASK):
return {...state, list: [...state.list, action.payload]};
default:
return state
}
}
您的reducer将会收到状态的state.tasks
切片,因此无需在此缩减器中包含.tasks
。
这将导致状态树如:
{
... //other reducers
tasks: {
list: []
}
}
如果您要删除list
图层并且只有tasks
列表,您可以将减速器更改为:
import {DROP_TASK} from '../actions/types'
export default function (state = [], action) {
switch (action.type){
case(DROP_TASK):
return [...state, action.payload];
default:
return state
}
}
此外,DROP_TASK
似乎是一种奇怪的操作类型,用于将项目添加到list
...但不了解您的应用的更多信息,这可能仍然合适,所以如果是这样,请忽略它。< / p>