Redux Bad Practices #5: New Objects On The Fly
Consider the following code:
mapStateToProps = (state) => ({
currentUser: {
id: state.currentUserId, role: state.currentRole
}
})
The example above will always return a new object for currentUser
and will force the component to re-render. The same idea applies to returning a new array (e.g. by using map, filter, concat), and anonymous functions.
Either pass the id and role as flat properties:
mapStateToProps = (state) => ({
currentUserId: state.currentUserId,
currentUserRole: state.currentRole
})
Or use a selector that returns currentUser
from state:
mapStateToProps = (state) => ({
currentUser: selectCurrentUser(state)
})
Notice that passing an anonymous function will also create a new reference. So try to avoid code like this if you need a performant component:
<MyComp onEvent={ () => this.doSomething() } otherProps={ ... }/>
The () => doSomething()
anonymous function will have a different reference each time we render MyComp, and will cause it to re-render even if it's a pure component (a component that re-renders only when state or props change).
Alternatively, you could pass a pre-bound function that is only initialized once:
bindedEventCallback = () => {}
render() {
return <MyComp
onEvent={ this.bindedEventCallback }
otherProps={ ... }/>;
}
Or use the useCallback
hook that memoizes the callback:
myComp() {
const bindedEventCallback = useCallback(() => {});
return <MyComp
onEvent={ bindedEventCallback }
otherProps={ ... }/>;
}
All articles in this series:
https://medium.com/@adamklein_66511/redux-bad-practices-1-lists-as-arrays-9115ba87b0ce
https://medium.com/@adamklein_66511/redux-bad-practices-2-duplicate-code-9f2f3d774d4d
https://medium.com/@adamklein_66511/redux-bad-practices-3-nested-state-6eebf1a410df
https://medium.com/@adamklein_66511/redux-bad-practices-5-duplicate-state-996d259758e3
https://medium.com/@adamklein_66511/redux-bad-practices-6-new-objects-on-the-fly-c38b503948a5
https://medium.com/@adamklein_66511/redux-bad-practices-7-mix-ui-state-with-model-data-cdca6c8d8fd9
Originally published at 500tech.com.