2017-04-23 83 views
0

我正在寫我的第一個更大的反應/ Redux /流星應用程序。我知道Redux並不一定需要在流星應用程序中,但我想使用它。爲什麼我的Redux狀態是嵌套的?

我使用Meteor從MongoDB加載記錄,然後我想將此對象存儲在我的Redux商店中。但是對象被嵌入到商店中,我不知道爲什麼會出現這種情況。

這是到目前爲止我的代碼:

行動負荷遠程記錄

export const loadRecord = (id) => { 
    return dispatch => { 
     Meteor.call('loadRecord', id, (error, result) => { 
      if (!error) { 
       dispatch({ 
        type: TYPE, 
        result 
       }); 
      } else { 
       dispatch({ 
        type: TYPE_ERROR, 
        error, 
       }); 
      } 

     }); 
    }; 
}; 

減速應該更新我的商店

const initialState = { 
    singleRecord: {} 
}; 

export function singleRecord(state = initialState, action) {  
    switch (action.type) { 
     case TYPE: 
      return { 
       ...state, 
       singleRecord: action.result 
      }; 
     default: 
     return state; 
    } 
} 

更店內我希望像這樣:

singleRecord: { 
    id:"1223", 
    text:"abcde" 
} 

但是我得到是:

singleRecord: { 
    singleRecord { 
     id:"1223", 
     text:"abcde" 
    } 
} 

所以我的商店得到更新和一切工作按預期的事實旁邊,我的記錄被莫名其妙地嵌套。 我想我錯過了一件基本的事情,或者我錯誤地實現了它。如果有人能解釋我是否是預期行爲,或者如果不是,可以告訴我爲什麼我的代碼不能按預期工作,這將是非常好的。

在此先感謝

回答

1

你想解開行動的有效載荷:

return { 
    ...state, 
    ...action.result 
}; 

,或者換句話說:

return Object.assign({}, state, action.result); 

我不知道你想還有什麼保存在singleRecord,但它是完全可能的,你想這樣做:

return action.result; 

而且,你的初始狀態應該只是const initialState = {};

對象從singleRecord減速返回的是什麼存儲到singleRecord狀態。

+0

非常感謝。你的答案解決了我的問題。忘了做解包。也感謝不同的實現。 – grahan