Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 需要在redux的reducer中的数组中追加数据_Javascript_Reactjs_Redux_React Redux - Fatal编程技术网

Javascript 需要在redux的reducer中的数组中追加数据

Javascript 需要在redux的reducer中的数组中追加数据,javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,我正在进行分页,在这里我将获得每个页面单击的数据。我想用以前的值附加数据。这是我当前的代码。我不知道该怎么做 const InitialProjects={ projectList:[], error:null, loading:false } export const projects=(state=InitialProjects,action)=>{ switch(action.type){ case ActionTypes.FETCH

我正在进行分页,在这里我将获得每个页面单击的数据。我想用以前的值附加数据。这是我当前的代码。我不知道该怎么做

const InitialProjects={
    projectList:[],
    error:null,
    loading:false
}

export const projects=(state=InitialProjects,action)=>{
    switch(action.type){
        case ActionTypes.FETCH_PROJECTS:
            return Object.assign({},state,{
                projectList:[],error:null,loading:true
            })
        case ActionTypes.FETCH_PROJECTS_SUCCESS:
            return {
                projectList:action.payload

            }
        case ActionTypes.FETCH_PROJECTS_FAILURE:
            return Object.assign({},state,{
                projectList:["not-found"],error:action.payload.message||action.payload.status,loading:false
            })
        default:
            return state;
    }
}
我的第一个反应是这样的

[
{
  Id:0,
Name:india
},
{
Id:1,
Name:bang
},
{
Id:3,
Name:us
},
{
 Id:5,
Name:uk
}
]
   [
    {
      Id:8,
    Name:india
    },
    {
    Id:12,
    Name:bang
    },
    {
    Id:19,
    Name:us
    },
    {
     Id:35,
    Name:uk
    }
    ]
第二个反应是这样的

[
{
  Id:0,
Name:india
},
{
Id:1,
Name:bang
},
{
Id:3,
Name:us
},
{
 Id:5,
Name:uk
}
]
   [
    {
      Id:8,
    Name:india
    },
    {
    Id:12,
    Name:bang
    },
    {
    Id:19,
    Name:us
    },
    {
     Id:35,
    Name:uk
    }
    ]
请注意,id字段可能不是连续的。 我想在我的redux里有这样的东西

projectList:
0(pin): {Id:1,Name:'dewd'}
1(pin): {Id:2,Name:'tyytg'}
2(pin): {Id:5,Name:'xsx'}
3(pin): {Id:4,Name:'tyyt'}
4(pin): {Id:10,Name:'xsx'}
5(pin): {Id:17,Name:'xsx'}

感谢您的帮助。谢谢您可以在每次成功后传播结果

case ActionTypes.FETCH_PROJECTS:
  return {
    ...state,
    error: null,
    loading: true,
  }
case ActionTypes.FETCH_PROJECTS_SUCCESS:
   return {
     ...state,
     projectList: [...state.projectList, ...action.payload]
    }

看起来对象扩展操作符在您的情况下不起作用。因此,您的答案的
ES5
版本是

    case ActionTypes.FETCH_PROJECTS_SUCCESS:
       return Object.assign(
                {}, 
                state, 
                { 
                   projectList: state.projectList.concat(action.payload)
                });
这将使用
对象将
状态
中以前的所有值复制到新对象中。分配
然后通过将
状态.项目列表
中的旧值与
操作.有效负载
中的新值串联起来,覆盖新的
项目列表
属性


希望有帮助

感谢@Hemerson的可能副本。我在…附近出错,状态为意外标记。谢谢。我添加了babel插件转换对象rest spread,现在没有错误。但是当我检索响应时,以前的值将被新值替换!!!从
案例操作类型中删除
projectList:[]
。获取项目:
,然后它就会工作:)如果projectList是一个对象怎么办?如何在不覆盖键的情况下浅层合并两个对象?如果
projectList
是一个对象,则基本上需要一个额外的
对象。分配
而不是
.concat
。如果需要在不重写的情况下浅层合并对象,则应将第二个和第三个参数的顺序交换为
对象.assign
。就我所了解的
对象.assign
的工作原理而言,它区分对象的根级别键,并返回具有唯一键的新对象,交换对象将始终覆盖顺序中的第一个对象。控制台:const a={1:1,2:2};常数b={1:3,2:2};log(Object.assign({},a,b));log(Object.assign({},b,a));无论如何谢谢你的帮助是的,就是这样。交换顺序时,第一个对象的根级别键(现在技术上是第二个)不会被第二个对象中的相同根级别键覆盖。这不是你想要的还是我误解了你的问题?不,我想在分配的新对象中保持两个键冗余。我已经做了一个transformer函数,将响应对象转换成数组,在存储中使用,而reducer将简单地将传入的转换数组再次连接到存储中。无论如何,谢谢你的帮助。