是不是应该把应用的所有状态都交给redux来处理?

#1

用了redux和react快一年了,随着对框架使用的越来越熟练,我们遇到了一个需要探讨的问题。是不是应该把应用的所有状态都交给redux来处理?还是在一定程度上保留react组件的局部私有状态?

我的观点是:应该在一定程度上保留react组件的局部私有状态。
局部是指在一个独立的react组件内部,而不是指相对于整棵应用树的局部状态。如两个父子关系的组件,父组件中有一个状态,父子组件都在使用该状态,但该状态对其它组件透明,这种情况我更倾向将这个状态提升到redux store全局级别。

一定程度是指什么程度呢?
这个问题非常不好回答,得视情况而定,如下三种情况我更倾向使用局部私有状态。

  1. UI层面的toggle状态
    有一个组件,这个组件有一个列表和一个展开按钮,默认只显示列表的前10条记录,用户点击了展开按钮后显示所有记录。这个是否展开的状态对应用的影响其实只是view层面的,而且没有任何其他组件可能会读写它的值。这种情况,我觉应该把它作为react组件的局部私有状态。如果把这个状态提升到redux store的全局级别,那么我们要写更多的代码,而且每次这个展开动作都会导致整棵应用树的状态更新。
  2. 为了实现动画而维护的状态值
    有一个组件,默认显示在屏幕的右上角,用户可以通过拖拽鼠标来更改它的坐标。
  3. 为了实现库组件,这个组件既抽象了UI的的展示,也抽象了UI的行为。
    有一个组件,用户向该组件里拖拽了文件之后,该组件就自动将文件上传至server并且显示文件的上传状态。这个组件不仅封装了上传文件组件应该有的样子,也封装了上传文件的行为。这种情况下使用局部私有状态可以让库不依赖redux,更加易用。

大家对这个问题有什么想法,欢迎在这里讨论。

#2

我赞同这个观点

假设有一个图片组件需要动态根据页面高度来更改自身的高度, 无法用CSS替代
那么自然, 我需要把这个组件的style属性的height设置为state内的一个属性, 然后再挂在eventlistener上来动态更新, 类似这种值也应该作为控件的私有状态存在, 如果把这个state放到store内, 不仅会频繁更新store, 由此而产生的每个state也没有任何实际意义, 仅仅是样式上的改变罢了

如果这个控件的state不会对任何控件产生影响, 也不依赖任何store内的state时, 并且自身会频繁更新
我认为这样的状态就应该锁在控件内, 不应该放出来污染store