嵌套Redux Reducer中的解构动作

Har*_*mer 1 javascript state ecmascript-6 reactjs redux

我正在调度一个看起来像这样的动作:

{ type: "TOGGLE_FARA", fara: true, id: "5d20d019cf42731c8f706db1" }
Run Code Online (Sandbox Code Playgroud)

“ id”仅用于识别正确的用户。该操作旨在修改我的“ fara”状态的“ enabled”属性。我的商店的fara部分如下所示:

{
   fara: {
     enabled: false, // This need to be flipped...
     names: []
   },
   senators: {
      enabled: false,
      names: []
   },
   senateCandidates: {
      enabled: false,
      names: []
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何构造减速器。我只想更改“已启用”属性。我尝试了几种不同的方法:

export default (state = DEFAULT_STATE, action) => {
    switch (action.type) {
      case "INITIALIZE_SETTINGS":
        return {
          fara: action.fara,
          senators: action.senators,
          senateCandidates: action.senateCandidates,
          emails: action.emails
        }
      case "TOGGLE_FARA":
        return {
          ...state,
          // fara['enabled']: action.fara <–– This won't compile...
          // 'fara.enabled' : action.fara <–––This just gives me a key name with the string 'fara.enabled' 
        }
      default:
        return state;
      }
Run Code Online (Sandbox Code Playgroud)

我本来打算做这样的事情,但这会直接修改您不应该做的状态(我的redux工具扩展说状态是相同的,这是不理想的)。有什么想法吗?

export default (state = DEFAULT_STATE, action) => {
    switch (action.type) {
      case "INITIALIZE_SETTINGS":
        return {
          fara: action.fara,
          senators: action.senators,
          senateCandidates: action.senateCandidates,
          emails: action.emails
        }
      case "TOGGLE_FARA":
        state.fara.enabled = action.fara;
        return {
           ...state
        };
      default:
        return state;
      }
Run Code Online (Sandbox Code Playgroud)

idm*_*ean 5

这将起作用:

return {
          ...state,
          fara: { ...state.fara, enabled: action.fara }
        }
Run Code Online (Sandbox Code Playgroud)

甚至在Redux文档中