【发布时间】:2018-10-05 00:31:56
【问题描述】:
我试图了解 mapStateToProps 返回函数时的机制。
所以我找不到太多文档,除了 Redux 文档中的一小段摘录,它预先说明通过返回一个函数的情况,每个实例都将获得自己的 memoized mapStateToProps 并且另一个用户说这是一种防止 mapStateToProps 被要求任何父道具更改。
所以这对于列表项来说似乎很棒,我不想为不影响项目的任何更改重新渲染大型项目列表。
所以让我感到困惑的部分是 mapStateToProps 不会被任何父道具更改调用,这是否意味着为了重新渲染单个列表“项目”,它需要是一个智能连接组件获取它关心的更改并重新渲染?或者这是否意味着它永远不会为这个特定的 Item 实例重新渲染?
更新:
想澄清一下,我说的特别是mapStateProps的工厂函数版本。
这是我正在谈论的功能,取自 React-Redux 文档:
注意:在需要更多控制渲染性能的高级场景中,mapStateToProps() 也可以返回一个函数。在这种情况下,该函数将用作特定组件实例的 mapStateToProps()。这允许您执行每个实例的记忆。您可以参考 #279 及其添加的测试以获取更多详细信息。大多数应用从不需要这个。
以及摘自这篇文章的段落:
https://medium.com/@cvetanov/redux-mapstatetoprops-optimization-5880078a8a7a
如果 redux 接收到一个返回函数的实现,它会执行一个闭包来包装组件自己的 props,因此每次组件更改它从父组件接收到的 props 时都会绕过 mapStateToProps 的调用。它创建了一个所谓的 purePropsSelector。可以在这里看到这是如何完成的。
更新 2:
是的,我正在调查提到跳过的文章,这似乎是当您将自己的道具包装在闭包中并返回仅使用状态的函数时。因此,它可以防止在每个“已连接”子项的父道具更改时调用 mapStateToProps。
这摘自我上面读到的那篇中型文章:
function mapStateToPropsFactory(initialState, ownProps) {
// a closure for ownProps is created
// this factory is not invoked everytime the component
// changes it's props
return function mapStateToProps(state) {
return {
blogs:
state.blogs.filter(blog => blog.author === ownProps.user)
};
};
}
export default connect(mapStateToPropsFactory)(MyBlogs);
【问题讨论】:
标签: javascript reactjs redux react-redux