I got the following response from Dan Abramov which I thought I’d reprint below for the benefit of readers:
Diff’ing the current and previous state is how React knows when and what to re-render in the DOM, hence the need for immutable state.
Technical nit: this is not true
React doesn’t diff state in any way
Whenever you call setState it’s going to recalculate render result regardless of what you changed
So technically you can mutate anything as long as you call setState
But this gets problematic in larger apps when you want to add performance optimizations in certain components. Because now *you* can’t compare what changed and what didn’t. Also makes features like optimistic mutations harder.
Also you can use React with something like Mobx which also includes “magic” so you can freely mutate things. So if you prefer Vue-like style you can go with that.