@nuxt/docs 0.0.0 → 3.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/.navigation.yml +2 -0
  2. package/1.getting-started/.navigation.yml +3 -0
  3. package/1.getting-started/01.introduction.md +81 -0
  4. package/1.getting-started/02.installation.md +109 -0
  5. package/1.getting-started/03.configuration.md +226 -0
  6. package/1.getting-started/04.views.md +163 -0
  7. package/1.getting-started/05.assets.md +48 -0
  8. package/1.getting-started/06.styling.md +565 -0
  9. package/1.getting-started/07.routing.md +149 -0
  10. package/1.getting-started/08.seo-meta.md +360 -0
  11. package/1.getting-started/09.transitions.md +473 -0
  12. package/1.getting-started/10.data-fetching.md +795 -0
  13. package/1.getting-started/11.state-management.md +223 -0
  14. package/1.getting-started/12.error-handling.md +233 -0
  15. package/1.getting-started/13.server.md +94 -0
  16. package/1.getting-started/14.layers.md +92 -0
  17. package/1.getting-started/15.prerendering.md +194 -0
  18. package/1.getting-started/16.deployment.md +130 -0
  19. package/1.getting-started/17.testing.md +728 -0
  20. package/1.getting-started/18.upgrade.md +997 -0
  21. package/2.guide/.navigation.yml +2 -0
  22. package/2.guide/0.index.md +22 -0
  23. package/2.guide/1.concepts/.navigation.yml +3 -0
  24. package/2.guide/1.concepts/1.auto-imports.md +205 -0
  25. package/2.guide/1.concepts/10.nuxt-lifecycle.md +141 -0
  26. package/2.guide/1.concepts/2.vuejs-development.md +103 -0
  27. package/2.guide/1.concepts/3.rendering.md +255 -0
  28. package/2.guide/1.concepts/4.server-engine.md +62 -0
  29. package/2.guide/1.concepts/5.modules.md +48 -0
  30. package/2.guide/1.concepts/7.esm.md +299 -0
  31. package/2.guide/1.concepts/8.typescript.md +97 -0
  32. package/2.guide/1.concepts/9.code-style.md +22 -0
  33. package/2.guide/2.directory-structure/.navigation.yml +3 -0
  34. package/2.guide/2.directory-structure/0.nuxt.md +20 -0
  35. package/2.guide/2.directory-structure/0.output.md +18 -0
  36. package/2.guide/2.directory-structure/1.assets.md +16 -0
  37. package/2.guide/2.directory-structure/1.components.md +608 -0
  38. package/2.guide/2.directory-structure/1.composables.md +121 -0
  39. package/2.guide/2.directory-structure/1.content.md +64 -0
  40. package/2.guide/2.directory-structure/1.layouts.md +180 -0
  41. package/2.guide/2.directory-structure/1.middleware.md +209 -0
  42. package/2.guide/2.directory-structure/1.modules.md +66 -0
  43. package/2.guide/2.directory-structure/1.node_modules.md +12 -0
  44. package/2.guide/2.directory-structure/1.pages.md +440 -0
  45. package/2.guide/2.directory-structure/1.plugins.md +299 -0
  46. package/2.guide/2.directory-structure/1.public.md +27 -0
  47. package/2.guide/2.directory-structure/1.server.md +546 -0
  48. package/2.guide/2.directory-structure/1.shared.md +104 -0
  49. package/2.guide/2.directory-structure/1.utils.md +49 -0
  50. package/2.guide/2.directory-structure/2.env.md +75 -0
  51. package/2.guide/2.directory-structure/2.gitignore.md +37 -0
  52. package/2.guide/2.directory-structure/2.nuxtignore.md +36 -0
  53. package/2.guide/2.directory-structure/2.nuxtrc.md +50 -0
  54. package/2.guide/2.directory-structure/3.app-config.md +177 -0
  55. package/2.guide/2.directory-structure/3.app.md +72 -0
  56. package/2.guide/2.directory-structure/3.error.md +55 -0
  57. package/2.guide/2.directory-structure/3.nuxt-config.md +34 -0
  58. package/2.guide/2.directory-structure/3.package.md +32 -0
  59. package/2.guide/2.directory-structure/3.tsconfig.md +24 -0
  60. package/2.guide/3.going-further/.navigation.yml +3 -0
  61. package/2.guide/3.going-further/1.experimental-features.md +689 -0
  62. package/2.guide/3.going-further/1.features.md +103 -0
  63. package/2.guide/3.going-further/1.internals.md +81 -0
  64. package/2.guide/3.going-further/10.runtime-config.md +174 -0
  65. package/2.guide/3.going-further/11.nightly-release-channel.md +68 -0
  66. package/2.guide/3.going-further/2.hooks.md +98 -0
  67. package/2.guide/3.going-further/3.modules.md +811 -0
  68. package/2.guide/3.going-further/4.kit.md +51 -0
  69. package/2.guide/3.going-further/6.nuxt-app.md +64 -0
  70. package/2.guide/3.going-further/7.layers.md +227 -0
  71. package/2.guide/3.going-further/9.debugging.md +115 -0
  72. package/2.guide/3.going-further/index.md +4 -0
  73. package/2.guide/4.recipes/.navigation.yml +3 -0
  74. package/2.guide/4.recipes/1.custom-routing.md +181 -0
  75. package/2.guide/4.recipes/2.vite-plugin.md +65 -0
  76. package/2.guide/4.recipes/3.custom-usefetch.md +125 -0
  77. package/2.guide/4.recipes/4.sessions-and-authentication.md +203 -0
  78. package/3.api/.navigation.yml +3 -0
  79. package/3.api/1.components/.navigation.yml +3 -0
  80. package/3.api/1.components/1.client-only.md +76 -0
  81. package/3.api/1.components/1.dev-only.md +51 -0
  82. package/3.api/1.components/1.nuxt-client-fallback.md +80 -0
  83. package/3.api/1.components/10.nuxt-picture.md +27 -0
  84. package/3.api/1.components/11.teleports.md +40 -0
  85. package/3.api/1.components/12.nuxt-route-announcer.md +56 -0
  86. package/3.api/1.components/13.nuxt-time.md +173 -0
  87. package/3.api/1.components/2.nuxt-page.md +154 -0
  88. package/3.api/1.components/3.nuxt-layout.md +156 -0
  89. package/3.api/1.components/4.nuxt-link.md +322 -0
  90. package/3.api/1.components/5.nuxt-loading-indicator.md +50 -0
  91. package/3.api/1.components/6.nuxt-error-boundary.md +65 -0
  92. package/3.api/1.components/7.nuxt-welcome.md +25 -0
  93. package/3.api/1.components/8.nuxt-island.md +70 -0
  94. package/3.api/1.components/9.nuxt-img.md +43 -0
  95. package/3.api/2.composables/.navigation.yml +3 -0
  96. package/3.api/2.composables/on-prehydrate.md +60 -0
  97. package/3.api/2.composables/use-app-config.md +19 -0
  98. package/3.api/2.composables/use-async-data.md +212 -0
  99. package/3.api/2.composables/use-cookie.md +233 -0
  100. package/3.api/2.composables/use-error.md +32 -0
  101. package/3.api/2.composables/use-fetch.md +217 -0
  102. package/3.api/2.composables/use-head-safe.md +55 -0
  103. package/3.api/2.composables/use-head.md +69 -0
  104. package/3.api/2.composables/use-hydration.md +68 -0
  105. package/3.api/2.composables/use-lazy-async-data.md +47 -0
  106. package/3.api/2.composables/use-lazy-fetch.md +55 -0
  107. package/3.api/2.composables/use-loading-indicator.md +77 -0
  108. package/3.api/2.composables/use-nuxt-app.md +294 -0
  109. package/3.api/2.composables/use-nuxt-data.md +112 -0
  110. package/3.api/2.composables/use-preview-mode.md +118 -0
  111. package/3.api/2.composables/use-request-event.md +23 -0
  112. package/3.api/2.composables/use-request-fetch.md +52 -0
  113. package/3.api/2.composables/use-request-header.md +34 -0
  114. package/3.api/2.composables/use-request-headers.md +37 -0
  115. package/3.api/2.composables/use-request-url.md +41 -0
  116. package/3.api/2.composables/use-response-header.md +48 -0
  117. package/3.api/2.composables/use-route-announcer.md +60 -0
  118. package/3.api/2.composables/use-route.md +52 -0
  119. package/3.api/2.composables/use-router.md +92 -0
  120. package/3.api/2.composables/use-runtime-config.md +142 -0
  121. package/3.api/2.composables/use-runtime-hook.md +43 -0
  122. package/3.api/2.composables/use-seo-meta.md +80 -0
  123. package/3.api/2.composables/use-server-seo-meta.md +27 -0
  124. package/3.api/2.composables/use-state.md +48 -0
  125. package/3.api/3.utils/$fetch.md +98 -0
  126. package/3.api/3.utils/.navigation.yml +3 -0
  127. package/3.api/3.utils/abort-navigation.md +73 -0
  128. package/3.api/3.utils/add-route-middleware.md +88 -0
  129. package/3.api/3.utils/call-once.md +92 -0
  130. package/3.api/3.utils/clear-error.md +29 -0
  131. package/3.api/3.utils/clear-nuxt-data.md +23 -0
  132. package/3.api/3.utils/clear-nuxt-state.md +23 -0
  133. package/3.api/3.utils/create-error.md +55 -0
  134. package/3.api/3.utils/define-nuxt-component.md +53 -0
  135. package/3.api/3.utils/define-nuxt-route-middleware.md +67 -0
  136. package/3.api/3.utils/define-page-meta.md +234 -0
  137. package/3.api/3.utils/define-route-rules.md +52 -0
  138. package/3.api/3.utils/navigate-to.md +230 -0
  139. package/3.api/3.utils/on-before-route-leave.md +11 -0
  140. package/3.api/3.utils/on-before-route-update.md +11 -0
  141. package/3.api/3.utils/on-nuxt-ready.md +25 -0
  142. package/3.api/3.utils/prefetch-components.md +28 -0
  143. package/3.api/3.utils/preload-components.md +23 -0
  144. package/3.api/3.utils/preload-route-components.md +41 -0
  145. package/3.api/3.utils/prerender-routes.md +46 -0
  146. package/3.api/3.utils/refresh-cookie.md +46 -0
  147. package/3.api/3.utils/refresh-nuxt-data.md +91 -0
  148. package/3.api/3.utils/reload-nuxt-app.md +74 -0
  149. package/3.api/3.utils/set-page-layout.md +24 -0
  150. package/3.api/3.utils/set-response-status.md +36 -0
  151. package/3.api/3.utils/show-error.md +31 -0
  152. package/3.api/3.utils/update-app-config.md +27 -0
  153. package/3.api/4.commands/.navigation.yml +3 -0
  154. package/3.api/4.commands/add.md +112 -0
  155. package/3.api/4.commands/analyze.md +41 -0
  156. package/3.api/4.commands/build-module.md +42 -0
  157. package/3.api/4.commands/build.md +46 -0
  158. package/3.api/4.commands/cleanup.md +38 -0
  159. package/3.api/4.commands/dev.md +59 -0
  160. package/3.api/4.commands/devtools.md +38 -0
  161. package/3.api/4.commands/generate.md +41 -0
  162. package/3.api/4.commands/info.md +33 -0
  163. package/3.api/4.commands/init.md +46 -0
  164. package/3.api/4.commands/module.md +84 -0
  165. package/3.api/4.commands/prepare.md +36 -0
  166. package/3.api/4.commands/preview.md +43 -0
  167. package/3.api/4.commands/typecheck.md +42 -0
  168. package/3.api/4.commands/upgrade.md +37 -0
  169. package/3.api/5.kit/.navigation.yml +3 -0
  170. package/3.api/5.kit/1.modules.md +172 -0
  171. package/3.api/5.kit/10.runtime-config.md +27 -0
  172. package/3.api/5.kit/10.templates.md +283 -0
  173. package/3.api/5.kit/11.nitro.md +409 -0
  174. package/3.api/5.kit/12.resolving.md +268 -0
  175. package/3.api/5.kit/13.logging.md +65 -0
  176. package/3.api/5.kit/14.builder.md +491 -0
  177. package/3.api/5.kit/15.examples.md +41 -0
  178. package/3.api/5.kit/2.programmatic.md +125 -0
  179. package/3.api/5.kit/3.compatibility.md +230 -0
  180. package/3.api/5.kit/4.autoimports.md +144 -0
  181. package/3.api/5.kit/5.components.md +127 -0
  182. package/3.api/5.kit/6.context.md +130 -0
  183. package/3.api/5.kit/7.pages.md +295 -0
  184. package/3.api/5.kit/8.layout.md +80 -0
  185. package/3.api/5.kit/9.plugins.md +263 -0
  186. package/3.api/6.advanced/.navigation.yml +1 -0
  187. package/3.api/6.advanced/1.hooks.md +105 -0
  188. package/3.api/6.advanced/2.import-meta.md +60 -0
  189. package/3.api/6.nuxt-config.md +12 -0
  190. package/3.api/index.md +31 -0
  191. package/5.community/.navigation.yml +3 -0
  192. package/5.community/2.getting-help.md +48 -0
  193. package/5.community/3.reporting-bugs.md +50 -0
  194. package/5.community/4.contribution.md +205 -0
  195. package/5.community/5.framework-contribution.md +142 -0
  196. package/5.community/6.roadmap.md +79 -0
  197. package/5.community/7.changelog.md +92 -0
  198. package/6.bridge/.navigation.yml +3 -0
  199. package/6.bridge/1.overview.md +137 -0
  200. package/6.bridge/10.configuration.md +96 -0
  201. package/6.bridge/2.typescript.md +46 -0
  202. package/6.bridge/3.bridge-composition-api.md +132 -0
  203. package/6.bridge/4.plugins-and-middleware.md +65 -0
  204. package/6.bridge/5.nuxt3-compatible-api.md +204 -0
  205. package/6.bridge/6.meta.md +117 -0
  206. package/6.bridge/7.runtime-config.md +38 -0
  207. package/6.bridge/8.nitro.md +102 -0
  208. package/6.bridge/9.vite.md +37 -0
  209. package/7.migration/.navigation.yml +3 -0
  210. package/7.migration/1.overview.md +24 -0
  211. package/7.migration/10.bundling.md +28 -0
  212. package/7.migration/11.server.md +17 -0
  213. package/7.migration/2.configuration.md +240 -0
  214. package/7.migration/20.module-authors.md +94 -0
  215. package/7.migration/3.auto-imports.md +18 -0
  216. package/7.migration/4.meta.md +127 -0
  217. package/7.migration/5.plugins-and-middleware.md +80 -0
  218. package/7.migration/6.pages-and-layouts.md +233 -0
  219. package/7.migration/7.component-options.md +156 -0
  220. package/7.migration/8.runtime-config.md +58 -0
  221. package/LICENSE +21 -0
  222. package/README.md +11 -0
  223. package/package.json +16 -4
  224. package/dist/.gitkeep +0 -0
