容器组件不好?应该直接使用store.getState和store.dispatch吗?

时间:2016-05-29 09:57:26

标签: reactjs redux react-redux

在反应中,它是否需要重新渲染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

1 个答案:

答案 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的返回值,以查看包装的组件是否需要更新。