Had it with React when it moved to functional components from class components.
But I convinced myself I have to dive deep enough to understand it since a lot of people seem to like it. And now I like the Composition API more in general.
Apart from one tidbit: I constantly forget where I need to put `.value` after a variable name to extract its... value.
Now that this is the recommended way of writing Vue, I’d be really interested in your opinion on React.
Compare the “ref” in Vue with useState hook in React.
With the useState you get back two items: the value, and a setter.
Now every time you access the value you simply access it like a variable because it is.
You are supposed to used fancy ide that everyone uses and typescript do yell at you if use guess wrong.
You can argue with it or ignore it however you want, but that's simply true.
I also know as a matter of fact that I am more productive than many of my colleagues when working with non statically compiled languages, and that my code is more robust, partly due to the typing I use everywhere. I have colleagues that write JavaScript functions that takes a parameter that could be 4 different types of objects, completely undocumented, and they don't know what's happening one week after shipping the code. I can't stop them doing stupid things like that. They like wasting their life debugging things and refreshing the browser, what can I do.
If they were going to poorly clone react hooks api then I decided it wasn’t worth my time sticking to the niche framework and went back to react which I now really enjoy.
That and the bad TS support and broken dev tooling for years and the endless deprecated and abandoned tools like Vue CLI replaced by Vite and Vuex replaced by Pinia just highlighted the absurdity of trying to continue using Vue. Also, JSX/TSX is clearly a superior approach with its vast ecosystem of support. Vue can use TSX but good luck with its single docs page and GitHub issues about it open since 2021.
This is how you stir up drama instead of constructive discussions. Clearly the team do care quite a lot about developer experience, but they might have different ideals and goals than you do. So lets discuss those differences as adults.
If you haven't found a need for this, great for you. Options APIs will also continue to be available for the foreseeable future. But that doesn't mean it is better in any way.
The tutorial and reasoning about the composition api make sense ... but I never feel I need it in my own apps.
I will say, with 2.x about 50% of bugs where not using Vue.set(...) in some obscure place or way, and those have all gone away, which I love.
It's taken the team some time to get used to how to do things in the new way, but on balance, we do like it.
It feels like there have been some odd caveats, like the new reactivity system approach not working exactly like we'd expect. But caveats exist in the options API too.
I don't see it as two ways in practice, just the legacy way for old projects (which still has good support), and the newer/better way.
Asking because my experience is that as soon as you have a large and complex component that needs to have multiple, mostly independent functionalities, you'll find the composition APIs to be a godsend. Not to mention all the IDE support. You won't see that until you have first have experience with it.
Also proper typescript support without annoying workarounds, that alone would make it worth it.
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
I take it back. Buster, bullseye, bookworm, gibbon, fawn, eft, fossa, jellyfish, and numbat are amazing release names. What is this!?
( Music is already looping in my head..... Who the hell do you think we are !)
On a slightly more serious note. I am not sure the release is anywhere close enough to warrant this code name.
Call me old-fashioned, I still prever model-view relationships separated. Can’t see what’s wrong with having a non-visual model that works on its own and then putting views on top of it to make it accessible to a user. Not only that, I don’t get why I would write model logic in a way that would nail it to a views system.
Js objects have observable properties and (with some care) they can even be shared across different subsystems/libraries.
What I’d like to see is a UI library that takes my “instanceof Foo” with its value properties, getter properties and methods and observes it. Then I write vue-like html or hyperscript with an assumed root object:
import {num_fmt} from “…”
import {my_counter} from “…”
const view = (
<button onclick={this.reset()}>
Reset count: {num_fmt(this.count)}
</button>
)
ui.mount(some_el, view, my_counter)
The my_counter remains free to use elsewhere or to be included into a larger structure. The goal is that ui will notice “.count =” anywhere and schedule an update to dom.Js is absolutely full of features which all these frameworks are trying to reimplement for some reason. There are rough edges that Vue addressed (array obs mostly) and I thought that wow that’s its purpose with some helpers around it. Nice, the next step is to deprecate Options in favor of just js. But it went completely downhill since with sfc and composition and all.
I don’t really see any tangible differences between Vue 2 and 3. As far as I know there are no plans to remove the Options API.