Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.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 在不丢失引用的情况下更新ImmutableJS OrderedMap上的记录_Javascript_Reactjs_Reactjs Flux_Immutable.js - Fatal编程技术网

Javascript 在不丢失引用的情况下更新ImmutableJS OrderedMap上的记录

Javascript 在不丢失引用的情况下更新ImmutableJS OrderedMap上的记录,javascript,reactjs,reactjs-flux,immutable.js,Javascript,Reactjs,Reactjs Flux,Immutable.js,我正在使用ImmutableJS OrderedMap在React应用程序中存储ImmutableJS记录。我想知道在不丢失对记录的引用的情况下,处理共享相同值的更新的惯用方法是什么。例如,给定以下代码,如果要在键1处更新的记录与键1处的当前记录具有相同的精确值,那么更新键1处的fooBars对象的正确方法是什么 import Immutable from 'immutable'; let fooBars = Immutable.OrderedMap(); let FooBar = Immut

我正在使用ImmutableJS OrderedMap在React应用程序中存储ImmutableJS记录。我想知道在不丢失对记录的引用的情况下,处理共享相同值的更新的惯用方法是什么。例如,给定以下代码,如果要在键1处更新的记录与键1处的当前记录具有相同的精确值,那么更新键1处的fooBars对象的正确方法是什么

import Immutable from 'immutable';

let fooBars = Immutable.OrderedMap();
let FooBar = Immutable.Record({id: undefined});
let fooBar1 = new FooBar({id: 1});
let fooBar2 = new FooBar({id: 1});

fooBars = fooBars.set(fooBar1.id, fooBar1);
// this will lose reference to fooBar1 despite the values not changing
// and cause the DOM to reconcile forcing a re-render of the component
fooBars = fooBars.update(fooBar2.id, fooBar2);

您正在以正确的方式更新它

要记住的是,对一个不可变对象的每一个突变动作都会产生一个全新的对象

从你的例子来看:

fooBars = fooBars.set(fooBar1.id, fooBar1); 
fooBars2 = fooBars.update(fooBar2.id, fooBar2);
现在有两个对象,fooBars1和fooBars2。它们是完全不同的javascript对象,所以fooBars1!==fooBars2。但是,它们是相同的不可变对象,因此不可变。isfooBars1,fooBars2==true

因此,为了防止重新渲染的发生,您必须点击components shouldComponentUpdate方法来检查旧的道具或状态是否与新的道具或状态相同

shouldComponentUpdate(nextProps){
  return !Immutable.is(this.props.fooBars, next.props.fooBars);   
}

您正在以正确的方式更新它

要记住的是,对一个不可变对象的每一个突变动作都会产生一个全新的对象

从你的例子来看:

fooBars = fooBars.set(fooBar1.id, fooBar1); 
fooBars2 = fooBars.update(fooBar2.id, fooBar2);
现在有两个对象,fooBars1和fooBars2。它们是完全不同的javascript对象,所以fooBars1!==fooBars2。但是,它们是相同的不可变对象,因此不可变。isfooBars1,fooBars2==true

因此,为了防止重新渲染的发生,您必须点击components shouldComponentUpdate方法来检查旧的道具或状态是否与新的道具或状态相同

shouldComponentUpdate(nextProps){
  return !Immutable.is(this.props.fooBars, next.props.fooBars);   
}

这是一个解决方案,但这将使shouldComponentUpdate的速度降低约3倍。shouldComponentUpdate方法经常运行,这会对性能造成很大影响。如果您不想执行该检查,则不要交换底层记录。因为fooBar1!==fooBar2,将键1处的值从fooBar1更改为fooBarN将永远不会导致相同的不可变。如果您没有交换记录,而是更新了记录,那么您将获得原始对象,您可以使用===或pureRenderMixin。updateIn[1,id],函数{return 1}==fooBars这是一个解决方案,但这将使shouldComponentUpdate的速度降低大约3倍。shouldComponentUpdate方法经常运行,这会对性能造成很大影响。如果您不想执行该检查,则不要交换底层记录。因为fooBar1!==fooBar2,将键1处的值从fooBar1更改为fooBarN将永远不会导致相同的不可变。如果您没有交换记录,而是更新了记录,那么您将获得原始对象,您可以使用===或pureRenderMixin。updateIn[1,id],函数{return 1}==fooBars