WhatAKitty Daily

A Programmer's Daily Record

关于React State和Redux State的思考

WhatAKitty   阅读次数loading...

背景

React生态内的Redux可以说是一个鲜明创新性的库,它很好的解决了数据流的管理问题。但是,与此同时,也引入了一个问题的探讨:

如何选择Redux State和React Component State

Redux文档、ReactJS相关ISSUE内都探讨过这类问题,我们可以来看下如下三种情况:

  • 将所有state存储到Redux内
  • 将所有state存储到React Component内
  • 按需使用Redux state和React Component State

我们针对这三种情况分析一下具体的优缺点。

将所有state存储到Redux内

先来看下将所有state放置在Redux内进行管理,即不管是网络数据获取、UI动作状态、应用状态都将存储到Redux的state树内。

优点

  • 所有状态统一维护,都能够通过Redux追踪state的整个生命周期;
  • 数据传递由上至下,每个页面或者组件只负责渲染数据,不需要关心具体state的管理。

缺点

  • 对于存在大量交互的复杂页面来说,需要将所有数据都维护到redux,代码量相当多。当然,也要解决方案,比如redux-form
  • 任意一个状态变更都会触发整棵state树的变化,从而引起所有组件需要比较计算,引起不必要的re-render

将所有state存储到React Component内

优点

  • 可以直接操作state,比较简单直接;
  • 无需更新state树,在setState后,只会触发必要的组件re-render,相对来说减少了性能损耗;

缺点

  • 对于全局性的变量,只能通过props一层层组件传递,代码较为冗余,而且难以跟踪差错;

按需使用Redux state和React Component State

优点

  • 代码维护性更高;
  • 需要追踪的数据,可以通过redux进行状态追踪;
  • 内部状态或者某些UI状态,可以直接存储在Component内,减少不必要的性能损耗。

缺点

  • 实际使用上难以把握平衡点;
  • 需要对React和Redux本身有一定的了解和深入;
  • 总体对开发人员的水平要求较高。

平衡点论述

很显然,相对于各一边倒的言论,笔者更倾向于按需使用Redux state和React Component State。或许笔者本身的强迫症的关系,较为追求性能上的考虑;如果单纯将所有state控制在Redux下,笔者有点难以接受。

来看看Redux文档上对于这个点的描述:

There is no “right” answer for this. Some users prefer to keep every single piece of data in Redux, to
maintain a fully serializable and controlled version of their application at all times. Others prefer to
keep non-critical or UI state, such as “is this dropdown currently open”, inside a component’s internal
state.

Using local component state is fine. As a developer, it is your job to determine what kinds of state make
up your application, and where each piece of state should live. Find a balance that works for you, and go
with it.

简而言之:没有什么标准的答案,对于state是全部还是部分放置到Redux下,是要根据你自己的需求来论的。你需要自己掌握好一个平衡,然后尽管去用便是。

同时,Redux文档,给了几个评判的标准,在这里描述翻译下:

  • Do other parts of the application care about this data?
    应用的其他部分是否关心这个数据?
  • Do you need to be able to create further derived data based on this original data?
    你是否需要创建基于最原始数据的衍生数据?(笔者认为就是在某种情况下,你可能需要在最原始数据的基础上,更改某个变量的值,而不是在当前的数据基础上。)
  • Is the same data being used to drive multiple components?
    同一份数据是否会被用来驱动多个组件?
  • Is there value to you in being able to restore this state to a given point in time (ie, time travel debugging)?
    对于将状态恢复到一个给定的时间点对你来说是否有价值?(比如,时间追踪调试)?
  • Do you want to cache the data (ie, use what’s in state if it’s already there instead of re-requesting it)?
    你想要缓存数据吗(比如,使用已经存在状态内的数据而不是去重新请求它)?

如果对于如何使用,仍旧有很多疑问,可以看下这个链接:https://github.com/reactjs/redux/issues/1287 ,在这个ISSUE内,已经有不少人将自己的使用场景以及各种情况都描述的很详细了。

笔者的想法

对于笔者来说,更倾向于如下标准:
存储于Redux内

  • 这个数据会被其他组件共享
  • 这个数据是一个全局性的应用状态(比如用户信息、用户权限等等)
  • 这个数据是路由状态(需要对路由进行跟踪追查)

存储于local component内

  • 纯粹是组件自己的属性(比如一个下拉菜单是否开启关闭,其他组件并不会关系,除非有特殊的业务需求)

说了这么多,希望对以后的自己以及其他人有帮助。

参考资料