2016-10-26 37 views
0

有沒有辦法僅更新ReactJS存儲中的對象集合中的某些值?我有一個電話,讓我把所有的客戶名單都帶上了一些匿名的價值。我需要在收到此響應後更新商店,但是再次使用這些匿名數據再次進行服務調用以獲取真實價值。我需要第一次調用的數據以及第二次調用數據網格的所有信息。那麼,如何僅使用一些關鍵值對更新我的商店,而不是使用react-redux應用程序中的整個數據集呢?使用某些值更新同一商店react-redux

+0

您能否給我們更多關於商店中當前Immutable對象的細節? ImmutableJS根據數據類型有很多方法:List,Map,... – Ryan27

+0

數據看起來像這樣: '{「pid」:「132430-26071-1102-10064340-42193」,「clientSalutation 「:」Mr。「,」clientFirstName「:」@#$#@ $ * 26071「,」clientLastName「:」@#$#@ $ @ 51523「,」contractTypeDescription「:」APS 04「,」currency「: 「EUR」, 「的QualityScore」:0 「qualityVal」:32, 「portfolioTotalAssets」:1.316970318E7 「的clientId」:132430 「portfolioKey」: 「1102-10064340.11」, 「策略」: 「中等」, 「是否新款」 :真 「outcomeScorePct」:0.0 「lastActivityDate」: 「2016-09-03T00:00:00」, 「YTD」:11.253554999999999 「outcomeScore」:0 「qualityScoreCalculated」:0 「ytdAvailable」:真」 ytdString「:」11.253554999999999「,」qualityLabel「:」Poor「}' –

+0

我的數據基本上是這些對象的集合,在第二次調用後,我得到」clientFirstN ame「的值,我只需要更新這些值並讓其他數據保持原樣。 –

回答

0

您沒有提供任何代碼,但是...您可以在您的減速器中執行此操作。

假設你有一個名爲clientReducer的reducer,如果它只是一個對象,如上所述,你可以這樣做。

function clientReducer(state, action) { 
    return Object.assign({}, state, { 
    [action.payload.key] : action.payload.value 
    } 
} 

你的行動將是這個樣子:

function changeClientValue(key, value) { 
    return { 
     type: 'CHANGE_CLIENT_VALUE', 
     payload: { 
     key: key, 
     value: value 
     } 
    } 
} 

對於對象的數組,我認爲這應該不使用任何額外的庫一樣不可改變JS工作。雖然我還沒有測試過!

const initialState = [ 
    { 
     id: 1, 
     clientFirstN‌​ame: 'Paul', 
     ...otherFields 
    }, 
    { 
     id: 2, 
     clientFirstN‌​ame: 'Adam', 
     ...otherFields 
    } 
]; 

// Reducers 
function clientSubReducer(state = initialState, action) { 
    switch(action.type) { 
     case 'MODIFY_CLIENT': 
      return { 
       ...state[action.payload.index], 
       ...action.payload.fields 
      } 
    } 
} 

export function clientReducer(state, action) { 
    switch(action.type) { 
     case 'MODIFY_CLIENT': 
      return [ 
       ...state.slice(0, action.payload.index), 
       clientSubReducer(state, action), 
       ...state.slice(action.payload.index + 1) 
      ] 
    } 
} 


//Action 
function modifyClient(client) { 
    return (dispatch, getStore) => { 
     const store = getStore(); 
     let storeIndex = -1; 

     for (let i = 0; i < store.clients.length; i++) { 
      const storeClient = clients[i]; 
      if (client.id === storeClient.id) { 
       storeIndex = i; 
      } 
     } 

     // Our store contains the client object 
     if (storeIndex > -1) { 
      dispatch({ 
       action: 'MODIFY_CLIENT', 
       payload: { 
        index: storeIndex, 
        fields: client // You could diff the client and store client and pass only the ones you want to modify back 
       } 
      }) 
     } 
     //Our Store does not contain the client object 
     else { 
      dispatch({ 
       action: 'ADD_CLIENT', 
       payload: { 
        client: client 
       } 
      }) 
     } 
    } 
} 
+0

謝謝。但我得到的數據大約是1000.所以會有至少1000個編碼值。我選擇它們並進行另一次服務調用,同時我使用編碼值填充頁面。在第二次調用的響應之後,我必須匹配來自兩個調用的ID,並更改商店中的相應屬性,而不是所有屬性。基本上與解碼後的響應疊加在商店中已經存在的內容。 –

+0

對不起,所以你得到*對象*的數組* *?那是對的嗎? – Mirrorcell

+0

是的。像這樣的東西。 '{「deAnonymizedList」:[{「key」:「@#$#@ $ @ 26071」,「value」:「ActualValue26071」},{「key」:「@#$#@ $ * 51523」值「:」ActualValue51523「},{」key「:」@#$#@ $ @ 38514「,」value「:」ActualValue38514「}] }' –