一个动作后redux reducer停止工作

时间:2018-09-18 13:41:47

标签: reactjs redux

我有一个后端mongoose数据库(在Express with NodeJS上),带有反应前端。该数据库由一个经过身份验证的用户(使用bcrypt和jwt)和“显示”组成。所有人都能看到节目,但只有经过身份验证的用户才能发布/编辑/删除节目。

我在“编辑节目”部分遇到了麻烦。猫鼬找到正确的节目进行编辑并做出反应后,“ shows” reduce完全停止工作,并且如果我尝试重新加载上一页,则会收到一条消息,提示show.map不是功能。这很可能与我在编辑之前加载一个节目的方式有关,但是我尝试了我能想到的所有内容(state.filter / state.find或只是action.show),但没有运气。我应该补充一点,如果我将GET_SHOW下的return语句更改为“ state”,则重新加载可以正常工作(但我当然无法编辑该节目)。我正在使用React Router进行路由,但我认为这不是问题,因为其他所有功能都可以。

reducer看起来像这样:

const show = (state = [], action) => {
switch(action.type){

    case GET_SHOW:
    return state.find(show => action.show)

    case LOAD_SHOWS:
    return [...action.shows];

    case EDIT_SHOW:
    return action.show;

    case REMOVE_SHOW:
    return state.filter(show => show._id !== action.id)

    default:
    return state;
}

}

表演的动作:

 export const load = show => ({
 type: GET_SHOW,
 show
})

export const getShow = (show_id) => (dispatch, getState) =>{
let { setAdmin } = getState();
const id = setAdmin.user.id;
return apiCall("get", `/api/users/${id}/shows/${show_id}/edit`)
.then(res => dispatch(load(res)))
.catch(err => dispatch(addError(err.message)));
}

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您要在状态对象中保留什么?一个或多个节目?

sig= Gmail.Users.Settings.SendAs.list("me").sendAs.filter(function(account){if(!account.isDefault){return true}})[0].signature;
htmlRange = SheetConverter.convertRange2html(range);
fullBody = htmlRange+"<br><br>--<br><br></p>"+sig;
GmailApp.createDraft(contacts, subject, null,{from:"test@example.com", cc: cc, htmlBody: fullBody}); 

1)看起来像是越野车。您正在调用case GET_SHOW: return state.find(show => action.show) -> 1 case LOAD_SHOWS: return [...action.shows]; -> 2 case EDIT_SHOW: return action.show; -> 3 case REMOVE_SHOW: return state.filter(show => show._id !== action.id) -> 4 default: return state; 的方法,该方法返回被评估为真实的第一个对象。

在您的情况下,如果find是真实的,它将返回状态数组中的第一个对象。

考虑以下示例:

action.show

结果将等于const state = [ 'exampleShow1', 'exampleShow2']; const mockAction = { type: GET_SHOW, show: 'exampleShow3'} const result = state.find(show => mockAction.show)

如果您要使用操作中的数据创建新数组,则可以返回新数组

'exampleShow1'

2)在这里,您将返回一个新的节目数组(状态是一个数组)

3)在这里,您只返回一次演出(状态是一个对象)

4)在这里,您将返回数组而不是一个节目。 (状态是一个数组)

您需要使状态保持一致。