-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Docs: Nuxt 2 --> 3 #2766
base: v2
Are you sure you want to change the base?
Docs: Nuxt 2 --> 3 #2766
Conversation
Replace tip that was relevant to Nuxt 2 with the equivalent syntax for Nuxt 3.
✅ Deploy Preview for pinia-official ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
✅ Deploy Preview for pinia-playground canceled.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
|
||
```js | ||
import { useStore } from '~/stores/myStore' | ||
const store = useStore(useNuxtApp().$pinia); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is still problematic because of teh usage of useNuxtApp()
. So maybe, adapting the example to something else where the context is not available and this is needed, is better. Or maybe, specify that the example below is Nuxt 2
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the whole of Nuxt 3 is a place “where the context is not available”, until you call useNuxtApp(), which is the Nuxt 3 equivalent of context https://nuxt.com/docs/guide/going-further/nuxt-app (eta I fixed that link)
So I think whenever a pinia store is used outside of a setup, it’s necessary to have passed it the pinia instance found on the Nuxt app instance - right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Then maybe this is just not longer needed, only in some more convoluted examples like lazy invocation in a plugin
function nuxtPlugin() {
const nuxt = useNuxtApp()
function something() {
useStore(nuxt.$pinia)
}
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there someone we can ask? It seems important to clarify, since I read elsewhere in the documentation that
you will have to pass the pinia instance to useStore(). This prevents pinia from sharing global state between different application instances.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The existence of the tip implies to me that the module isn’t automatically passing the pinia instance to the store, except in the setup function.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there someone we can ask?
I think you are already asking the right person 😅
These parts of the docs could be updated. The different is a little bit more subtle, as it works now inside navigation guards and other parts of the application since app.runWithContext()
. The nuxt function also follows this rule BTW. Feel free to give this a try if you want
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks. I'm just very confused about all of this. The existing documentation made me believe I needed to do something to prevent Cross-Request State Pollution when using a pinia store inside an onMounted
callback. I'm not sure if you are saying that's true or false, or how one can do it in Nuxt 3 (given you say the use of useNuxtApp()
is problematic).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't call useStore()
within onMounted, just call it outside, and consume the store within onMounted()
.
You cannot useNuxtApp() anywhere (as stated in the docs), only in places where there is Vue injection context (a rather implicit concept), in other words, within setup and composables and other explictely mentioned places (because they are injection context aware) like stores, middleware, plugins, etc
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't call useStore() within onMounted, just call it outside, and consume the store within onMounted().
That is what my example / diff does. I call useStore (and useNuxtApp) in the setup function, and store.doAction() in the onMounted().
I don't believe I have enough context about Nuxt and Vue to be able to help complete this documentation, but I thank you for your kind responses.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, you don't need to pass the pinia instance within setup. I assumed the code sample was outside of setup()
and that onMounted()
was a mistake there. I will rework the example when I can but anybody should feel free to give it a try
@@ -62,16 +62,17 @@ await useAsyncData('user', () => store.fetchUser().then(() => true)) | |||
|
|||
::: tip | |||
|
|||
If you want to use a store outside of `setup()`, remember to pass the `pinia` object to `useStore()`. We added it to [the context](https://nuxtjs.org/docs/2.x/internals-glossary/context) so you have access to it in `asyncData()` and `fetch()`: | |||
If you want to use a store outside of `setup()`, remember to pass the `$pinia` object to `useStore()`, for the reasons alluded to [here](https://pinia.vuejs.org/core-concepts/outside-component-usage.html#SSR-Apps). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If you want to use a store outside of `setup()`, remember to pass the `$pinia` object to `useStore()`, for the reasons alluded to [here](https://pinia.vuejs.org/core-concepts/outside-component-usage.html#SSR-Apps). | |
If you want to use a store outside of `setup()`, remember to pass the `$pinia` instance to `useStore()`, for the reasons alluded to [here](https://pinia.vuejs.org/core-concepts/outside-component-usage.html#SSR-Apps). |
Replace tip that was relevant to Nuxt 2 with the equivalent syntax for Nuxt 3.
I'm not sure whether this is in fact the intended usage pattern / syntax for Nuxt 3, but I think what I've written is an improvement over the status quo, since at least it works.
If this PR results in, or is deemed as, a definitive answer to this question, it may resolve that discussion.