@@ -0,0 +1,212 @@
1
+ ---
2
+ title: 'useAsyncData'
3
+ description: useAsyncData provides access to data that resolves asynchronously in an SSR-friendly composable.
4
+ links:
5
+ - label: Source
6
+ icon: i-simple-icons-github
7
+ to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/asyncData.ts
8
+ size: xs
9
+ ---
10
+
11
+ Within your pages, components, and plugins you can use useAsyncData to get access to data that resolves asynchronously.
12
+
13
+ ::note
14
+ [`useAsyncData`](/docs/api/composables/use-async-data) is a composable meant to be called directly in the [Nuxt context](/docs/guide/going-further/nuxt-app#the-nuxt-context). It returns reactive composables and handles adding responses to the Nuxt payload so they can be passed from server to client **without re-fetching the data on client side** when the page hydrates.
15
+ ::
16
+
17
+ ## Usage
18
+
19
+ ```vue [pages/index.vue]
20
+ <script setup lang="ts">
21
+ const { data, status, error, refresh, clear } = await useAsyncData(
22
+ 'mountains',
23
+ () => $fetch('https://api.nuxtjs.dev/mountains')
24
+ )
25
+ </script>
26
+ ```
27
+
28
+ ::warning
29
+ If you're using a custom useAsyncData wrapper, do not await it in the composable, as that can cause unexpected behavior. Please follow [this recipe](/docs/guide/recipes/custom-usefetch#custom-usefetch) for more information on how to make a custom async data fetcher.
30
+ ::
31
+
32
+ ::note
33
+ `data`, `status` and `error` are Vue refs and they should be accessed with `.value` when used within the `<script setup>`, while `refresh`/`execute` and `clear` are plain functions.
34
+ ::
35
+
36
+ ### Watch Params
37
+
38
+ The built-in `watch` option allows automatically rerunning the fetcher function when any changes are detected.
39
+
40
+ ```vue [pages/index.vue]
41
+ <script setup lang="ts">
42
+ const page = ref(1)
43
+ const { data: posts } = await useAsyncData(
44
+ 'posts',
45
+ () => $fetch('https://fakeApi.com/posts', {
46
+ params: {
47
+ page: page.value
48
+ }
49
+ }), {
50
+ watch: [page]
51
+ }
52
+ )
53
+ </script>
54
+ ```
55
+
56
+ ### Reactive Keys
57
+
58
+ You can use a computed ref, plain ref or a getter function as the key, allowing for dynamic data fetching that automatically updates when the key changes:
59
+
60
+ ```vue [pages/[id\\].vue]
61
+ <script setup lang="ts">
62
+ const route = useRoute()
63
+ const userId = computed(() => `user-${route.params.id}`)
64
+
65
+ // When the route changes and userId updates, the data will be automatically refetched
66
+ const { data: user } = useAsyncData(
67
+ userId,
68
+ () => fetchUserById(route.params.id)
69
+ )
70
+ </script>
71
+ ```
72
+
73
+ ::warning
74
+ [`useAsyncData`](/docs/api/composables/use-async-data) is a reserved function name transformed by the compiler, so you should not name your own function [`useAsyncData`](/docs/api/composables/use-async-data).
75
+ ::
76
+
77
+ :read-more{to="/docs/getting-started/data-fetching#useasyncdata"}
78
+
79
+ ## Params
80
+
81
+ - `key`: a unique key to ensure that data fetching can be properly de-duplicated across requests. If you do not provide a key, then a key that is unique to the file name and line number of the instance of `useAsyncData` will be generated for you.
82
+ - `handler`: an asynchronous function that must return a truthy value (for example, it should not be `undefined` or `null`) or the request may be duplicated on the client side.
83
+ ::warning
84
+ The `handler` function should be **side-effect free** to ensure predictable behavior during SSR and CSR hydration. If you need to trigger side effects, use the [`callOnce`](/docs/api/utils/call-once) utility to do so.
85
+ ::
86
+ - `options`:
87
+ - `server`: whether to fetch the data on the server (defaults to `true`)
88
+ - `lazy`: whether to resolve the async function after loading the route, instead of blocking client-side navigation (defaults to `false`)
89
+ - `immediate`: when set to `false`, will prevent the request from firing immediately. (defaults to `true`)
90
+ - `default`: a factory function to set the default value of the `data`, before the async function resolves - useful with the `lazy: true` or `immediate: false` option
91
+ - `transform`: a function that can be used to alter `handler` function result after resolving
92
+ - `getCachedData`: Provide a function which returns cached data. A `null` or `undefined` return value will trigger a fetch. By default, this is:
93
+ ```ts
94
+ const getDefaultCachedData = (key, nuxtApp, ctx) => nuxtApp.isHydrating
95
+ ? nuxtApp.payload.data[key]
96
+ : nuxtApp.static.data[key]
97
+ ```
98
+ Which only caches data when `experimental.payloadExtraction` of `nuxt.config` is enabled.
99
+ - `pick`: only pick specified keys in this array from the `handler` function result
100
+ - `watch`: watch reactive sources to auto-refresh
101
+ - `deep`: return data in a deep ref object (it is `true` by default). It can be set to `false` to return data in a shallow ref object, which can improve performance if your data does not need to be deeply reactive.
102
+ - `dedupe`: avoid fetching same key more than once at a time (defaults to `cancel`). Possible options:
103
+ - `cancel` - cancels existing requests when a new one is made
104
+ - `defer` - does not make new requests at all if there is a pending request
105
+
106
+ ::note
107
+ Under the hood, `lazy: false` uses `<Suspense>` to block the loading of the route before the data has been fetched. Consider using `lazy: true` and implementing a loading state instead for a snappier user experience.
108
+ ::
109
+
110
+ ::read-more{to="/docs/api/composables/use-lazy-async-data"}
111
+ You can use `useLazyAsyncData` to have the same behavior as `lazy: true` with `useAsyncData`.
112
+ ::
113
+
114
+ :video-accordion{title="Watch a video from Alexander Lichter about client-side caching with getCachedData" videoId="aQPR0xn-MMk"}
115
+
116
+ ### Shared State and Option Consistency
117
+
118
+ When using the same key for multiple `useAsyncData` calls, they will share the same `data`, `error` and `status` refs. This ensures consistency across components but requires option consistency.
119
+
120
+ The following options **must be consistent** across all calls with the same key:
121
+ - `handler` function
122
+ - `deep` option
123
+ - `transform` function
124
+ - `pick` array
125
+ - `getCachedData` function
126
+ - `default` value
127
+
128
+ The following options **can differ** without triggering warnings:
129
+ - `server`
130
+ - `lazy`
131
+ - `immediate`
132
+ - `dedupe`
133
+ - `watch`
134
+
135
+ ```ts
136
+ // ❌ This will trigger a development warning
137
+ const { data: users1 } = useAsyncData('users', () => $fetch('/api/users'), { deep: false })
138
+ const { data: users2 } = useAsyncData('users', () => $fetch('/api/users'), { deep: true })
139
+
140
+ // ✅ This is allowed
141
+ const { data: users1 } = useAsyncData('users', () => $fetch('/api/users'), { immediate: true })
142
+ const { data: users2 } = useAsyncData('users', () => $fetch('/api/users'), { immediate: false })
143
+ ```
144
+
145
+ ## Return Values
146
+
147
+ - `data`: the result of the asynchronous function that is passed in.
148
+ - `refresh`/`execute`: a function that can be used to refresh the data returned by the `handler` function.
149
+ - `error`: an error object if the data fetching failed.
150
+ - `status`: a string indicating the status of the data request:
151
+ - `idle`: when the request has not started, such as:
152
+ - when `execute` has not yet been called and `{ immediate: false }` is set
153
+ - when rendering HTML on the server and `{ server: false }` is set
154
+ - `pending`: the request is in progress
155
+ - `success`: the request has completed successfully
156
+ - `error`: the request has failed
157
+ - `clear`: a function which will set `data` to `undefined`, set `error` to `null`, set `status` to `'idle'`, and mark any currently pending requests as cancelled.
158
+
159
+ By default, Nuxt waits until a `refresh` is finished before it can be executed again.
160
+
161
+ ::note
162
+ If you have not fetched data on the server (for example, with `server: false`), then the data _will not_ be fetched until hydration completes. This means even if you await [`useAsyncData`](/docs/api/composables/use-async-data) on the client side, `data` will remain `null` within `<script setup>`.
163
+ ::
164
+
165
+ ## Type
166
+
167
+ ```ts [Signature]
168
+ function useAsyncData<DataT, DataE>(
169
+ handler: (nuxtApp?: NuxtApp) => Promise<DataT>,
170
+ options?: AsyncDataOptions<DataT>
171
+ ): AsyncData<DataT, DataE>
172
+ function useAsyncData<DataT, DataE>(
173
+ key: string | Ref<string> | ComputedRef<string>,
174
+ handler: (nuxtApp?: NuxtApp) => Promise<DataT>,
175
+ options?: AsyncDataOptions<DataT>
176
+ ): Promise<AsyncData<DataT, DataE>>
177
+
178
+ type AsyncDataOptions<DataT> = {
179
+ server?: boolean
180
+ lazy?: boolean
181
+ immediate?: boolean
182
+ deep?: boolean
183
+ dedupe?: 'cancel' | 'defer'
184
+ default?: () => DataT | Ref<DataT> | null
185
+ transform?: (input: DataT) => DataT | Promise<DataT>
186
+ pick?: string[]
187
+ watch?: WatchSource[] | false
188
+ getCachedData?: (key: string, nuxtApp: NuxtApp, ctx: AsyncDataRequestContext) => DataT | undefined
189
+ }
190
+
191
+ type AsyncDataRequestContext = {
192
+ /** The reason for this data request */
193
+ cause: 'initial' | 'refresh:manual' | 'refresh:hook' | 'watch'
194
+ }
195
+
196
+ type AsyncData<DataT, ErrorT> = {
197
+ data: Ref<DataT | null>
198
+ refresh: (opts?: AsyncDataExecuteOptions) => Promise<void>
199
+ execute: (opts?: AsyncDataExecuteOptions) => Promise<void>
200
+ clear: () => void
201
+ error: Ref<ErrorT | null>
202
+ status: Ref<AsyncDataRequestStatus>
203
+ };
204
+
205
+ interface AsyncDataExecuteOptions {
206
+ dedupe?: 'cancel' | 'defer'
207
+ }
208
+
209
+ type AsyncDataRequestStatus = 'idle' | 'pending' | 'success' | 'error'
210
+ ```
211
+
212
+ :read-more{to="/docs/getting-started/data-fetching"}
@@ -0,0 +1,233 @@
1
+ ---
2
+ title: 'useCookie'
3
+ description: useCookie is an SSR-friendly composable to read and write cookies.
4
+ links:
5
+ - label: Source
6
+ icon: i-simple-icons-github
7
+ to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/cookie.ts
8
+ size: xs
9
+ ---
10
+
11
+ Within your pages, components and plugins you can use `useCookie`, an SSR-friendly composable to read and write cookies.
12
+
13
+ ```ts
14
+ const cookie = useCookie(name, options)
15
+ ```
16
+
17
+ ::note
18
+ `useCookie` only works in the [Nuxt context](/docs/guide/going-further/nuxt-app#the-nuxt-context).
19
+ ::
20
+
21
+ ::tip
22
+ `useCookie` ref will automatically serialize and deserialize cookie value to JSON.
23
+ ::
24
+
25
+ ## Example
26
+
27
+ The example below creates a cookie called `counter`. If the cookie doesn't exist, it is initially set to a random value. Whenever we update the `counter` variable, the cookie will be updated accordingly.
28
+
29
+ ```vue [app.vue]
30
+ <script setup lang="ts">
31
+ const counter = useCookie('counter')
32
+
33
+ counter.value = counter.value || Math.round(Math.random() * 1000)
34
+ </script>
35
+
36
+ <template>
37
+ <div>
38
+ <h1>Counter: {{ counter || '-' }}</h1>
39
+ <button @click="counter = null">reset</button>
40
+ <button @click="counter--">-</button>
41
+ <button @click="counter++">+</button>
42
+ </div>
43
+ </template>
44
+ ```
45
+
46
+ :link-example{to="/docs/examples/advanced/use-cookie"}
47
+
48
+ ::note
49
+ Refresh `useCookie` values manually when a cookie has changed with [`refreshCookie`](/docs/api/utils/refresh-cookie).
50
+ ::
51
+
52
+ ## Options
53
+
54
+ Cookie composable accepts several options which let you modify the behavior of cookies.
55
+
56
+ Most of the options will be directly passed to the [cookie](https://github.com/jshttp/cookie) package.
57
+
58
+ ### `maxAge` / `expires`
59
+
60
+ Use these options to set the expiration of the cookie.
61
+
62
+ `maxAge`: Specifies the `number` (in seconds) to be the value for the [`Max-Age` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.2).
63
+ The given number will be converted to an integer by rounding down. By default, no maximum age is set.
64
+
65
+ `expires`: Specifies the `Date` object to be the value for the [`Expires` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.1).
66
+ By default, no expiration is set. Most clients will consider this a "non-persistent cookie" and will delete it on a condition like exiting a web browser application.
67
+
68
+ ::note
69
+ The [cookie storage model specification](https://tools.ietf.org/html/rfc6265#section-5.3) states that if both `expires` and `maxAge` is set, then `maxAge` takes precedence, but not all clients may obey this, so if both are set, they should point to the same date and time!
70
+ ::
71
+
72
+ ::note
73
+ If neither of `expires` and `maxAge` is set, the cookie will be session-only and removed when the user closes their browser.
74
+ ::
75
+
76
+ ### `httpOnly`
77
+
78
+ Specifies the `boolean` value for the [`HttpOnly` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.6). When truthy, the `HttpOnly` attribute is set; otherwise it is not. By default, the `HttpOnly` attribute is not set.
79
+
80
+ ::warning
81
+ Be careful when setting this to `true`, as compliant clients will not allow client-side JavaScript to see the cookie in `document.cookie`.
82
+ ::
83
+
84
+ ### `secure`
85
+
86
+ Specifies the `boolean` value for the [`Secure` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.5). When truthy, the `Secure` attribute is set; otherwise it is not. By default, the `Secure` attribute is not set.
87
+
88
+ ::warning
89
+ Be careful when setting this to `true`, as compliant clients will not send the cookie back to the server in the future if the browser does not have an HTTPS connection. This can lead to hydration errors.
90
+ ::
91
+
92
+ ### `partitioned`
93
+
94
+ Specifies the `boolean` value for the [`Partitioned` `Set-Cookie`](https://datatracker.ietf.org/doc/html/draft-cutler-httpbis-partitioned-cookies#section-2.1) attribute. When truthy, the `Partitioned` attribute is set, otherwise it is not. By default, the `Partitioned` attribute is not set.
95
+
96
+ ::note
97
+ This is an attribute that has not yet been fully standardized, and may change in the future.
98
+ This also means many clients may ignore this attribute until they understand it.
99
+
100
+ More information can be found in the [proposal](https://github.com/privacycg/CHIPS).
101
+ ::
102
+
103
+ ### `domain`
104
+
105
+ Specifies the value for the [`Domain` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.3). By default, no domain is set, and most clients will consider applying the cookie only to the current domain.
106
+
107
+ ### `path`
108
+
109
+ Specifies the value for the [`Path` `Set-Cookie` attribute](https://tools.ietf.org/html/rfc6265#section-5.2.4). By default, the path is considered the ["default path"](https://tools.ietf.org/html/rfc6265#section-5.1.4).
110
+
111
+ ### `sameSite`
112
+
113
+ Specifies the `boolean` or `string` value for the [`SameSite` `Set-Cookie` attribute](https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-4.1.2.7).
114
+
115
+ - `true` will set the `SameSite` attribute to `Strict` for strict same-site enforcement.
116
+ - `false` will not set the `SameSite` attribute.
117
+ - `'lax'` will set the `SameSite` attribute to `Lax` for lax same-site enforcement.
118
+ - `'none'` will set the `SameSite` attribute to `None` for an explicit cross-site cookie.
119
+ - `'strict'` will set the `SameSite` attribute to `Strict` for strict same-site enforcement.
120
+
121
+ More information about the different enforcement levels can be found in [the specification](https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-4.1.2.7).
122
+
123
+ ### `encode`
124
+
125
+ Specifies a function that will be used to encode a cookie's value. Since the value of a cookie has a limited character set (and must be a simple string), this function can be used to encode a value into a string suited for a cookie's value.
126
+
127
+ The default encoder is the `JSON.stringify` + `encodeURIComponent`.
128
+
129
+ ### `decode`
130
+
131
+ Specifies a function that will be used to decode a cookie's value. Since the value of a cookie has a limited character set (and must be a simple string), this function can be used to decode a previously encoded cookie value into a JavaScript string or other object.
132
+
133
+ The default decoder is `decodeURIComponent` + [destr](https://github.com/unjs/destr).
134
+
135
+ ::note
136
+ If an error is thrown from this function, the original, non-decoded cookie value will be returned as the cookie's value.
137
+ ::
138
+
139
+ ### `default`
140
+
141
+ Specifies a function that returns the cookie's default value. The function can also return a `Ref`.
142
+
143
+ ### `readonly`
144
+
145
+ Allows _accessing_ a cookie value without the ability to set it.
146
+
147
+ ### `watch`
148
+
149
+ Specifies the `boolean` or `string` value for [watch](https://vuejs.org/api/reactivity-core.html#watch) cookie ref data.
150
+
151
+ - `true` - Will watch cookie ref data changes and its nested properties (default).
152
+ - `shallow` - Will watch cookie ref data changes for only top level properties
153
+ - `false` - Will not watch cookie ref data changes.
154
+
155
+ ::note
156
+ Refresh `useCookie` values manually when a cookie has changed with [`refreshCookie`](/docs/api/utils/refresh-cookie).
157
+ ::
158
+
159
+ **Example 1:**
160
+
161
+ ```vue
162
+ <script setup lang="ts">
163
+ const user = useCookie(
164
+ 'userInfo',
165
+ {
166
+ default: () => ({ score: -1 }),
167
+ watch: false
168
+ }
169
+ )
170
+
171
+ if (user.value && user.value !== null) {
172
+ user.value.score++; // userInfo cookie not update with this change
173
+ }
174
+ </script>
175
+
176
+ <template>
177
+ <div>User score: {{ user?.score }}</div>
178
+ </template>
179
+ ```
180
+
181
+ **Example 2:**
182
+
183
+ ```vue
184
+ <script setup lang="ts">
185
+ const list = useCookie(
186
+ 'list',
187
+ {
188
+ default: () => [],
189
+ watch: 'shallow'
190
+ }
191
+ )
192
+
193
+ function add() {
194
+ list.value?.push(Math.round(Math.random() * 1000))
195
+ // list cookie not update with this change
196
+ }
197
+
198
+ function save() {
199
+ if (list.value && list.value !== null) {
200
+ list.value = [...list.value]
201
+ // list cookie update with this change
202
+ }
203
+ }
204
+ </script>
205
+
206
+ <template>
207
+ <div>
208
+ <h1>List</h1>
209
+ <pre>{{ list }}</pre>
210
+ <button @click="add">Add</button>
211
+ <button @click="save">Save</button>
212
+ </div>
213
+ </template>
214
+ ```
215
+
216
+ ## Cookies in API Routes
217
+
218
+ You can use `getCookie` and `setCookie` from [`h3`](https://github.com/unjs/h3) package to set cookies in server API routes.
219
+
220
+ ```ts [server/api/counter.ts]
221
+ export default defineEventHandler(event => {
222
+ // Read counter cookie
223
+ let counter = getCookie(event, 'counter') || 0
224
+
225
+ // Increase counter cookie by 1
226
+ setCookie(event, 'counter', ++counter)
227
+
228
+ // Send JSON response
229
+ return { counter }
230
+ })
231
+ ```
232
+
233
+ :link-example{to="/docs/examples/advanced/use-cookie"}
@@ -0,0 +1,32 @@
1
+ ---
2
+ title: "useError"
3
+ description: useError composable returns the global Nuxt error that is being handled.
4
+ links:
5
+ - label: Source
6
+ icon: i-simple-icons-github
7
+ to: https://github.com/nuxt/nuxt/blob/main/packages/nuxt/src/app/composables/error.ts
8
+ size: xs
9
+ ---
10
+
11
+ The composable returns the global Nuxt error that is being handled and it is available on both client and server.
12
+
13
+ ```ts
14
+ const error = useError()
15
+ ```
16
+
17
+ `useError` sets an error in the state and creates a reactive as well as SSR-friendly global Nuxt error across components.
18
+
19
+ Nuxt errors have the following properties:
20
+
21
+ ```ts
22
+ interface {
23
+ // HTTP response status code
24
+ statusCode: number
25
+ // HTTP response status message
26
+ statusMessage: string
27
+ // Error message
28
+ message: string
29
+ }
30
+ ```
31
+
32
+ :read-more{to="/docs/getting-started/error-handling"}