React native 如何在React native redux的reducer中向数组添加元素?
如何在reducer中redux状态的数组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)
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如果您可以将此标记为答案,那就太好了,因为当前标记的答案在技术上是正确的,但可能会引导人们遵循它,形成一种重复使用的风格。我们真的不建议再学习/教学了。