Vue makes things simpler and when you get a hang of the reactivity fundementals, it is a breeze to work with.
React has more 3rd part support. Larger ecosystem and much better tooling. You’ll have better editor support, linting, formatting etc with jsx.
My issue with React these days is that it is basically owned by Vercel at this point. And the development direction reflects that. Go check out the official docs. “quickstart” of React is basically “Use Next”. I personally like React a lot but hate Next with a passion after working on a couple of large Next codebases.
You can obviously avoid that (or prefer next).
I think signal based reactivity is on the works to be standardized in JS so the vue approach might get faster / better if it does. The language itself will provide the reactivity primitives all but react (vue, svelte, solid..) use basically.
That's what's keeping me in Vue primarily. I think MobX does something similar in React but the API is clunkier than Vue.
On top of that, the API is just much nicer. None of the confusing functional language and concepts e.g. "what exactly did the programmer intend by this 'useEffect' call??"
I never used vue for production apps, but my feeling tells me this could be a problem when the app becomes big. If you change a prop deep inside the model layer the chances of triggering an unintentional view update are higher? By using setters, you're essentially creating a more structured and controlled way of updating your application's state. But I have the react googles on, maybe I am missing something :)
Once you are in js land, changes occur in one direction only, I.e. from parent to child. Child cannot update parent directly via two way binding. Child need to emit an event. This brings vue in line with react to issues and semantics.
It is not close to React in terms of maturity, which is for me the largest issue with it, especially around TypeScript, Storybook and bugs. In my 10 years of React I have not encountered a single bug in it (not saying there weren't any, I just wasn't affected). In my month of Vue I had one blocking tooling bug and one ripping-my-hair-out-for-a-few-hours core bug. On the upside, a Vue contributor had a video call with me on the former and Evan himself fixed the latter within a day or two
Docs are mostly good, but React wins here too. What React Docs do really well, and what might be under-appreciated, is talking about trade-offs and pitfalls. Vue could use some of that, especially since it promotes mutability as its most idiomatic path, which can have subtle side-effects one should be mindful of. And I would bet many people, coming from more immutable frameworks, fall head-first into these pitfalls.
Vue, like Svelte, is (since v3 afaik) all-in on SFC (Single File Components). I personally dislike the singular focus on this style of component-ing. I like having multiple components per-file, doing higher-order component-ing (e.g. having a record of components) and having other exports from the same file. Sure, one could probably work around these by adding more files, but I don't like it when frameworks incentivize spraying files. I also have that critique with Next.js, though I find the bundler-boundary trade-off argument more convincing there. I do like the ease of co-located styles though!
An interesting nut that I'm trying to crack is how I feel about Vue's model-binding. Binding a state variable directly to a component, without separately specifying the getter & setter like in React, does make for more concise code. But then there is the aforementioned pitfall of this leading to mutation and possible spooky actions at a distance.
So my summary is: Some interesting differences to React, but overall not worth the divergence and community energy splitting. I think the things React is innovating on are still the most interesting ones in the view-library ecosystem. That said, I found the Vue contributors to be very nice people to interact with.
I personally enjoy React and TSX and a minimal setup but it is a constant battle to keep it minimal because the ecosystem is driven by merchants of complexity.
These days I primarily work in Nuxt and have never felt so productive.
Vue uses the actual DOM instead of the virtual DOM but try and build something tiny with both and see which programming model you like and choose that UI library.
People always bring out the bigger community or whatever in React, but IMO that's a huge big red negative against React. Every single React project will have its own way of dealing with state & routing at a minimum, which are the two things that should basically be identical regardless of the application (unless we're talking some hyper-specific circumstances, but for 99% of projects out there a golden path would be more than enough). There's lots of different patterns out there, and to this day you've got people wondering WTF is even going on with the 27 different state management libraries and 6 different Router libraries available to you. For miscellaneous packages, the only ones that I feel Vue is really missing out on would be things like Framer Motion which is a bit of a shame, but for the most part, 99% of most JS libraries out there will work just fine in Vue, especially Vue 3. We use Three.js a lot in our Vue 3 app and it works flawlessly, as it would in any other framework.
You automatically get better performance straight out the gate with Vue. In large apps, unless you have a React wizard who does nothing but optimize the React code 24/7, Vue will still be faster without you having to contort yourself into pacifying the framework. It's leaner both bundle-wise and logic-wise. There are far, far fewer footguns in Vue, the worst case is usually some weird quirkiness with deeply nested reactive objects, but even that is pretty rare in my experience. In a React codebase you're pretty much guaranteed to run into some reactivity footgun sooner rather than later, and it can often be a complete nightmare to deal with.
Don't even get me started on the whole Vercel bullshit, where they basically took over the project and are now pushing change after change that benefit Vercel and nobody else. The whole SSR meme needs to die, IMO, it has been such a clusterfuck of unnecessary complexity.
I also personally think the Vue docs are miles better than the new React docs, but this one's probably up to personal taste, as I see some people in this thread that prefer the React docs. Similarly with JSX, this comes down purely to personal preference. I prefer SFCs, some people prefer JSX.
Some things that React is better at, to keep this rant fair(ish):
- Undeniably better TS support. CompAPI has helped a ton and Vue has caught up a lot, but React still eeks out
- The community aspect, as in people posting guides and articles about it, is much bigger. Though in my experience most of these types of articles/posts/guides are long outdated or promote terrible practices (again, due to how easy it is to hit a footgun in React)
- Tooling and editor support is better for React, though with WebStorm I don't feel like it's that bad in Vue. No clue of the state of things on different IDEs.
- Despite my issues with Next and Vercel specifically, it's still IMO better than Nuxt. I haven't used Nuxt professionally, but at least for personal projects it feels quite buggy and unstable. Bare/"vanilla" Vue vs "vanilla" React is no contest though, Vue wins by a mile