如何在 React native redux 的 reducer 中向数组添加元素?

How do I add an element to array in reducer of React native redux?

如何在 reducer 的 redux 状态数组 arr[] 中添加元素? 我正在做这个-

import {ADD_ITEM} from '../Actions/UserActions'
const initialUserState = {
    arr:[]
}

export default function userState(state = initialUserState, action)
{
    console.log(arr);
    switch (action.type)
    {
        case ADD_ITEM: 
            return { 
                      ...state,
                      arr: state.arr.push([action.newItem])
                   }

        default:
            return state
    }
}

push 不是 return 数组,而是它的长度 (docs),所以你正在做的是用它的长度替换数组,失去唯一的参考你拥有的。试试这个:

import {ADD_ITEM} from '../Actions/UserActions'
const initialUserState = {

    arr:[]
}

export default function userState(state = initialUserState, action){
     console.log(arr);
     switch (action.type){
        case ADD_ITEM :
          return { 
             ...state,
             arr:[...state.arr, action.newItem]
        }

        default:return state
     }
}

将项目添加到数组而不改变的两个不同选项

case ADD_ITEM :
    return { 
        ...state,
        arr: [...state.arr, action.newItem]
    }

case ADD_ITEM :
    return { 
        ...state,
        arr: state.arr.concat(action.newItem)
    }

如果需要插入到数组的特定位置,可以这样做:

case ADD_ITEM :
    return { 
        ...state,
        arr: [
            ...state.arr.slice(0, action.pos),
            action.newItem,
            ...state.arr.slice(action.pos),
        ],
    }

我有样品

import * as types from '../../helpers/ActionTypes';

var initialState = {
  changedValues: {}
};
const quickEdit = (state = initialState, action) => {

  switch (action.type) {

    case types.PRODUCT_QUICKEDIT:
      {
        const item = action.item;
        const changedValues = {
          ...state.changedValues,
          [item.id]: item,
        };

        return {
          ...state,
          loading: true,
          changedValues: changedValues,
        };
      }
    default:
      {
        return state;
      }
  }
};

export default quickEdit;

由于这个问题得到了很多关注:

如果您正在寻找这个问题的答案,很有可能您正在学习非常过时的 Redux 教程

官方推荐(自2019年起)为use the official Redux Toolkit to write modern Redux code

除其他外,这将消除字符串动作常量并为您生成动作创建者。

它还将采用允许您在由 createReducercreateSlice 创建的 Reducer 中编写可变逻辑的方法,因此 无需在其中编写不可变代码现代 Redux 中的减速器 首先。

请遵循 official Redux tutorials 而不是第三方教程,以始终获取有关 Redux 良好实践的最新信息,并将向您展示如何在不同的常见场景中使用 Redux Toolkit。

相比之下,在现代 Redux 中,这看起来像

const userSlice = createSlice({
  name: "user",
  initialState: {
    arr:[]
  },
  reducers: {
    // no ACTION_TYPES, this will internally create a type "user/addItem" that you will never use by hand. You will only see it in the devTools
    addItem(state, action) {
      // you can use mutable logic in createSlice reducers
      state.arr.push(action.payload)
    }
  }
})

// autogenerated action creators
export const { addItem } = slice.actions;

// and export the final reducer
export default slice.reducer;

如果你想合并两个数组,一个接一个,那么你可以使用

//initial state
const initialState = {
   array: [],
}

...
case ADD_ARRAY :
    return { 
        ...state,
        array: [...state.array, ...action.newArr],
    }
//if array = [1,2,3,4]
//and newArr = [5,6,7]
//then updated array will be -> [1,2,3,4,5,6,7]
...

这个 Spread 运算符 (...) 迭代数组元素并存储在数组 [ ] 内或数组中的展开元素,您可以简单地使用 "for loop" 或任何其他循环。

嵌套数组最简单的解决方案是concat():

case ADD_ITEM: 
    state.array = state.array.concat(action.paylod)
    return state

concat() 在不改变状态的情况下吐出一个更新的数组。只需将数组设置为 concat() 和 return 状态的输出。