这是我目前的减速器:
import { Reducer } from 'redux';
import {
EventState,
LOAD_EVENTS,
LOAD_EVENT_BY_ID,
FETCH_MORE_EVENTS
} from '../types/eventTypes';
export const initialState = {
eventsList: [],
event: undefined,
isLastPage: false
};
const eventReducers: Reducer<EventState, any> = (
state = initialState,
action
) => {
switch (action.type) {
case LOAD_EVENTS:
return {
...state,
eventsList: action.eventsList
};
case FETCH_MORE_EVENTS:
return {
state,
eventsList: state.eventsList.concat(action.eventsList),
isLastPage: action.eventsList.length === 0
};
default:
return state;
}
};
export default eventReducers;
如您所见,案例LOAD_EVENTS
和FETCH_MORE_EVENTS
都共享密钥eventsList
,在获取更多事件时,我将这样的状态称为state
而不是...state
因为它似乎重新初始化了整个减速器的状态。但是,这是正确的方法吗?我认为如果减速器长大,那将是一个错误。
那我该怎么做才能正确清洁该减速器呢?就像我所需要的一样,LOAD_EVENTS
触发后,eventsList
应该变得清晰,并根据LOAD_EVENTS
带来的内容再次填写。基本上,我只需要重置eventsList
的状态,但其余部分应保持不变。
答案 0 :(得分:1)
当您调用state
之类的状态而不是...state
时,您无需重新初始化状态,而是将先前的状态存储在新状态中,如下例所示:
state = {
eventsList: [...someEvents],
event: undefined,
isLastPage: false,
state: {
eventsList: [...someEvents],
event: undefined,
isLastPage: false,
state: {
eventsList: [...someEvents],
event: undefined,
isLastPage: false
}
}
};
这不是一个好的模式/做法,只有在非常必要的情况下。
所以正确,当获取更多事件时,它将使用initialState重置先前的状态。
export const initialState = {
eventsList: [],
event: undefined,
isLastPage: false
};
const eventReducers: Reducer<EventState, any> = (
state = initialState,
action
) => {
switch (action.type) {
case LOAD_EVENTS:
return {
...state,
eventsList: action.eventsList
};
case FETCH_MORE_EVENTS:
return {
...initialState,
eventsList: state.eventsList.concat(action.eventsList),
isLastPage: action.eventsList.length === 0
};
default:
return state;
}
};
但是怎么说,只需要重置eventsList
的状态,但是其余部分应该保持不变,您可以对该减速器保持不变:
case LOAD_EVENTS:
return {
...state,
eventsList: action.eventsList
};
因为像上述示例那样设置eventsList
时,将重置eventsList
并再次填写新数据。但是请不要忘记我说的第一个示例的问题。