Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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 反应:导致追溯性副作用的排序功能我的商店?_Javascript_Sorting_Reactjs_Reactjs Flux - Fatal编程技术网

Javascript 反应:导致追溯性副作用的排序功能我的商店?

Javascript 反应:导致追溯性副作用的排序功能我的商店?,javascript,sorting,reactjs,reactjs-flux,Javascript,Sorting,Reactjs,Reactjs Flux,工具: ReactJS0.14.0 香草通量(不确定这是否会影响此问题的性质 今天我遇到了一个让我挠头的bug。在我的商店里,我试图访问数组中的第一个元素,但它不是预期的元素。 我在数组进入存储时打印了它,甚至在它发出后,存储被更新,数组看起来像它应该的样子,但是如果我访问它,例如data[0]它就不会显示打印结果 之后,我终于发现在将数据发送到存储区后调用了排序。 像这样: ServerActionCreators.receiveData(data); data.sort(mySorting

工具:

ReactJS0.14.0

香草通量(不确定这是否会影响此问题的性质


今天我遇到了一个让我挠头的bug。在我的商店里,我试图访问数组中的第一个元素,但它不是预期的元素。

我在数组进入存储时打印了它,甚至在它发出后,存储被更新,数组看起来像它应该的样子,但是如果我访问它,例如
data[0]
它就不会显示打印结果

之后,我终于发现在将数据发送到存储区后调用了排序。

像这样:

ServerActionCreators.receiveData(data);
data.sort(mySortingFunction);
我的问题:


为什么要追溯更新存储中的数据?开发者如何确保这些追溯性副作用不会影响存储的同步操作?出现问题的原因是您和存储都持有对相同数组的引用,并且该方法会对其进行变异

可以通过远离直接变异数组的方法来避免这种行为(
push
pop
shift
unshift
reverse
sort
在执行这些操作之前复制数组

var data = [ ... ];

// give the store a reference
MyStore.sendData(data);

// copy the reference before mutating it
var sorted = copy(data).sort(sortFn);

// continue to work with the copy
// ...
复制对象或列表的方法有很多,具体取决于您使用的Javascript版本

// ES7
const copy = list => [...list]
// ES6
const copy = list => Object.assign([], list);
// ES5
function copy(list) {
  return list.map(function(item) {
    return item;
  });
}
或者,您可以使用不可变或来解决此问题

// mori.js
var data = mori.vector( ... ),
    sorted = mori.sort(sortFn, data);

// immutable.js
var data = Immutable.list( ... ),
    sorted = data.sort(sortFn);
根据定义,当您调用这些数据结构的方法时,它们不会发生变化