想象一下以下的React结构:
SmartComponentA - > DumbComponentB - > SmartComponentC
同时想象一下,SmartComponentA和SmartComponentC各自在mapStateToProps
函数中连接到状态的不同切片。
最后,假设我们在每个组件的render方法中放置了console.log
。
当我实际尝试这个时,在第一次渲染时,我看到所有组件都按预期记录。但是如果我更改SmartComponentC的数据,我只会看到一条日志消息(C的日志消息),而我看不到SmartComponentA或DumbComponentB记录任何内容。怎么可能? react-redux如何让React更新孩子而不更新其父母?
我原以为shouldComponentUpdate
方法中的the overriding source意味着SmartComponentA不会被重新渲染(因为它的状态切片没有改变),因此会导致短路,从而阻止SmartComponentC重新渲染。虽然connect
的实现与纯渲染mixin不同,但两者都通过更改connect
来工作,但纯渲染文档明确指出React将“拯救”(如他们所说)父母不需要重新渲染:
对于C2的子树和C7,它甚至不必计算我们在
shouldComponentUpdate
上提供的虚拟DOM。
{{3}}
如果我的问题仍然不清楚,这里有一些设置的伪代码,我问为什么我可以继续输入C的输入,它只记录C的消息到控制台而不是A和B(为什么不是短路)?
shouldComponentUpdate
在第一个渲染中我看到所有日志消息,然后如果我一直输入输入,我每次按一个键时都只会看到C的日志消息。
答案 0 :(得分:3)
Prop更改会触发React组件生命周期,这通常会触发每个子组件的生命周期,除非 - 如您所见,该过程可能会被shouldComponentUpdate短路。
但道具改变并不仅仅是触发组件生命周期的因素 - 状态变化也是如此。这就是连接功能的工作原理。 Connect组件subscribes to the store和任何商店更改checks to see,如果它将更新智能组件的道具(基于mapStateToProps)。如果是这样,它将set it's own state触发Connect组件及其子组件的生命周期功能。