2.5 React组件state和prop的局限
您可以在百度里搜索“深入浅出React和Redux 艾草文学(www.321553.xyz)”查找最新章节!
2.5 React组件state和prop的局限
是时候重新思考一下多个组件之间的数据管理问题了。在上面修改的代码中,不难发现其实实现得并不精妙,每个Counter组件有自己的状态记录当前计数,而父组件ControlPanel也有一个状态来存储所有Counter计数总和,也就是说,数据发生了重复。
数据如果出现重复,带来的一个问题就是如何保证重复的数据一致,如果数据存多份而且不一致,那就很难决定到底使用哪个数据作为正确结果了。
在上面的例子中,ControlPanel通过onUpdate回调函数传递的新值和旧值来计算新的计数总和,设想一下,由于某种bug的原因,某个按钮的点击更新没有通知到Control-Panel,结果就会让ControlPanel中的sum状态和所有子组件Counter的count状态之和不一致,这时候,是应该相信ControlPanel还是Counter呢?
如图2-5所示,逻辑上应该相同的状态,分别存放在不同组件中,就会导致这种困局。
对于上面所说的问题,一个直观的解决方法是以某一个组件的状态为准,这个组件是状态的“领头羊”,其余组件都保持和“领头羊”的状态同步,但是在实际情况下这种方法可能难以实施。比如上面的例子中,每个Counter记录自己的计数值是很自然的,但是有三个Counter组件,也就有三只“领头羊”,让ControlPanel跟着三只“领头羊”走,似乎不是一个好主意。
另一种思路,就是干脆不要让任何一个React组件扮演“领头羊”的角色,把数据源放在React组件之外形成全局状态,如图2-6所示,让各个组件保持和全局状态的一致,这样更容易控制。
图2-5 组件状态不一致的困惑
图2-6 React中提取出来
图2-6中所示,全局状态就是唯一可靠的数据源,在第3章中我们会介绍,这就是Flux和Redux中Store的概念。
除了state,利用prop在组件之间传递信息也会遇到问题。设想一下,在一个应用中,包含三级或者三级以上的组件结构,顶层的祖父级组件想要传递一个数据给最低层的子组件,用prop的方式,就只能通过父组件中转,如图2-6所示。
也许中间那一层父组件根本用不上这个prop,但是依然需要支持这个prop,扮演好搬运工的角色,只因为子组件用得上,这明显违反了低耦合的设计要求。第3章中我们会探讨如何解决这样的困局。 深入浅出React和Redux