immutable是一个可以拿来比较对象的数值是否相等的插件,当然功能肯定不止这些,我这里只用到了对象对比,来优化性能,减少render次数。项目主要是靠dva或者父级组件传入的props来给子组件赋值的,state比较少用到,所以这里只比较了props
import {Map, is,fromJS } from 'immutable';
shouldComponentUpdate返回true代表要重新渲染,false会阻止渲染
shouldComponentUpdate(nextProps) {
const thisProps = this.props;
if(is(fromJS(thisProps),fromJS(nextProps))){
return false;
}
return true;
}
网上很多说拿is(this.props,nextProps)来比较,但实际测试发现is只能判断对象层级只有一层的数据,如下面这种,只能是基本类型的数据,如果是引用类型的数组和对象都会返回false
let aa = {a: 1, b: 2, c: 'dkji'}
let bb = {a: 1, b: 2, c: 'dkji'}
或者这种也可以返回true,应该是引用地址一样的话,转成immutable的map类型是可以知道是原来的引用地址的,所以判断是true,猜测(但props可能是不同的引用地址,所以用不了)
let obj2 = {
products:[
{
id:"11",
name:"phone",
},
{
id:"12",
name:"book",
}
],
cart:{
id:"4",
name:"seaseeyoul",
},
arr:[1,2,3,4,5,6]
}
const map3 = Map(obj2);
const map4 = Map(obj2);
console.log(is(map3,map4));
但将props转为fromJS(将纯 JS 对象和数组深层转换为不可变映射和列表)
再使用is对比一下是可以实现对象对比的。