Я хочу использовать оператор распространения для добавления данных в мой массив - PullRequest
0 голосов
/ 20 июня 2019

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

{
  ...state,
  selections: {
    ...state.selections,
    [action.data.type]: action.data
  }

Но когда это массив

{
  ...state,
  selections: {
   ...state.selections,
   [action.data.type]: [] // Every time i save something it should end up here
}

, я думал о

{
  ...state,
  selections: {
    ...state.selections,
    [action.data.type]: [
        ...state.selections[action.data.type], 
        action.data]
}

Но это не работает, потому что ...state.selections [action.data.type] его не повторяемый экземпляр.

Это то, чего я хочу достичь

state: {
   selections { 
       products: ["a", "b"]
   }
}

Я пытался разобраться в https://redux.js.org/recipes/structuring-reducers/immutable-update-patterns

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

Попробуйте с этим:

{
  ...state,
  selections: {
    ...state.selections,
    [action.data.type]: Array.isArray(state.selections[action.data.type])
        && [
        ...state.selections[action.data.type], 
        action.data]
        || [
        state.selections[action.data.type], 
        action.data]
}
0 голосов
/ 20 июня 2019

Если state.selections[action.data.type] имеет начальное значение [], когда это массив, это должно работать.

Было бы намного проще, если бы вы показали пример payload и initialState.

Всегда ли action.data является объектом?

{
  ...state,
  selections: {
    ...state.selections,
    [action.data.type]: Array.isArray(state.selections[action.data.type])
      ? [...state.selections[action.data.type], action.data]
      : action.data
}
0 голосов
/ 20 июня 2019

Ваше использование оператора spread должно быть в порядке. Я совершенно уверен, что проблема в том, что вы пытаетесь добавить action.type, который в случае вашего маленького примера будет state.selections с не повторяющимся типом object.

// example
const x = { a: 1, b: { c: []}}
const y = {...x, b: { [x.b.c] : [...x.b.c, 1] }}

console.log(y);
...