In simple todo list application, I have FiltersContainer
component, which provides props to Filters
component:
// FiltersContainer.js
import { connect } from 'react-redux';
import { setVisibilityFilter } from '../actions';
import Filters from '../components/Filters';
function mapStateToProps(state) {
const { visibilityFilter } = state.todos;
// `visibilityFilter` variable value is - 'SHOW_ALL'.
return {
filters: [{
title: 'All',
value: 'SHOW_ALL',
active: visibilityFilter === 'SHOW_ALL',
}, {
title: 'Completed',
value: 'SHOW_COMPLETED',
active: visibilityFilter === 'SHOW_COMPLETED',
}, {
title: 'Active',
value: 'SHOW_ACTIVE',
active: visibilityFilter === 'SHOW_ACTIVE',
}],
};
}
function mapDispatchToProps(dispatch) {
return {
onFilterClick(value) {
dispatch(setVisibilityFilter(value));
},
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Filters);
The problem is, that this component renders everytime state changes.
For example, toggling todo item forces rendering <Filters />
component, although filters
array and visibilityFilter
hasn't changed.
If replace
filters
array in mapStateToProps
function with string, this component would not be rendering on every state changes:
// FiltersContainer.js
function mapStateToProps(state) {
const { visibilityFilter } = state.todos;
return {
filters: '',
};
}
Full application code is available at - https://github.com/1ven/react-redux-todos
Am I missing something?