Vue.js stands out from other frameworks for its intuitive reactivity. Vue 3 composition api is going to removing some limitations in Vue 2 and prov...
For further actions, you may consider blocking this person and/or reporting abuse
In the option api, each option is self-evident at the top level, making it easy to track reactive data consistently in any code. (This is the biggest advantage of option api)
Since all new APIs are wrapped in setup and reactive data is ejected from the extracted functions, it is not obvious which API the data comes from. By considering
.value
as a prefix, tracking reactive data can be made somewhat easier.This is why the best practice of using "useXXX" has been suggested. Any object called "useXXX" is considered reactive.
Scott
I guess I have a few questions about this.
1) Why can't you use
reactive
to declare multiple variables as you are doing withref
andcomputed
. I'm not sure I see why that is an advantage unless I misunderstand the usage.2) Why, in your blog post example did you chose to declare a reactive array directly instead of
reactive({ blogPosts: [] })
which would have made more sense and have largely the equivalent behaviour to usingref
.The API RFC document seems to explain fairly well where
reactive
andref
should and should not be used. I don't really see wherereactive
could really be dangerous outside of simply not understanding how it will behave relative toref
andcomputed
.vue-composition-api-rfc.netlify.co...
Nice article, thank you!
To be honest, Iβm a little disappointed in the new reactivity system. I think if itβs immutable, the final code is more strict, predictable and cleaner. Especially in case of junior devs. I mean, deep object reactivity is unnecessary because if you have something like users[index].info.cats.push(newCat), you more likely have spaghetti code and should restructure this component.
By the way, will deep object mutation trigger updates only in specific child component?
Why would
.push
more likely to introduce spaghetti code?Yes.
A component will only re-render if the dependencies of the render function are changed. So if a child component do not depend on the "deep object mutation", then it should not be re-rendered.
I've started using ref for the same reasons.
Ref is easier & cleaner.
I do wish we could do without .value, but every time I use reactive it comes back to bite me, so I'd much rather explicitly write .value than have to figure out the implicit.
Yeah I did have the same problem when I wanted to use a computed on a reactive array
Does anyone knows how to make this example work? It seems that computed with reactive data doesn't updated at any but why is so? (Strange enough I can see in Vue DevTools, that sometimes the value for this reactive computed get somehow updated, but as soons as I open DevTools it won't anymore).It will only work if inside
reactive
we define an object because, as I understand it,reactive
expectes some properties to work with,. Therefore there must be an object passed. I think Vue should handle this case much better and output some sort of an error or a warning to the console.For example the code below will update the value as intended:
An array is an Object.
Neither reactive nor ref feel like a good solution to me. We know that the options API is very approchable by beginners, which makes Vue successful, so as a consequence the Vue team had to deal with a lot of beginners mistakes ; for the options API, it was often a misunderstanding of how the
this
keyword works. Sothis
has been flagged as a footgun and is avoided as much as possible in Vue 3 RFCs.Yet I feel like using
this
insetup
would have solve so many trouble, while being much closer to the remaining options API:.value
or destructuring reactive objects ; the only trap is when the context changes, but:this
I believe the difficulty in composing logic while keeping the same execution context is overstated, nothing that can be fixed with a simple
.call(this)
. And again, this is a general JavaScript issue, nothing specific to Vue. Devs will meet the exact same issue on the logic/services parts of their app, if they mix OOP/FP style, which seems to be a current trend.Another great benefit of refs is that if you return an object where each property is a ref from a composition function, you can destructure it safely.
Are the return types from ref().value recursive read-only?
Or are they still mutable? Are they reactive if so?
ref.value
is mutable, and if the inner value of your ref is an object it is deeply reactive. E.g.:myObjectRef.value.bar.foo = "5"
will trigger any watcher onmyObjectRef
If it is a computed ref, then I believe it will be recursively read-only.
There is a helper function for destructuring a reactive object called toRefs(). So, in the end, you can just use reactive objects and destructure them with toRefs().
Scott
Have you considered this way of working with "reactive"? In my opinion it's better than use .value but have all the best of "ref" kind of declaration
Yes. I actually proposed that to Evan before too. But after actually using the composition API, I was surprised to find ref much more natural to use. Having said that, using a
state
object is totally valid pattern tho!this should work the same way as
ref()
Exactly! So just use ref!
I appreciate your input, and Vue is definitely not holy in my eyes. It is a framework amongst many, your comment was simply off topic when the discussion is clearly about Vue3 Composition API, and not a debate about which X is better than Y. The agressivity in your reply, you can take elsewhere.
This comment is a bit out of place..
Thanks for this article and for starting the enriching conversation below.
At least for me the resolution of the first image is such that I'm finding it hard to read. Do you think you could update that image to a higher res and/or link out to the src?
Hi.
The image is intended to illustrate the problem with option api. I took the image from the vue composition api rfc. See here.
"I dont have comments on this post", "not interested in latest developments in Vue"
Then why are you commenting on this post, which is about Vue?
You are also not interested in changes to Vue, yet you are comparing it to another framework. It is hard enough to get professional environments to use Vuejs instead of React, without mixing other libraries into the mix. Good job, sir.
What I love about this post is that you don't need to have learnt vue 3 to understand what's going on, in fact, I just learned something new here, important concepts rather. Thanks for this
Appreciate the article. Definitely something I am attempting to work out in my own code as we speak.
On the other hand, even if
reactive
is used,ref
cannot be avoided. For example,computed
returns aref
.I prefer to use the same api