项目作者: homkai

项目描述 :
自动分析redux connect依赖的state,减少不必要的mapStateToProps计算和re-render,兼容react-redux
高级语言: JavaScript
项目地址: git://github.com/homkai/react-redux-hk.git
创建时间: 2016-12-12T15:20:54Z
项目社区:https://github.com/homkai/react-redux-hk

开源协议:

下载


react-redux-hk

自动分析connect依赖的state,当且仅当mapStateToProps依赖的state改变时,才会重新计算mapStateToProps,进而触发重新渲染Component

完全兼容react-redux的api,可直接替代

解决什么问题

如下代码:

  1. // 假定state定义如下
  2. const state = {
  3. listData: [],
  4. planId: 0,
  5. unitId: 0,
  6. showEditor: false
  7. };
  8. function getInfo(state) {
  9. return {
  10. planId: state.planId,
  11. unitId: state.unitId
  12. };
  13. }
  14. function mapStateToProps(state) {
  15. return {
  16. planList: state.listData.filter(item => (item.unitList.length > 0)),
  17. info: getInfo(state)
  18. };
  19. }

每次执行mapStateToProps返回的planList、info永远都是一个新的引用。
当showEditor改变,而mapStateToProps实际依赖的listData、planId、unitId没有变时,
mapStateToProps仍然会重新执行,connect的Component也会重新渲染,而这些是不必要的性能损耗。

原理是mapStateToProps的返回值的某一项,值没有改,但是引用改了,导致react-redux的shallowEqual不一致,
进而会重新渲染connect的Component

业务代码中,这样的例子很常见,某一局部状态更新,牵一发而动全身,很多地方不需要重新渲染的,也重新渲染,大大降低页面性能

常见的方案

  • Immutable.js 引入这个库的成本很高,需要很多地方都改成Immutable.js的API
  • reselect 使用这个库也比较麻烦,因为需要显式地用function声明很多状态的依赖,导致mapStateToProps很复杂

react-redux-hk的思路

自动分析mapStateToProps依赖的state,只有当依赖的state改变时,才会重新计算mapStateToProps,进而触发重新渲染Component

注意

使用react-redux-hk替换react-redux时,要保证mapStateToProps是只依赖state和ownProps这两个变量的纯函数(可以依赖外部的常量)

如果mapStateToProps依赖其他变量(这是违反redux原则的,极力反对这样的代码),可以通过传第四个参数options.pureMapState = false来兼容

高级用法

react-redux-hk默认对redux的状态,分析两层(第一层reducer或model,第二层定义的状态字段),这是符合redux状态定义原则的,一般无需修改

如果状态的定义有过多的plain object(把一些子状态放到一同个状态对象下面,当然,一般是不推荐这种写法的)
可以通过传第四个参数options.depStateDepth = 3来调整分析依赖的深度

不需要额外处理,即可自动完成性能优化

已知问题:当state树特别大的时候,IE可能会有问题