React Native 之使用 immutable.js 提升

作者: immutable | 来源:发表于2016-08-04 10:28 被阅读1380次

    React Native的ListView是一个很常用的组件,它能很轻松的展示列表的数据,
    并且可以方便的加入 下拉刷新加载更多的功能.

    但最新一次打印日志时发现, ListView在进行下拉刷新加载更多时多了很多不必要的绘制.

    看图-----
    页面的ListView是这样的,每次获取6行数据


    控制台是这样的,执行了6次render Item的操作


    进行了下拉刷新,再看console

    数据明明没有进行改变,但啥也不顾,就又多了6次 renderItem

    再尝试 下载更多,console是这样的

    擦,数据明明只增多了6个,却把没有改变的数据都重新render一遍.

    到了这种时候,我们不能不尝试了做些什么了.还好,react 里面有一个方法,shouldComponentUpdate,该方法的作用就是判断 是否需要重新render.返回false则表示不需要重新render.

    但这里我们又不能直接返回false,为啥,因为下拉刷新操作你数据有可能会变啊,永久返回false之后当你数据变了但不重新renderItem,这将是个BUG.

    关键在于 对象比较, 只要子布局里面的 对象与从服务端拿到的对象 里面的值是相等的,才返回false,否则返回true.

    Immutable.js 是一个 一旦创建则不可更改的数据,使用该库 能高效的比较对象里面的值 是否完全相等.

    Immutable 深入比较示例方法

    'use strict';
    var  Immutable = require('immutable');
    
    
    let abc=Immutable.Map.of("item",[{'xx':'xx'},{'bb':'ccc'}]);
    let bcd=Immutable.Map.of("item",[{'xx':'xx'},{'bb':'ccc'}]);
    
    
    console.log(Immutable.is());  //true
    
    let map1 = Immutable.Map({a:1, b:1, c:1});
    let map2 = Immutable.Map({a:1, b:1, c:2});
    console.log(Immutable.is(map1, map2));           // false
    

    本人的实践方式


    再使用了 Immutable.is 比较后,多余的renderItem真的没了,而且当下拉刷新时,某个对象改变了,只会有 对应的item进行render.

    该方法适用于有下拉刷新上拉加载的功能的ListView,因为重复多余的render 对于产品级应用 杀伤太可怕.

    相关文章

      网友评论

      • 萌萌的微重口:用purerendermixin行吗?
        我只是一个单线程_:PureRenderMixin只是简单的浅比较,不能使用于多层比较。自己去做复杂比较的话,性能又会非常差。deepCopy 和 deepCompare 一般都是非常耗性能的。

        Immutable 则提供了简洁高效的判断数据是否变化的方法,只需 === 和 is 比较就能知道是否需要执行 render(),而这个操作几乎 0 成本,所以可以极大提高性能。




      • 苍都:谢谢,帮了大忙
      • 302c42b68461:不错哦
      • 3b2ed2b36dc3:现在已经使用rn应用到项目了吗?我最近开始学习热更,感觉很不适应,本来是写oc的
        3b2ed2b36dc3:@immutable 一起加油!有问题我就来问你噢
        immutable:@请叫我痞子蔡 @请叫我痞子蔡 已经准备应用到项目中。刚开始都这样,共同努力!!!
      • 冰_心:很好,不错,学习一下

      本文标题:React Native 之使用 immutable.js 提升

      本文链接:https://www.haomeiwen.com/subject/vzecsttx.html