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 对于产品级应用 杀伤太可怕.
网友评论
Immutable 则提供了简洁高效的判断数据是否变化的方法,只需 === 和 is 比较就能知道是否需要执行 render(),而这个操作几乎 0 成本,所以可以极大提高性能。