我渲染形式一組動態文本元素。我已經使用normalizr principles規範了我的狀態,所以有一個elementIds數組和一個包含elementIds引用的元素屬性的對象(請參閱下面代碼示例中的初始狀態)。
目的
我的目的是簡單地對兩個渲染的元素是可編輯的。我使用onChange回調函數成功地將一個動作CHANGE_ELEMENT_VALUE分配給我的商店,在reducer中可以使用action.id(引用已更改元素的id)和action.value(新值)(請參閱下面的代碼)。
問題
我的問題是,當我鍵入文本字段沒有發生變化,即使我可以看到使用devtools Redux的擴展狀態改變。我的理解是,反應並不能識別狀態變化,因爲變化是深入的狀態,而且我沒有成功創建一個新的狀態對象,我可能以某種方式引用舊的實例。
減速碼
下面是我的拙劣企圖迫使一個新的狀態對象。我假設它不工作,因爲我的組件沒有被重新渲染。它也顯得非常不雅。
let initialState = {
isLoading: false,
data: {
elementIds: ['name', 'email'],
elements: {
'name': {'id': 'name', 'value':'ben'},
'email': {'id':'email', 'value':'[email protected]'},
},
},
error: false
}
function formReducer(state = initialState, action = null) {
switch(action.type) {
case types.CHANGE_ELEMENT_VALUE:
let newData = Object.assign(state.data)
newData.elements[action.id].value = action.value
return {...state, data: newData}
default:
return state;
}
}
export default formReducer;
我注意到的第一個問題是您濫用Object.assign。如果你測試它,你可以看到'newData === state.data',這是因爲第一個參數是目標。一般來說,你總是會有這個深層次克隆對象的「問題」(如果結構是動態的,它會變得更醜),所以下面的答案可能對你有用。我個人使用https://www.npmjs.com/package/icepick –