JerryZhai2019 / gitkills

0 stars 0 forks source link

React Redux组件更新/渲染原理connect中的mapStateToProps #3

Open JerryZhai2019 opened 2 years ago

JerryZhai2019 commented 2 years ago

Redux中,state作为单一的数据源,众所周知,每次更新state都要通过return {...state,others }来返回一个新的state,但是他是怎么来判断一些组件到底要不要re-render呢?

关键点在于connect函数的第一个参数:mapStateToProps

JerryZhai2019 commented 2 years ago

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

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

原理 当state更新时(即nextState !==state,注意这里用===来比较,所以每次更新state需要用文章开头的方式来更新111111)react-redux会调用所有的mapStateToProps函数(所以每个mapStateToProps函数应该很快能运算结束,不然会成为应用性能瓶颈),针对每次调用mapStateToProps,检查函数的结果(是个对象)的每个key的value跟上一次对应的value是否一致如果所有value都一致,不会渲染这个组件;如果有任意一个value变了,就重新渲染该组件

PS. 所以 react-redux 中对mapStateToProps的结果的比较是浅比较,即会遍历所有 key 来判断是否相等,对每个 key 的 value 的判断方法是===。所以,要搞清楚“引用比较”(===)、“浅比较”、“深比较”的差别。