React+Redux场景下父组件已获取的状态应传props还是子组件用useSelector读取?
场景方案推荐
两种方案没有绝对的对错,要结合你的业务场景判断:
- 如果子组件是可复用的通用组件(比如通用信息卡片、通用表单控件等),需要在不同业务模块甚至非Redux项目中复用,推荐走props传递。这种方式可以让子组件和Redux完全解耦,复用性更强,也更容易做单元测试。
- 如果子组件是当前业务模块的专用组件,不会复用到无Redux的场景,更推荐子组件直接通过
useSelector读取状态。这种方式可以避免多余的props传递逻辑,后续如果子组件需要更多Redux状态时也不用修改父组件的传参逻辑,维护成本更低。 - 如果父组件获取
someInfo后需要做二次加工再传给子组件,直接传加工后的props即可,避免子组件重复执行相同的计算逻辑。
性能对比
两者的性能差异主要取决于重渲染的触发逻辑:
- props传递方案:如果子组件没有用
React.memo包裹,只要父组件触发重渲染(不管是不是因为someInfo变化导致的),子组件都会跟着重渲染。即便用React.memo包裹,父组件重渲染时也会多一层props的浅比较逻辑。 - 子组件直接调用
useSelector方案:子组件的重渲染只和useSelector返回的状态变化有关,和父组件是否重渲染完全无关。Redux内部已经对useSelector的返回结果做了默认浅比较,只有状态真的发生变化时才会触发子组件重渲染。
绝大多数场景下两者的性能差异可以忽略不计,只有在父组件重渲染非常频繁的场景下,子组件直接使用
useSelector的性能优势才会体现出来。
内容的提问来源于stack exchange,提问作者ziondork
相关产品推荐
相关产品推荐

