We do think it helps to create maintainable apps though, and it is fast enough for practical use cases despite its immutable design. That's why we use it at Facebook.
jQuery code is well known to be hard to maintain when it changes things based on element-types, classes and id's nested in each other.
var widget = require('./widget');
widget.foo('bar');
And the widget handles the jQuery'ing for you. module.exports = {
foo: function(s) { $('.widget').text(s) }
}- it breaks immediately if there is more than one '.widget' on the page
- your app will get out-of-sync DOM updates because different parts will flush changes to the DOM at different times (React is DOM = f(state, time), so if multiple changes happen in f, they all be flushed to DOM in one go)
* Inconsistencies or duplicated code between initial render and updates.
* Having to write code for N^2 transitions between N valid states instead of N valid states themselves.
* Harder to ensure DOM operation order across different parts of the codebase doesn’t produce jank.
Sure, this is all possible to solve, but in my experience I just ended up with a crappy version of React.