javascript - React Redux mapStateToProps 正在重新渲染
问题描述
我遇到了一个问题,我的组件正在重新渲染,但它不应该(我总是发送相同的数据集)。后来我发现如果我的mapStateToProps看起来像这样:
function mapStateToProps({reducerContent},ownProps) {
return {
...reducerContent
}
}
它不会重新渲染(如果我发送相同的数据集)但这种形式的mapStateToProps将重新渲染我的组件:
function mapStateToProps({reducerContent},ownProps) {
return {
data: {
...reducerContent
}
}
}
在下面你可以找到我的减速器和组件。减速器:(action.data 是浅对象):
const reducerContent = (state = {}, action) => {
switch ( action.type ){
case types.GET_CONTENT:
return {
...state,
...action.data
};
default:
return state;
}
};
组件(将进一步开发):
import React, {Component} from 'react';
import {connect} from 'react-redux';
class Content extends Component {
render() {
return {this.props.content}
}
}
function mapStateToProps({reducerContent},ownProps) {
return {
...reducerContent
}
}
export default connect(mapStateToProps,null)(Content)
解决方案
connect
被实现为PureComponent
ie,它对所提供的值进行浅层比较,mapStateToProps
并决定是否重新渲染。
现在,当您提供数据时
{
data: {
...reducerContent
}
}
浅比较失败,因为您克隆了 reducerContainer,因此nextProps.data
不等于this.props.data
. 为了避免这种情况,您通常会选择memoization
. 为此,您可以自己使用reselect
或实现一个 memoized 函数
选择你的 mapStateToProps 看起来像
const getReducedDataSelector = createSelector(
state => state.reducerContent,
(reducedContent) => ({...reducedContent})
);
function mapStateToProps(state,ownProps) {
return {
data: getReducedDataSelector(state, ownProps);
}
}
在上述情况下,getReducedDataSelector
也可以使用自定义记忆方法来实现
推荐阅读
- docker - docker fluentd 这个命令行是什么意思?
- javascript - 如何应用动画关于文本更改
- css - 将 ul 元素添加到 Kendo Grid Column 时,ul 元素始终位于其他列之后
- python - 使用 selenium 和 python 登录后我无法导航到 Instagram 页面
- javascript - 如何强制vue轮播每页显示一个
- python - 从 git 安装的应用程序未找到 Django+Celery 模块错误
- python - 用户点击图表,图表根据 te 事件的 ydata 变化
- javascript - 节点服务器本地主机问题
- java - Java - 通过输入记录动态生成 XML 数据
- nginx - 如何使用 nginx 公开此目录?<