搞定immutable.js详细说明

 更新时间:2016年05月02日 22:22:04   作者:mdemo  
Immutable Data是指一旦被创造后,就不可以被改变的数据。通过使用Immutable Data,可以让我们更容易的去处理缓存、回退、数据变化检测等问题,简化我们的开发

什么是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登场

immutable.js是由facebook开源的一个项目,主要是为了解决javascript Immutable Data的问题,通过参考hash maps triesvector tries提供了一种更有效的方式。

简单的来讲,immutable.js通过structural sharing来解决的性能问题。我们先看一段视频,看看immutable.js是如何做的

当我们发生一个set操作的时候,immutable.js会只clone它的父级别以上的部分,其他保持不变,这样大家可以共享同样的部分,可以大大提高性能。

为什么你要在React.js中使用Immutable Data

熟悉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

相关文章

  • uniapp如何实现tabBar之间传参

    uniapp如何实现tabBar之间传参

    这篇文章主要给大家介绍了关于uniapp如何实现tabBar之间传参的相关资料,文中通过代码示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-08-08
  • 关于JavaScript作用域你想知道的一切

    关于JavaScript作用域你想知道的一切

    关于JavaScript作用域你想知道的一切,本文全部告诉大家,帮助大家全面的了解JavaScript作用域,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • 动态更新highcharts数据的实现方法

    动态更新highcharts数据的实现方法

    下面小编就为大家带来一篇动态更新highcharts数据的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • JavaScript常用8种数组去重代码实例

    JavaScript常用8种数组去重代码实例

    这篇文章主要介绍了JavaScript常用8种数组去重代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 原生JS实现贪吃蛇小游戏

    原生JS实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了原生JS贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 详解JavaScript的懒加载是如何实现的

    详解JavaScript的懒加载是如何实现的

    懒加载(Lazy Loading)是一种在软件开发中常用的优化技术,它主要用于延迟加载资源,直到真正需要使用的时候才进行加载,这样可以减少初始加载的时间和资源消耗,并提升用户体验,本文给大家详细介绍了JavaScript的懒加载是如何实现的,需要的朋友可以参考下
    2024-01-01
  • JS面试必备之手写instanceof,深拷贝,节流和防抖

    JS面试必备之手写instanceof,深拷贝,节流和防抖

    JavaScript如何实现手写instanceof、深拷贝、节流、防抖也是面试时常常考到的知识点,这篇文章为大家进行了详细介绍,需要的可以参考一下
    2023-05-05
  • 使用20行JS代码实现屏幕录制功能

    使用20行JS代码实现屏幕录制功能

    在开发中可能有遇到过屏幕录制的需求,无论是教学、演示还是游戏录制,都需要通过屏幕录制来记录和分享内容,MediaRecorder 是一种强大的技术,可以在浏览器端实现屏幕录制功能,本文将介绍如何使用JS MediaRecorder 实现屏幕录制,需要的朋友可以参考下
    2023-11-11
  • 你不知道的forEach函数解析

    你不知道的forEach函数解析

    这篇文章主要介绍了你不知道的forEach函数的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Javascript String对象扩展HTML编码和解码的方法

    Javascript String对象扩展HTML编码和解码的方法

    Javascript String对象扩展HTML编码和解码的代码
    2009-06-06

最新评论