Immutable.js的替代品,以提高React的性能
Immutable.js alternative to boost React performance
immutable .js除了不可变之外,还提供深度数据结构比较。它允许提高React的渲染性能,因为可以很容易地实现shouldComponentUpdate
方法或使用React -immutable-render-mixin。
但是,我只需要深入比较。有没有不使用Immutable.js
的深度数据结构比较的解决方案?
更新:我有深数据树嵌入对象/数组。每个数组实体依次可能包含另一个对象/数组等等。@MatthewHerbst我看了一下你发布的链接。在我看来,这是一组没有经过测试的飞行器。此外,我不确定这些解决方案是否可以与相当深的数据树相比,在数组中嵌入数组等。
编写自己的深度比较器是一件微不足道的事情。甚至,如果你不太喜欢递归,你可以通过重用immutableJS库(我假设,你不介意在一个地方使用immutableJS)来"懒惰地"做它(使用es6语法):
const deepEquals = (a, b) => immutable.is(immutable.fromJS(a), immutable.fromJS(b))
然而,由于显而易见的原因,这个解决方案不是很有效。如果您关心的是性能(但出于某种原因,您仍然不喜欢immutable.js),您可以使用以下方法:
编写自定义递归deepEquals。使用以下技巧:如果a===b,则a和b深度相等(不需要更多的检查,您可以立即返回true)。如果一个!==b,你必须做一个正确的递归的每个键检查)
在你的代码中,尽量避免变异的东西(这样上面的技巧就会尽可能频繁地生效)。这意味着,
代替:
myObj[newkey] = newval
使用:
let modifiedA = {...myObj, newkey: newval}
这样,创建映射(和数组)的修改版本花费的时间不多,但是比较可以快得多(特别是,如果您的数据结构是嵌套的,但是您的单个映射/数组没有很多直接键)
另一个选择是https://github.com/engineforce/ImmutableAssign,由我创建,这是一个轻量级的不可变助手,它支持不可变性,并允许您继续使用POJO (Plain Old JavaScript Object)。因此,您可以使用===而不是深度对象比较来检查是否相等。
。
var iassign = require("immutable-assign");
var _ = require("lodash");
var o1 = { a: { c: 1 }, b: [1, 2, 3] };
var o2 = iassign(
o1,
function(o) { return o.b; }, // get property to be updated
function(b) { // update select property
return _.map(b, function(i) { return i + 1; });
}
);
// o2 = { a: { c: 1 }, b: [2, 3, 4] }
// o1 is not modified
// o2 !== o1
// o2.b !== o1.b
// o2.a === o1.a
- React重新渲染但未显示正确的组件
- 函数参数中的数据与指定变量之间的任何性能差异
- 提高JQuery的性能
- React组件等待所需道具进行渲染
- React中的数据集表示
- Webpack开发服务器和React服务器端渲染
- React Redux错误页面管理
- React:按键的性能提升
- React+Redux性能优化与组件ShouldUpdate
- React js 性能工具插件抛出“无法读取未定义的属性'计数'”
- React.jS中内联ALL样式的性能问题
- 使用React突出显示列表中的项目时的性能
- 大列表中React子节点上的重复键对性能的影响
- 隐藏React组件,如何“关闭”侦听器/减少性能开销
- 在React中加载SVG的性能
- Immutable.js的替代品,以提高React的性能
- Game Of life (React.js + Redux)的性能问题
- 在React性能度量代码中有一个内部错误
- React性能调试器
- 避免在滚动时重新渲染并提高 React Web 应用程序的性能