React Redux 组件更新/渲染 原理 connect之mapStateToProps 看这篇就够了!比中文文档好用!

本文详细解析了React Redux中connect函数的mapStateToProps原理,探讨为何修改state后组件未更新的原因,以及如何通过浅比较判断组件是否需要重渲染。文中通过多个示例说明了如何正确和错误地使用mapStateToProps,强调了纯函数的重要性以及浅拷贝在性能优化中的作用。

本文深入浅出mapStateToProps,解答:

  • 为什么修改state,组件未渲染/更新?
  • 如何从新旧state判断更新的值、未更新的值,从而决定是否re-render?

Redux中,state作为单一的数据源,众所周知,每次更新state都要通过return { ...state, others }来返回一个新的state,但是它是怎么来判断一些组件到底要不要re-render(刷新、重渲染)呢?尤其是当state层次很深的时候,会有效率问题、该刷新时不刷新的问题吗?

其实关键在于这个connect()函数的第一个参数:mapStateToProps。下面举个例子:

/*
假设state的结构如下:
state = {
  user: {username: 'root', name: '根'};
  globals: {showMenu: true, showModal: false};
};
*/

function mapStateToProps(state) {
   
   
  return {
   
   
    user: state.user,  // 比如常见的获取用户信息
    showMenu: state.globals.showMenu,  // 比如state层次有多层,可以直接获取到那个深层的数据
  };
}

export default connect(mapStateToProps)(MyComponent);

众所周知,mapStateToProps必须是个纯函数,只要有相同的输入,一定会有相同的输出,不会有任何副作用,没有异步操作。输入是state,输出是一个对象,这个对象会变为被connect组件的props

其实,这个函数通常是选取了state的一个子集,通过props映射到了组件上。如果这个子集更新了,那么组件就会re-render。具体原理、过程如下:

原理

state更新时(即nextState !== state,注意这里用===来比较,所以每次更新state需要用文章开头的方式来更新),
react-redux会调用所有的mapStateToProps函数(所以每个mapStateToProps函数应该很快能运算结束,不然会成为应用性能瓶颈),
针对每次调用mapStateToProps,检查函数的结果(

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hull Qin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值