在反应中,它是否需要重新渲染dom的方法是测试对象/函数的引用。
因此,在每次更新时,都会计算所有JS。含义元素元素每次返回两个全新的对象,一个用于maptDispatchToProps
,另一个用于mapStateToProps
:
const mapStateToProps = (state, ownProps) => {
return {
active: ownProps.filter === state.visibilityFilter
}
}
const mapDispatchToProps = (dispatch, ownProps) => {
return {
onClick: () => {
dispatch(setVisibilityFilter(ownProps.filter))
}
}
}
在上面的代码中,我们每次都会看到一个新对象,其中包含active
键,然后是一个包含新函数的新对象到onClick
。在每个js循环中,对这3个的引用都是全新的。 React将比较这些引用,然后它将重新计算组件中的js。但我认为使用redux不需要测试shouldComponentUpdate
,当所有这3个引用发生变化时,这怎么可能呢?特别是onClick
,会对removeEventListener
做出反应,然后再次使用onClick
添加addEventListener
。
答案 0 :(得分:2)
你误解了如何浅层平等"作品。 React的PureRenderMixin
和React Redux的connect
函数都使用"浅层相等"确定某些事情是否真的发生了变化。这意味着比较两个对象的顶级值以查看每对值是否===
相等,而不是比较对象本身是否相同相同。所以,如果我有:
var a = {q : 42};
var b = {a : a};
var c = {a : a};
然后B和C是明显不同的对象,但浅层相等,因为对于它们两者而言," a"字段指向同一个对象。
此外,对于React Redux的connect()
函数,它主要检查mapStateToProps
的返回值,以查看包装的组件是否需要更新。