I think equalityFn in useSelector doesn't work as it should. It works great with simple strings/numbers but it doesn't work with objects and arrays. It always gets 'item' and 'prevItem' equal in this case. Check example here:
import React, { Component } from 'react';
import { render } from 'react-dom';
import { createStore, combineReducers } from 'redux';
import { connect, Provider, useSelector, useDispatch } from 'react-redux';
import './style.css';
const countReducer = (state = { count: [] }, action) => {
switch (action.type) {
case 'INC':
state.count.push('1')
return state;
default: return state;
}
}
const reducers = combineReducers({
counter: countReducer,
})
const store = createStore(reducers);
function App () {
const dispatch = useDispatch()
const count = useSelector(state => state.counter.count, (item, previousItem) => {
console.log('old')
console.log(previousItem)
console.log('new')
console.log(item)
if (item.length === previousItem.length) {
console.log('Equal')
return true
} else {
console.log('Not Equal')
return false
}
})
return (
<div>
<button onClick={() => dispatch({
type: 'INC'
})}>Increment</button>
<div>Value: {count[0]}</div>
</div>
)
}
const AppContainer = connect()(App);
render(
<Provider store={store}>
<AppContainer />
</Provider>,
document.getElementById('root')
);