什么是Immutable Data
Immutable Data是指一旦被创造后,就不可以被改变的数据。
通过使用Immutable Data,可以让我们更容易的去处理缓存、回退、数据变化检测等问题,简化我们的开发。
js中的Immutable Data
在javascript中我们可以通过deep clone来模拟Immutable Data,就是每次对数据进行操作,新对数据进行deep clone出一个新数据。
deep clone
/** * learning-immutable - clone-deep.js * Created by mds on 15/6/6. */ 'use strict'; var cloneDeep = require('lodash.clonedeep'); var data = { id: 'data', author: { name: 'mdemo', github: 'https://github.com/demohi' } }; var data1 = cloneDeep(data); console.log('equal:', data1===data); //false data1.id = 'data1'; data1.author.name = 'demohi'; console.log(data.id);// data console.log(data1.id);// data1 console.log(data.author.name);//mdemo console.log(data1.author.name);//demohi
当然你或许意识到了,这样非常的慢。如下图,确实很慢
immutable.js是由facebook开源的一个项目,主要是为了解决javascript Immutable Data的问题,通过参考hash maps tries 和 vector tries提供了一种更有效的方式。
简单的来讲,immutable.js通过structural sharing来解决的性能问题。我们先看一段视频,看看immutable.js是如何做的
当我们发生一个set操作的时候,immutable.js会只clone它的父级别以上的部分,其他保持不变,这样大家可以共享同样的部分,可以大大提高性能。
熟悉React.js的都应该知道,React.js是一个UI = f(states)的框架,为了解决更新的问题,React.js使用了virtual dom,virtual dom通过diff修改dom,来实现高效的dom更新。
听起来很完美吧,但是有一个问题。当state更新时,如果数据没变,你也会去做virtual dom的diff,这就产生了浪费。这种情况其实很常见,可以参考flummox这篇文章
当然你可能会说,你可以使用PureRenderMixin来解决呀,PureRenderMixin是个好东西,我们可以用它来解决一部分的上述问题,但是如果你留心的话,你可以在文档中看到下面这段提示。
This only shallowly compares the objects. If these contain complex data structures, it may produce false-negatives for deeper differences. Only mix into components which have simple props and state, or use forceUpdate() when you know deep data structures have changed. Or, consider using immutable objects to facilitate fast comparisons of nested data.
PureRenderMixin只是简单的浅比较,不使用于多层比较。那怎么办??自己去做复杂比较的话,性能又会非常差。
方案就是使用immutable.js可以解决这个问题。因为每一次state更新只要有数据改变,那么PureRenderMixin可以立刻判断出数据改变,可以大大提升性能。这部分还可以参考官方文档Immutability Helpers
总结就是:使用PureRenderMixin + immutable.js
React.js Conf 2015 - Immutable Data and React
Immutability Helpers
PureRenderMixin
immutable-js
3 详细说明 ffmpeg的每个转换过程像下图描述的程序 _______ ______________ | | | | | input | demuxer | encoded data | decoder | file | ---------> | packets | -----+ |__
DataSet类详细说明 这个wiki条目集中于DataSet类的子类。此处未提到的ChartData的所有其他子类不提供任何具体的增强功能。 Line-, Bar-, Scatter- & CandleDataSet (下面提到的方法能被用在任何提到的DataSet类中) setHighLightColor(int color): 设置用来高亮显示的颜色。不要忘记使用getResources()
本文向大家介绍详细说说CNN工作原理相关面试题,主要包含被问及详细说说CNN工作原理时的应答技巧和注意事项,需要的朋友参考一下 1 人工神经网络 1.1 神经元 神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活
接口说明(用作查询用,不建议在用 Mars 之前通读) Xlog Xlog.java public static native void appenderOpen(Xlog.XLogConfig config); struct XLogConfig{ TAppenderMode mode_ = kAppednerAsync; std::string logdir_; st
本文向大家介绍ffmpeg中文参数详细说明,包括了ffmpeg中文参数详细说明的使用技巧和注意事项,需要的朋友参考一下 FFMPEG 3.4.1 版本参数详细说明 用法:ffmpeg [options] [[infile options] -i infile] … {[outfile options] outfile} … FFMPEG获得帮助: -h - 打印基本选项 -h long - 打印更
Highcharts 提供大量的配置选项参数,您可以轻松定制符合用户要求的图表,本章节为大家详细介绍Highcharts 配置选项使用说明: 参数配置(属性+事件) chart.events.addSeries:添加数列到图表中。 chart.events.click:整个图表的绘图区上所发生的点击事件。 chart.events.load:图表加载事件。 chart.events.redraw: