react-redux可以在不更新父项的情况下更新子智能组件吗?

时间:2016-09-21 03:43:00

标签: react-redux

想象一下以下的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的日志消息。

1 个答案:

答案 0 :(得分:3)

Prop更改会触发React组件生命周期,这通常会触发每个子组件的生命周期,除非 - 如您所见,该过程可能会被shouldComponentUpdate短路。

但道具改变并不仅仅是触发组件生命周期的因素 - 状态变化也是如此。这就是连接功能的工作原理。 Connect组件subscribes to the store和任何商店更改checks to see,如果它将更新智能组件的道具(基于mapStateToProps)。如果是这样,它将set it's own state触发Connect组件及其子组件的生命周期功能。