什么是不可变数据?
不可变数据是指一旦创建就不能更改的数据。
通过使用不可变数据,我们可以轻松处理缓存、回滚和数据更改检测等问题,并简化我们的开发。
js中的不可变数据在javascript中,我们可以通过深度克隆来模拟不可变数据,即每次对数据进行操作时,深度克隆都会生成一个新的数据。
深度克隆
/** *学习-不可变-克隆-deep.js *由mds在15/6/6创建。*/“使用严格的”;var clone deep=required(' lo dash . clone deep ');var data={ id: 'data ',author: { name: 'mdemo ',github : ' https://github.com/demo hi ' } };var data1=cloneDeep(数据);console.log('equal: ',data 1===data);//false data 1 . id=' data 1 ';data 1 . author . name=' demo hi ';console . log(data . id);//数据console . log(data 1 . id);//data 1 console . log(data . author . name);//mde mo console . log(data 1 . author . name);//当然,demohi,你可能会意识到,这是非常缓慢的。如下图,真的很慢。
简而言之,不可变. js通过结构共享解决了的性能问题。我们先看一个视频,看看不可变. js是怎么做到的。
当我们有一个set操作时,不可变的. js将只克隆其父级以上的部分,其余部分保持不变,这样每个人都可以共享同一个部分,大大提高了性能。
从10到1010熟悉React.js的人应该都知道React.js是一个UI=f(states)的框架。为了解决更新问题,React.js使用虚拟dom,通过diff修改dom,实现高效的dom更新。
听起来很完美,但有一个问题。当状态更新时,如果数据保持不变,还会做虚拟dom的diff,这样会导致浪费。其实这种情况很常见,可以参考flummox的文章。
当然,你可能会说,你可以用purerendemin来解决。PureRenderMixin是一个好东西,我们可以用它来解决上面的一些问题,但是如果你注意的话,可以在文档中看到下面的提示。
复制代码如下:这个只是浅显的比较对象。如果它们包含复杂的数据结构,可能会因为更深层次的差异而产生假阴性。只混合到具有简单道具和状态的组件中,或者在知道深层数据结构已经改变时使用forceUpdate()。或者,考虑使用不可变对象来促进嵌套数据的快速比较。
PureRenderMixin只是一个简单的浅层比较,并不用于多层比较。然后呢?如果你自己做一个复杂的比较,你的表现会很差。
解决办法就是用不可变的. js来解决这个问题。因为状态更新中每次有数据变化,PureRenderMixin都可以立即判断数据变化,可以大大提高性能。这部分也可以参考官方文件不变性助手。
总结一下:使用purerendrmixin不可变. js。
不变性助手
PureRenderMixin
不可变js