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

React native 如何在React native redux的reducer中向数组添加元素?,react-native,redux,react-redux,React Native,Redux,React 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)

如何在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
不返回数组,而是返回数组的长度(),因此您要做的是将数组替换为其长度,从而丢失对它的唯一引用。试试这个:

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
     }
}

两个不同的选项可将项添加到数组中而不发生变化

案例添加项目:
返回{
……国家,
arr:[…state.arr,action.newItem]
}

案例添加项目:
返回{
……国家,
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年起)为:

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

它还将采用一些方法,允许您在由
createReducer
createSlice
创建的减缩器中编写变异逻辑,因此首先不需要在现代Redux中的减缩器中编写不变的代码


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

如果需要逐个添加阵列,则可以使用

//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]
...

这种扩展语法(…)迭代数组元素并存储在数组[]中,您可以简单地使用“for loop”或任何循环来做什么。

哪一个更可取?@sapht如果您在ES6中编写代码,则首选第一个更具可读性和优雅性的循环。此外,第一个循环是纯循环,第二个不是。Redux文档中写道:“减速机保持纯净非常重要。在减速机中永远不应该做的事情:1.改变其参数;2.执行API调用和路由转换等副作用;3.调用非纯函数,例如Date.now()或Math.random()。@CharmingRobot第二个函数究竟有多不纯净?1.它不会改变论点;2:没有副作用;3.Array.prototype.concat是一个纯函数@CharmingRobot concat()不会变异原始数组。任何人都可以使用
对象回答此问题。请分配
以获取状态内数组的更改?为什么需要
对象。分配
?它用于对象,本质上是一样的。您可以使用
obj:Object.assign({},state.obj,action.newItem
,只要
obj
newItem
是对象,就可以使用
obj:Object.assign({},state,{arr:[…state.arr,action.newItem])。如果您想对整个状态执行此操作,只需执行
Object assign.assign({},state,{state,{arr:[…state.arr,action.newItem]})
@martinarroyo,谢谢,我这么做了:
var obj={isLoading:true,data:['a','b','c','d']}var newObj=Object.assign({},obj,{data:[…obj.data,'e']};
它给了我这个:
{isLoading:true,data:['a','b','c','d','e']}
对于newObj,这已经足够满足我的需要了。但是我想在不使用扩展运算符的情况下使用Object.assign来生成相同的结果。这可能吗?@Vennesa我想您可以用
[].concat(obj.data,['e']替换它)
,如果您不想使用ES6功能。Object.assign用于对象,虽然在数组中使用它不会给您带来任何错误,但结果不是数组的串联。如果尝试
Object.assign({}[1,2,3],[4])
,您会得到
[4,2,3]
结果是。添加一些描述我在这里遇到了麻烦…虽然这个答案并不完全符合上面的问题。但是,这正是我所寻找的。我正在寻找一种方法,在数组的特定索引中插入一个对象。因此,我对答案投了赞成票。这非常有帮助,节省了我一些时间。谢谢!@coderzzz18如果您可以将此标记为答案,那就太好了,因为当前标记的答案在技术上是正确的,但可能会引导人们遵循它,形成一种重复使用的风格。我们真的不建议再学习/教学了。