Есть ли более простой способ обновления вложенных массивов вact-native (реагировать на избыточность)? - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь обновить массив внутри моего массива (вложенный массив) с помощью response-redux. Я нашел решение, как это сделать, но есть ли более простой способ сделать это, чем передавать в действие несколько параметров.

[types.HISTORY_UPDATE](state, action){
  return { 
    ...state, 
    budgets: [
       ...state.budgets.slice(0,action.id),
       {
        key: action.key,
        id: action.idd,
        name: action.name,
        budgetType: action.budgetType,
        startDate: action.startDate,
        currency: action.currency,
        amount: action.amount,
        amountLeft: action.amountLeft,
        rollOver: action.rollOver,
        color: action.color,
        iconName: action.iconName,
        history: [
          ...state.budgets[action.id].history.slice(0,action.histId),
          {
            note: action.note,
           amount: action.amount,
            type: action.type,
            date: action.date,
            fullDate: action.fullDate,
            hours: action.hours,
            min: action.min,
            month: action.month,
            year: action.year
          },
          ...state.budgets[action.id].history.slice(action.histId+1)
      ]

    },
      ...state.budgets.slice(action.id+1)
      ]
 }
},

, и действие выглядит следующим образом

export function updateHistory(id,key,idd,name,budgetType,startDate,currency,amount,amountLeft,rollOver,color,iconName,histId,........){

Я не хочу тратить время на передачу нескольких параметров, таких как это, при использовании response-redux, а также когда я пытался запустить свое приложение на телефоне, иногда это действительно замедляет работу приложения. Это из-за приведенного выше примера?

Я был бы очень признателен, если бы вы, ребята, нашли решение.

1 Ответ

0 голосов
/ 21 октября 2019

Обычно я не храню массивы в избыточном количестве, так как обновление одного элемента действительно является обузой, как вы заметили. Если все объекты внутри вашего массива имеют уникальный идентификатор, вы можете легко преобразовать этот массив в объект объектов. В качестве ключа для каждого объекта вы берете этот идентификатор.

const convertToObject = (array) => {
    let items = {};

    array.map((item) => {
      items[item.id] = item;
    });

    return items;
  };

В своем действии вы просто передаете элемент, который вы хотите обновить, в качестве полезной нагрузки, и вы можете очень легко обновить хранилище редуксов. В этом примере ниже я просто обновляю объект бюджетов, но та же логика применяется при назначении объекта истории каждому бюджету.

[types.BUDGET_UPDATE](state, action){

  const item = action.payload;

  return {
    ...state,
    budgets: {
      ...state.budgets,
      [item.id]: item
    }   
  }
}

И если вам нужен массив где-нибудь в коде вашего компонента, вы просто конвертируете объект хранилища избыточных данных обратно в массив:

const array = Object.values(someReduxStoreObject);
...