2016-10-26 2 views
0

Есть ли способ обновить только некоторые значения в коллекции объектов в хранилище ReactJS? У меня есть вызов, который дает мне весь список клиентов с некоторым анонимным значением. Мне нужно обновить хранилище после получения этого ответа, но затем снова сделать другой вызов службы с этими анонимизированными данными, чтобы получить реальные значения. Мне нужны данные из первого вызова, а также для получения всей информации для моей сетки данных. Итак, как мне обновить свой магазин только с некоторой парой значений ключа, а не с целым набором данных в приложении react-redux?обновить тот же магазин с некоторыми значениями react-redux

+0

Не могли бы вы дать нам более подробную информацию о текущем неизменяемом объекте, который у вас есть в магазине? 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", "стратегия": "Умеренный", "isNew" : правда, "outcomeScorePct": 0.0, "lastActivityDate": "2016-09-03T00: 00: 00", "Наивысший": 11,253554999999999, "outcomeScore": 0, "qualityScoreCalculated": 0, "ytdAvailable": правда,» ytdString ":" 11.253554999999999 "," qualityLabel ":" Poor "}' –

+0

Мои данные - это в основном коллекция этих объектов, где после второго вызова я получаю значения для «clientFirstN ame», и мне просто нужно обновить эти значения и позволить другие данные будут такими, какие есть. –

ответ

0

Вы не указали какой-либо код, но ... вы сделали бы это в своем редукторе.

Допустим, у вас был редуктор с именем clientReducer, вы могли бы сделать что-то вроде этого, если это только один объект, как вы сказали выше.

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 закодированных значений. Я забираю их и делаю еще один вызов службы, когда я заполняю страницу закодированным значением. После ответа от второго вызова мне нужно сопоставить идентификаторы обоих вызовов и изменять соответствующие атрибуты в хранилище, а не все атрибуты. В принципе, накладывается то, что уже присутствует в магазине с декодированным ответом. –

+0

К сожалению, вы получаете * массив * * объектов *? Это верно? – Mirrorcell

+0

Да. Что-то вроде этого. '{" deAnonymizedList ": [{" key ":" @ # $ # @ $ @ 26071 "," value ":" ActualValue26071 "}, {" key ":" @ # $ # @ $ * 51523 "," value ":" ActualValue51523 "}, {" key ":" @ # $ # @ $ @ 38514 "," value ":" ActualValue38514 "}] }' –

Смежные вопросы