【发布时间】:2018-09-23 04:16:06
【问题描述】:
我在尝试优化我的 React-Redux 应用程序时非常沮丧。
我有一个标题组件,它会在每次更改 redux 存储时重新加载。我的头组件是 PureComponent
我已经安装了你为什么更新,它告诉我:
Header.props: Value did not change. Avoidable re-render!
这是我的组件:
export class Header extends PureComponent {
logout() {
// this.props.logout();
}
signup = () => {
this.props.history.push(urls.SIGNUP)
}
render() {
console.log("=============== RELOADING HEADER")
return (
<div>
<HeaderContent
logout={this.logout.bind(this)}
signup={this.signup.bind(this)}
user={this.props.user}/>
</div>
)
}
}
export function mapStateToProps(store) {
// EDITTED: I initially thought this was causing the problem
// but i get the same issue when returning a javascript object
//const u = loginUserFactory(store);
const u ={}
return {
user: u,
}
}
export function mapDispatchToProps(dispatch) {
return {
logout: function l() {
dispatch(authActions.logout())
}
}
}
export function mergeProps(propsFromState,propsFromDispatch,ownProps) {
return {
// logout: function logout() {
// propsFromDispatch.logout()
// },
...propsFromState,
...ownProps
}
}
let HeaderContainer = connect(
mapStateToProps,
mapDispatchToProps,
mergeProps,
{pure: true}
)(Header)
export default withRouter(HeaderContainer);
Header.propTypes = {
history: PropTypes.object.isRequired,
user: PropTypes.object.isRequired,
logout: PropTypes.func.isRequired,
}
我已验证每次更改 redux 存储时都会打印指示调用渲染函数的 console.log。
如果我取消注释合并道具中的函数,为什么DidYouUpdate 抱怨该函数导致重新渲染。
重新渲染显着影响了我的应用的性能。我考虑编写自己的 shouldComponentUpdate() 函数,但读到出于性能原因,在该函数中执行深度等于是一个坏主意。
那我该怎么办?
编辑:
这是登录用户工厂中的代码。最初我认为这是问题所在,但当我删除该代码时,我仍然遇到同样的问题。
const loginUserFactory = state => {
const u = getLoginUser(state);
const isLoggedIn = !_.isEmpty(u);
const location = getLocation(state);
return {
get id() { return u.id },
get groupNames() { return u.group_names },
get avatarSmall() { return u.avatar_small },
get name() { return u.name },
get email() { return u.email },
// my goal was to localize these methods into one file
// to avoid repeated code and
// to make potential refactoring easier
get location() { return location},
get isHost() {return u.type === "host"},
get isBooker() {return u.type === "booker"},
get isLoggedIn() { return isLoggedIn },
}
}
export default loginUserFactory;
【问题讨论】:
-
您仍在创建新的用户对象。每次调用
mapStateToProps时,const u = {}都会创建一个新的空对象(在 每个 对商店的更改上)。{}不是单身人士。它创建一个新对象。您需要将用户存储在您的商店对象中并从那里获取它。这就是为什么mapStateToProps将 store 作为参数 -> 以实际从中获取一些东西。
标签: javascript reactjs performance optimization redux