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 对于产品级应用 杀伤太可怕.

相关文章

网友评论

  • 377ea1b0c4c7:用purerendermixin行吗?
    44e11aa8f988: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