React redux connect()'s的mapStateToProps在react路由器导航上被多次调用
React-redux connect()'s mapStateToProps being called multiple times on react-router navigation
我有一个简单的路由器(从redux-router
开始,切换到react-router
以消除变量)。
<Router history={history}>
<Route component={Admin} path='/admin'>
<Route component={Pages} path='pages'/>
<Route component={Posts} path='posts'/>
</Route>
</Router>
管理组件基本上只是带有一些导航的{this.props.children}
;它不是CCD_ 4-ed组件。
Pages组件是connect
ed组件,mapStateToProps()
类似于
function mapStateToProps (state) {
return {
pages: state.entities.pages
};
}
帖子更有趣:
function mapStateToProps (state) {
let posts = map(state.entities.posts, post => {
return {
...post,
author: findWhere(state.entities.users, {_id: post.author})
};
}
return {
posts
};
}
然后,当我加载页面或在Posts/Pages路由之间切换时,我会在控制台中得到以下内容。log().
// react-router navigate to /posts
Admin render()
posts: map state to props
Posts render()
posts: map state to props
Posts render()
posts: map state to props
// react-router navigate to /pages
Admin render()
pages: map state to props
Pages render()
pages: map state to props
所以我的问题是:为什么mapStateToProps
在路线更改时被多次调用?
此外,为什么mapStateToProps
中的一个简单map
函数会导致它在Posts容器中被第三次调用?
我使用的是Redux文档中的基本logger
和crashReporter
中间件,它没有报告任何状态更改或崩溃。如果状态没有改变,为什么组件要多次渲染?
根据react-redux
的经验,您不应该在mapStateToProps
内部处理存储属性,因为connect
使用绑定存储属性的浅层检查来检查差异。
为了检查组件是否需要更新,react-redux
调用mapStateToProps
并检查结果的一级属性。如果其中一个发生了更改(===
相等性检查),则组件将使用新道具进行更新。在您的情况下,每次调用mapStateToProps
时,posts
都会发生更改(map
转换),因此每次商店更改时都会更新您的组件!
您的解决方案是只返回商店属性的直接引用:
function mapStateToProps (state) {
return {
posts: state.entities.posts,
users: state.entities.users
};
}
然后在您的组件中,您可以定义一个按需处理数据的功能:
getPostsWithAuthor() {
const { posts, users } = this.props;
return map(posts, post => {
return {
...post,
author: findWhere(users, {_id: post.author})
};
});
}
Reselect允许您创建用于派生状态处理的记忆选择器函数。
Redux的文档举例说明了如何使用它。repo的自述文件也有一个快速的例子。
- 父页面的角度路由器导航高亮显示
- 骨干路由器导航和锚定href
- 使用 ui 路由器导航到非默认状态
- React路由器:防止导航到目标路由
- 针对浏览器的不同响应的Backbone.js路由器模式“;背面“;按钮或直接导航
- 可以't使用URL导航到ui路由器状态
- 骨干路由器.导航如何传递动态ID
- 来回导航时删除/取消UI路由器中的动画
- 使用 react 路由器在页面部分内导航
- 有条件地导航到带有角度 ui 路由器的状态
- 主干路由器导航到../#/<路由>而不触发路由器事件.如何
- 将导航选项卡样式类设置为活动,如果当前在该路由中 反应反应路由器.
- 父路由器激活功能在每次导航到其子路由时运行
- 从反应路由器检索后退导航操作
- 使用 ui 路由器的浏览器导航控件
- 反应路由器导航栏导航
- React路由器和导航按钮
- 使用ui路由器导航到嵌套的命名视图
- React redux connect()'s的mapStateToProps在react路由器导航上被多次调用
- Angularjs导航菜单,带有UI引导选项卡和UI路由器