Потому что, нажимая на массив, вы изменяете как предыдущее, так и текущее состояние. В то время как React не заботится, shouldComponentUpdate
делает это, поскольку он не может определить, отличается ли текущее состояние от предыдущего, поскольку вы мутировали оба.
shouldComponentUpdate(nextProps, nextState) {
// does return false, although you mutated the state
return nextState.items !== this.state.items;
}
Тем не менее, пуленепробиваемый, полностью неизменный способ будет:
this.setState({ cardItems }) => ({ cartItems: [...cardItems, { ...item, quantity: 1 }] }));