Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.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替换减速器内的整个状态_Javascript_Reactjs_Redux - Fatal编程技术网

Javascript 使用Redux替换减速器内的整个状态

Javascript 使用Redux替换减速器内的整个状态,javascript,reactjs,redux,Javascript,Reactjs,Redux,标题听起来像是有线的,但是如果我从服务器和reducer中收集数据,我只想返回这些数据并将它们设置为新状态,会发生什么呢 例如,从后端获取数据。如果我想这样替换它,我真的需要复制上一个状态吗: export function accountData(state = [], action) { switch (action.type) { case FETCH_FAILURE: console.error('SOMETHING BAD JUST HAPPENED');

标题听起来像是有线的,但是如果我从服务器和reducer中收集数据,我只想返回这些数据并将它们设置为新状态,会发生什么呢

例如,从后端获取数据。如果我想这样替换它,我真的需要复制上一个状态吗:

export function accountData(state = [], action) {
  switch (action.type) {
    case FETCH_FAILURE:
      console.error('SOMETHING BAD JUST HAPPENED');
      break;
    case FETCH_SUCCESS:
        return Object.assign([], state, action.accountData);
    default:
      return state;
  }
}
或者在这种情况下可以这样做:

export function accountData(state = [], action) {
      switch (action.type) {
        case FETCH_FAILURE:
          console.error('SOMETHING BAD JUST HAPPENED');
          break;
        case FETCH_SUCCESS:
            return action.accountData;
        default:
          return state;
      }
    }

是的,您可以替换整个状态。*
对象。assign
是一种简单方便的方法,可以替换部分状态,同时保留所有其他状态,并以不变的方式执行此操作。如果要替换整个状态,则无需使用
Object.assign

(*当我说国家时,我指的是减速器负责的国家部分。)

此外,对数组使用
Object.assign
也没有意义<代码>对象.assign([],状态,操作.accountData)在语义上等同于
Object.assign([],action.accountData)即,它创建数组的新副本。但由于它是一个数组而不是一个对象,因此编写它的更明确、更直观的方法是
action.accountData.slice(0)
[…action.accountData]
。[更正:事实上,
Object.assign
为数组上的索引替换进行索引,这几乎肯定不是您想要的。]

只要将数组视为只读,就可以自行返回数组,而无需复制它。最后一种编写方法是返回action.accountData-完全正确


最后,我必须对
FETCH\u失败
案例提出异议。你不会为这次行动返回任何东西。但是你的减速机应该总是返回一些东西。而不是
break
您可能应该具有
返回状态
返回[]具体取决于您希望如何处理故障案例。

您所说的“一切正常”是什么意思?如果代码做了您希望它做的事情,那么问题是什么?旁白:您默认的
状态是否真的是一个数组?是的,它是一个帐户数组。我经常读到关于不改变状态的文章,如果我只返回帐户而不复制它,我实际上是这样做的。不管是合并旧状态还是整体替换,你都在改变状态。相关,使用
对象。使用数组分配
,我觉得奇怪吗?你确定这和你认为的一样吗?你对将
Object.assign
应用于数组的解释是错误的;它仍然进行浅合并。试试看:
Object.assign([],['a','b','c'],['d'])/->['d','b','c']
hey。谢谢。fetch_失败案例返回了一些东西,我只是将其从代码段中删除以保持其更干净;)