react使用immutable.js来优化性能

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对比一下是可以实现对象对比的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值