# vuejs.school > A free AI-instructed school for Vue.js. Short tutorials, runnable code and quizzes that adapt to you. Canonical Origin: https://vuejs.school/ ## LLM Resources - [sitemap.xml](https://vuejs.school/sitemap.xml): XML sitemap for search engines and crawlers. - [robots.txt](https://vuejs.school/robots.txt): Crawler rules and permissions. ## Pages - [/](https://vuejs.school/index.md) - [/about](https://vuejs.school/about.md) - [/community/blog](https://vuejs.school/community/blog.md) - [/community/blog/2025-in-review-what-learners-got-stuck-on](https://vuejs.school/community/blog/2025-in-review-what-learners-got-stuck-on.md) - [/community/blog/a-debugging-checklist-for-vue-apps](https://vuejs.school/community/blog/a-debugging-checklist-for-vue-apps.md) - [/community/blog/a-reusable-usefetch-composable-by-hand](https://vuejs.school/community/blog/a-reusable-usefetch-composable-by-hand.md) - [/community/blog/a-spinning-3d-scene-with-tresjs-and-useloop](https://vuejs.school/community/blog/a-spinning-3d-scene-with-tresjs-and-useloop.md) - [/community/blog/a-vue-learning-plan-for-2026](https://vuejs.school/community/blog/a-vue-learning-plan-for-2026.md) - [/community/blog/accessible-components-focus-keyboard-and-aria](https://vuejs.school/community/blog/accessible-components-focus-keyboard-and-aria.md) - [/community/blog/accessible-form-errors](https://vuejs.school/community/blog/accessible-form-errors.md) - [/community/blog/add-vue-router-to-a-vite-app](https://vuejs.school/community/blog/add-vue-router-to-a-vite-app.md) - [/community/blog/ai-sdk-5-with-vue](https://vuejs.school/community/blog/ai-sdk-5-with-vue.md) - [/community/blog/ai-sdk-7-what-changes-for-vue-apps](https://vuejs.school/community/blog/ai-sdk-7-what-changes-for-vue-apps.md) - [/community/blog/animate-lists-with-transitiongroup](https://vuejs.school/community/blog/animate-lists-with-transitiongroup.md) - [/community/blog/api-security-for-ai-features](https://vuejs.school/community/blog/api-security-for-ai-features.md) - [/community/blog/async-components-suspense-and-lazy-loading](https://vuejs.school/community/blog/async-components-suspense-and-lazy-loading.md) - [/community/blog/async-state-with-useasyncstate-and-vueuses-usefetch](https://vuejs.school/community/blog/async-state-with-useasyncstate-and-vueuses-usefetch.md) - [/community/blog/async-tests-nexttick-flushpromises-and-fake-timers](https://vuejs.school/community/blog/async-tests-nexttick-flushpromises-and-fake-timers.md) - [/community/blog/authentication-and-sessions-with-nuxt-auth-utils](https://vuejs.school/community/blog/authentication-and-sessions-with-nuxt-auth-utils.md) - [/community/blog/authentication-basics-tokens-cookies-and-where-to-keep-them](https://vuejs.school/community/blog/authentication-basics-tokens-cookies-and-where-to-keep-them.md) - [/community/blog/broken-access-control-why-hiding-a-button-is-not-security](https://vuejs.school/community/blog/broken-access-control-why-hiding-a-button-is-not-security.md) - [/community/blog/build-an-mcp-server-with-nuxt-mcp-toolkit](https://vuejs.school/community/blog/build-an-mcp-server-with-nuxt-mcp-toolkit.md) - [/community/blog/canvas-and-animation-loops-in-a-vue-component](https://vuejs.school/community/blog/canvas-and-animation-loops-in-a-vue-component.md) - [/community/blog/capacitor-8-swift-package-manager-and-the-upgrade](https://vuejs.school/community/blog/capacitor-8-swift-package-manager-and-the-upgrade.md) - [/community/blog/class-and-style-bindings-without-the-mess](https://vuejs.school/community/blog/class-and-style-bindings-without-the-mess.md) - [/community/blog/component-libraries-in-2026](https://vuejs.school/community/blog/component-libraries-in-2026.md) - [/community/blog/composables-the-rules-that-keep-them-reusable](https://vuejs.school/community/blog/composables-the-rules-that-keep-them-reusable.md) - [/community/blog/computed-or-watch-a-decision-guide](https://vuejs.school/community/blog/computed-or-watch-a-decision-guide.md) - [/community/blog/computed-properties-cache-dont-recalculate](https://vuejs.school/community/blog/computed-properties-cache-dont-recalculate.md) - [/community/blog/custom-directives-and-plugins](https://vuejs.school/community/blog/custom-directives-and-plugins.md) - [/community/blog/dark-mode-and-theming-with-css-variables](https://vuejs.school/community/blog/dark-mode-and-theming-with-css-variables.md) - [/community/blog/data-fetching-with-pinia-colada](https://vuejs.school/community/blog/data-fetching-with-pinia-colada.md) - [/community/blog/debounce-and-throttle-with-vueuse](https://vuejs.school/community/blog/debounce-and-throttle-with-vueuse.md) - [/community/blog/desktop-apps-with-tauri-2-and-vue](https://vuejs.school/community/blog/desktop-apps-with-tauri-2-and-vue.md) - [/community/blog/dynamic-routes-params-and-typed-routes](https://vuejs.school/community/blog/dynamic-routes-params-and-typed-routes.md) - [/community/blog/editor-and-vue-devtools-setup-in-2026](https://vuejs.school/community/blog/editor-and-vue-devtools-setup-in-2026.md) - [/community/blog/end-to-end-tests-with-playwright](https://vuejs.school/community/blog/end-to-end-tests-with-playwright.md) - [/community/blog/enter-and-leave-animations-with-transition](https://vuejs.school/community/blog/enter-and-leave-animations-with-transition.md) - [/community/blog/environment-variables-and-deployment](https://vuejs.school/community/blog/environment-variables-and-deployment.md) - [/community/blog/error-handling-in-vue](https://vuejs.school/community/blog/error-handling-in-vue.md) - [/community/blog/eslint-10-with-eslint-plugin-vue](https://vuejs.school/community/blog/eslint-10-with-eslint-plugin-vue.md) - [/community/blog/eslint-plugin-vue-10-and-flat-config](https://vuejs.school/community/blog/eslint-plugin-vue-10-and-flat-config.md) - [/community/blog/fetch-data-in-a-component-loading-error-empty](https://vuejs.school/community/blog/fetch-data-in-a-component-loading-error-empty.md) - [/community/blog/file-based-routing-in-nuxt-3](https://vuejs.school/community/blog/file-based-routing-in-nuxt-3.md) - [/community/blog/finished-a-track-how-to-keep-the-knowledge](https://vuejs.school/community/blog/finished-a-track-how-to-keep-the-knowledge.md) - [/community/blog/form-state-and-validation-by-hand](https://vuejs.school/community/blog/form-state-and-validation-by-hand.md) - [/community/blog/forms-and-inputs-v-model-modifiers-checkboxes-and-selects](https://vuejs.school/community/blog/forms-and-inputs-v-model-modifiers-checkboxes-and-selects.md) - [/community/blog/generic-components-with-script-setup-generic](https://vuejs.school/community/blog/generic-components-with-script-setup-generic.md) - [/community/blog/how-the-ai-instructor-picks-your-questions](https://vuejs.school/community/blog/how-the-ai-instructor-picks-your-questions.md) - [/community/blog/how-to-read-the-vue-docs](https://vuejs.school/community/blog/how-to-read-the-vue-docs.md) - [/community/blog/injection-and-xss-where-vue-protects-you](https://vuejs.school/community/blog/injection-and-xss-where-vue-protects-you.md) - [/community/blog/internationalisation-with-vue-i18n-11](https://vuejs.school/community/blog/internationalisation-with-vue-i18n-11.md) - [/community/blog/keep-state-across-reloads-with-usestorage](https://vuejs.school/community/blog/keep-state-across-reloads-with-usestorage.md) - [/community/blog/layouts-and-definepagemeta-in-nuxt](https://vuejs.school/community/blog/layouts-and-definepagemeta-in-nuxt.md) - [/community/blog/learning-vue-in-20-minutes-a-day](https://vuejs.school/community/blog/learning-vue-in-20-minutes-a-day.md) - [/community/blog/lifecycle-hooks-and-template-refs](https://vuejs.school/community/blog/lifecycle-hooks-and-template-refs.md) - [/community/blog/llms-txt-make-your-docs-readable-by-ai-models](https://vuejs.school/community/blog/llms-txt-make-your-docs-readable-by-ai-models.md) - [/community/blog/make-your-vue-app-installable-pwa-basics](https://vuejs.school/community/blog/make-your-vue-app-installable-pwa-basics.md) - [/community/blog/meet-nuxi-the-nuxt-cli-rebuilt](https://vuejs.school/community/blog/meet-nuxi-the-nuxt-cli-rebuilt.md) - [/community/blog/migrating-from-unplugin-vue-router-to-vue-router-5](https://vuejs.school/community/blog/migrating-from-unplugin-vue-router-to-vue-router-5.md) - [/community/blog/mobile-ui-with-ionic-vue-8](https://vuejs.school/community/blog/mobile-ui-with-ionic-vue-8.md) - [/community/blog/mocking-fetch-modules-and-timers-in-vitest](https://vuejs.school/community/blog/mocking-fetch-modules-and-timers-in-vitest.md) - [/community/blog/motion-for-vue-2-what-changed](https://vuejs.school/community/blog/motion-for-vue-2-what-changed.md) - [/community/blog/multi-step-forms-with-a-pinia-store](https://vuejs.school/community/blog/multi-step-forms-with-a-pinia-store.md) - [/community/blog/navigation-guards-protecting-routes](https://vuejs.school/community/blog/navigation-guards-protecting-routes.md) - [/community/blog/nested-routes-and-layouts-with-vue-router](https://vuejs.school/community/blog/nested-routes-and-layouts-with-vue-router.md) - [/community/blog/node-24-for-vue-developers](https://vuejs.school/community/blog/node-24-for-vue-developers.md) - [/community/blog/nuxt-3-16-whats-new](https://vuejs.school/community/blog/nuxt-3-16-whats-new.md) - [/community/blog/nuxt-3-17-the-async-data-layer-reworked](https://vuejs.school/community/blog/nuxt-3-17-the-async-data-layer-reworked.md) - [/community/blog/nuxt-3-end-of-life-a-checklist](https://vuejs.school/community/blog/nuxt-3-end-of-life-a-checklist.md) - [/community/blog/nuxt-4-1-lazy-hydration-and-import-maps](https://vuejs.school/community/blog/nuxt-4-1-lazy-hydration-and-import-maps.md) - [/community/blog/nuxt-4-2-abort-signals-and-the-dev-overlay](https://vuejs.school/community/blog/nuxt-4-2-abort-signals-and-the-dev-overlay.md) - [/community/blog/nuxt-4-3-applayout-server-alias-and-isr-payloads](https://vuejs.school/community/blog/nuxt-4-3-applayout-server-alias-and-isr-payloads.md) - [/community/blog/nuxt-4-4-createusefetch-vue-router-5-and-useannouncer](https://vuejs.school/community/blog/nuxt-4-4-createusefetch-vue-router-5-and-useannouncer.md) - [/community/blog/nuxt-4-5-vite-8-ssr-streaming-and-uselayout](https://vuejs.school/community/blog/nuxt-4-5-vite-8-ssr-streaming-and-uselayout.md) - [/community/blog/nuxt-4-alpha-and-the-roadmap](https://vuejs.school/community/blog/nuxt-4-alpha-and-the-roadmap.md) - [/community/blog/nuxt-4-is-here](https://vuejs.school/community/blog/nuxt-4-is-here.md) - [/community/blog/nuxt-content-3-a-markdown-blog-in-an-afternoon](https://vuejs.school/community/blog/nuxt-content-3-a-markdown-blog-in-an-afternoon.md) - [/community/blog/nuxt-scripts-1-0](https://vuejs.school/community/blog/nuxt-scripts-1-0.md) - [/community/blog/nuxt-test-utils-4-what-changed](https://vuejs.school/community/blog/nuxt-test-utils-4-what-changed.md) - [/community/blog/nuxt-ui-v3-first-look](https://vuejs.school/community/blog/nuxt-ui-v3-first-look.md) - [/community/blog/nuxt-ui-v4-one-free-package](https://vuejs.school/community/blog/nuxt-ui-v4-one-free-package.md) - [/community/blog/nuxtlabs-joins-vercel-what-changes-and-what-does-not](https://vuejs.school/community/blog/nuxtlabs-joins-vercel-what-changes-and-what-does-not.md) - [/community/blog/oxlint-1-0-a-faster-linter-next-to-eslint](https://vuejs.school/community/blog/oxlint-1-0-a-faster-linter-next-to-eslint.md) - [/community/blog/page-transitions-with-the-view-transitions-api-and-motion-v](https://vuejs.school/community/blog/page-transitions-with-the-view-transitions-api-and-motion-v.md) - [/community/blog/performance-lazy-hydration-v-memo-and-measuring-first](https://vuejs.school/community/blog/performance-lazy-hydration-v-memo-and-measuring-first.md) - [/community/blog/persist-pinia-state-with-a-plugin](https://vuejs.school/community/blog/persist-pinia-state-with-a-plugin.md) - [/community/blog/pinia-3-is-out](https://vuejs.school/community/blog/pinia-3-is-out.md) - [/community/blog/pinia-4-what-changed-and-what-to-do](https://vuejs.school/community/blog/pinia-4-what-changed-and-what-to-do.md) - [/community/blog/pinia-colada-1-0-is-stable](https://vuejs.school/community/blog/pinia-colada-1-0-is-stable.md) - [/community/blog/pinia-from-the-inside-state-getters-actions](https://vuejs.school/community/blog/pinia-from-the-inside-state-getters-actions.md) - [/community/blog/props-down-events-up](https://vuejs.school/community/blog/props-down-events-up.md) - [/community/blog/provide-and-inject-explained-with-a-theme](https://vuejs.school/community/blog/provide-and-inject-explained-with-a-theme.md) - [/community/blog/rag-in-a-nuxt-app-a-chatbot-that-knows-your-docs](https://vuejs.school/community/blog/rag-in-a-nuxt-app-a-chatbot-that-knows-your-docs.md) - [/community/blog/reactive-props-destructure-in-vue-3-5](https://vuejs.school/community/blog/reactive-props-destructure-in-vue-3-5.md) - [/community/blog/reactive-svg-charts-with-nothing-but-vue](https://vuejs.school/community/blog/reactive-svg-charts-with-nothing-but-vue.md) - [/community/blog/reactivity-in-depth-proxies-and-effects](https://vuejs.school/community/blog/reactivity-in-depth-proxies-and-effects.md) - [/community/blog/real-time-ui-with-websockets-and-sse](https://vuejs.school/community/blog/real-time-ui-with-websockets-and-sse.md) - [/community/blog/ref-or-reactive-how-vue-tracks-your-data](https://vuejs.school/community/blog/ref-or-reactive-how-vue-tracks-your-data.md) - [/community/blog/render-functions-and-jsx](https://vuejs.school/community/blog/render-functions-and-jsx.md) - [/community/blog/rendering-modes-in-nuxt-ssr-ssg-isr-and-routerules](https://vuejs.school/community/blog/rendering-modes-in-nuxt-ssr-ssg-isr-and-routerules.md) - [/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable](https://vuejs.school/community/blog/rolldown-1-0-the-bundler-under-vite-8-is-stable.md) - [/community/blog/route-middleware-in-nuxt-4](https://vuejs.school/community/blog/route-middleware-in-nuxt-4.md) - [/community/blog/run-a-language-model-in-the-browser-with-webllm](https://vuejs.school/community/blog/run-a-language-model-in-the-browser-with-webllm.md) - [/community/blog/schema-validation-with-zod-4-and-veevalidate](https://vuejs.school/community/blog/schema-validation-with-zod-4-and-veevalidate.md) - [/community/blog/scoped-styles-css-modules-and-v-bind-in-sfcs](https://vuejs.school/community/blog/scoped-styles-css-modules-and-v-bind-in-sfcs.md) - [/community/blog/security-basics-for-vue-apps](https://vuejs.school/community/blog/security-basics-for-vue-apps.md) - [/community/blog/security-headers-and-csp-with-nuxt-security](https://vuejs.school/community/blog/security-headers-and-csp-with-nuxt-security.md) - [/community/blog/sensors-and-the-viewport-with-vueuse](https://vuejs.school/community/blog/sensors-and-the-viewport-with-vueuse.md) - [/community/blog/seo-meta-open-graph-and-error-pages-in-nuxt](https://vuejs.school/community/blog/seo-meta-open-graph-and-error-pages-in-nuxt.md) - [/community/blog/setup-stores-or-option-stores](https://vuejs.school/community/blog/setup-stores-or-option-stores.md) - [/community/blog/slots-explained-default-named-and-scoped](https://vuejs.school/community/blog/slots-explained-default-named-and-scoped.md) - [/community/blog/ssr-and-hydration-explained](https://vuejs.school/community/blog/ssr-and-hydration-explained.md) - [/community/blog/stores-that-use-other-stores](https://vuejs.school/community/blog/stores-that-use-other-stores.md) - [/community/blog/streaming-ai-responses-fetch-readablestream-and-the-ai-sdk](https://vuejs.school/community/blog/streaming-ai-responses-fetch-readablestream-and-the-ai-sdk.md) - [/community/blog/summarize-text-in-the-browser-with-chromes-summarizer-api](https://vuejs.school/community/blog/summarize-text-in-the-browser-with-chromes-summarizer-api.md) - [/community/blog/supply-chain-security-lockfiles-provenance-and-owasp-a03](https://vuejs.school/community/blog/supply-chain-security-lockfiles-provenance-and-owasp-a03.md) - [/community/blog/tailwind-css-4-1-text-shadows-and-masks](https://vuejs.school/community/blog/tailwind-css-4-1-text-shadows-and-masks.md) - [/community/blog/tailwind-css-4-with-vue-and-vite](https://vuejs.school/community/blog/tailwind-css-4-with-vue-and-vite.md) - [/community/blog/tanstack-query-or-pinia-colada](https://vuejs.school/community/blog/tanstack-query-or-pinia-colada.md) - [/community/blog/tauri-plugins-mobile-builds-and-the-updater](https://vuejs.school/community/blog/tauri-plugins-mobile-builds-and-the-updater.md) - [/community/blog/teleport-modals-that-escape-their-parent](https://vuejs.school/community/blog/teleport-modals-that-escape-their-parent.md) - [/community/blog/testing-library-and-vitest-browser-mode-for-vue](https://vuejs.school/community/blog/testing-library-and-vitest-browser-mode-for-vue.md) - [/community/blog/testing-nuxt-apps-mountsuspended-and-registerendpoint](https://vuejs.school/community/blog/testing-nuxt-apps-mountsuspended-and-registerendpoint.md) - [/community/blog/testing-pinia-stores-with-createtestingpinia](https://vuejs.school/community/blog/testing-pinia-stores-with-createtestingpinia.md) - [/community/blog/testing-props-emits-and-slots](https://vuejs.school/community/blog/testing-props-emits-and-slots.md) - [/community/blog/the-nuxt-agent-and-the-nuxt-mcp-server](https://vuejs.school/community/blog/the-nuxt-agent-and-the-nuxt-mcp-server.md) - [/community/blog/the-owasp-top-10-2025-read-as-a-vue-developer](https://vuejs.school/community/blog/the-owasp-top-10-2025-read-as-a-vue-developer.md) - [/community/blog/tools-and-structured-output-with-the-ai-sdk-7](https://vuejs.school/community/blog/tools-and-structured-output-with-the-ai-sdk-7.md) - [/community/blog/transformers-js-4-in-a-vue-app](https://vuejs.school/community/blog/transformers-js-4-in-a-vue-app.md) - [/community/blog/tresjs-5-three-js-scenes-as-vue-components](https://vuejs.school/community/blog/tresjs-5-three-js-scenes-as-vue-components.md) - [/community/blog/turn-a-vue-app-into-a-mobile-app-with-capacitor-7](https://vuejs.school/community/blog/turn-a-vue-app-into-a-mobile-app-with-capacitor-7.md) - [/community/blog/type-checking-a-vue-project-vue-tsc-editor-ci](https://vuejs.school/community/blog/type-checking-a-vue-project-vue-tsc-editor-ci.md) - [/community/blog/typed-slots-defineexpose-and-component-instances](https://vuejs.school/community/blog/typed-slots-defineexpose-and-component-instances.md) - [/community/blog/typescript-6-the-bridge-release](https://vuejs.school/community/blog/typescript-6-the-bridge-release.md) - [/community/blog/typescript-7-the-go-compiler-lands](https://vuejs.school/community/blog/typescript-7-the-go-compiler-lands.md) - [/community/blog/typescript-strict-mode-in-a-vue-project](https://vuejs.school/community/blog/typescript-strict-mode-in-a-vue-project.md) - [/community/blog/typing-props-and-emits-in-script-setup](https://vuejs.school/community/blog/typing-props-and-emits-in-script-setup.md) - [/community/blog/typing-refs-computed-and-inject](https://vuejs.school/community/blog/typing-refs-computed-and-inject.md) - [/community/blog/upgrading-a-nuxt-3-app-to-nuxt-4](https://vuejs.school/community/blog/upgrading-a-nuxt-3-app-to-nuxt-4.md) - [/community/blog/upgrading-a-pinia-3-project-to-pinia-4](https://vuejs.school/community/blog/upgrading-a-pinia-3-project-to-pinia-4.md) - [/community/blog/usefetch-or-fetch-picking-the-right-one-in-nuxt](https://vuejs.school/community/blog/usefetch-or-fetch-picking-the-right-one-in-nuxt.md) - [/community/blog/usestate-ref-or-pinia-in-nuxt](https://vuejs.school/community/blog/usestate-ref-or-pinia-in-nuxt.md) - [/community/blog/v-if-v-show-and-v-for](https://vuejs.school/community/blog/v-if-v-show-and-v-for.md) - [/community/blog/v-model-on-your-own-components-with-definemodel](https://vuejs.school/community/blog/v-model-on-your-own-components-with-definemodel.md) - [/community/blog/vapor-mode-explained-without-the-hype](https://vuejs.school/community/blog/vapor-mode-explained-without-the-hype.md) - [/community/blog/veevalidate-or-formkit](https://vuejs.school/community/blog/veevalidate-or-formkit.md) - [/community/blog/vite-7-what-changes-for-vue](https://vuejs.school/community/blog/vite-7-what-changes-for-vue.md) - [/community/blog/vite-8-beta-rolldown-becomes-the-bundler](https://vuejs.school/community/blog/vite-8-beta-rolldown-becomes-the-bundler.md) - [/community/blog/vite-8-is-out](https://vuejs.school/community/blog/vite-8-is-out.md) - [/community/blog/vitest-3-2-projects-annotations-and-scoped-fixtures](https://vuejs.school/community/blog/vitest-3-2-projects-annotations-and-scoped-fixtures.md) - [/community/blog/vitest-3-what-changes-for-vue-tests](https://vuejs.school/community/blog/vitest-3-what-changes-for-vue-tests.md) - [/community/blog/vitest-4-browser-mode-is-stable](https://vuejs.school/community/blog/vitest-4-browser-mode-is-stable.md) - [/community/blog/vitest-5-rc-whats-coming](https://vuejs.school/community/blog/vitest-5-rc-whats-coming.md) - [/community/blog/vitest-5-what-changed-for-vue-tests](https://vuejs.school/community/blog/vitest-5-what-changed-for-vue-tests.md) - [/community/blog/vue-3-6-alpha-vapor-mode-arrives](https://vuejs.school/community/blog/vue-3-6-alpha-vapor-mode-arrives.md) - [/community/blog/vue-3-6-and-vapor-mode-where-things-stand](https://vuejs.school/community/blog/vue-3-6-and-vapor-mode-where-things-stand.md) - [/community/blog/vue-3-6-beta-vapor-mode-first-look](https://vuejs.school/community/blog/vue-3-6-beta-vapor-mode-first-look.md) - [/community/blog/vue-3-6-reaches-release-candidate](https://vuejs.school/community/blog/vue-3-6-reaches-release-candidate.md) - [/community/blog/vue-language-tools-3-and-vue-tsc-3](https://vuejs.school/community/blog/vue-language-tools-3-and-vue-tsc-3.md) - [/community/blog/vue-router-4-6-whats-new](https://vuejs.school/community/blog/vue-router-4-6-whats-new.md) - [/community/blog/vue-router-5-file-based-routing-moves-into-core](https://vuejs.school/community/blog/vue-router-5-file-based-routing-moves-into-core.md) - [/community/blog/vue-warnings-decoded](https://vuejs.school/community/blog/vue-warnings-decoded.md) - [/community/blog/vueuse-13-esm-only](https://vuejs.school/community/blog/vueuse-13-esm-only.md) - [/community/blog/vueuse-14-vue-3-5-minimum](https://vuejs.school/community/blog/vueuse-14-vue-3-5-minimum.md) - [/community/blog/vueuse-15-the-breaking-changes-in-plain-words](https://vuejs.school/community/blog/vueuse-15-the-breaking-changes-in-plain-words.md) - [/community/blog/vueuse-15s-new-composables-usewebmcp-useliveannouncer-usetemporalnow](https://vuejs.school/community/blog/vueuse-15s-new-composables-usewebmcp-useliveannouncer-usetemporalnow.md) - [/community/blog/watchers-in-depth](https://vuejs.school/community/blog/watchers-in-depth.md) - [/community/blog/webmcp-let-ai-agents-use-your-app](https://vuejs.school/community/blog/webmcp-let-ai-agents-use-your-app.md) - [/community/blog/welcome-to-vuejs-school](https://vuejs.school/community/blog/welcome-to-vuejs-school.md) - [/community/blog/what-nitro-and-h3-do-under-your-server-routes](https://vuejs.school/community/blog/what-nitro-and-h3-do-under-your-server-routes.md) - [/community/blog/what-to-test-in-a-vue-app](https://vuejs.school/community/blog/what-to-test-in-a-vue-app.md) - [/community/blog/whats-new-in-nuxt-4-6](https://vuejs.school/community/blog/whats-new-in-nuxt-4-6.md) - [/community/blog/why-every-lesson-ends-with-a-quiz](https://vuejs.school/community/blog/why-every-lesson-ends-with-a-quiz.md) - [/community/blog/why-storetorefs-drops-your-actions](https://vuejs.school/community/blog/why-storetorefs-drops-your-actions.md) - [/community/blog/why-we-schedule-your-reviews-with-spaced-repetition](https://vuejs.school/community/blog/why-we-schedule-your-reviews-with-spaced-repetition.md) - [/community/blog/why-your-quiz-brings-old-questions-back](https://vuejs.school/community/blog/why-your-quiz-brings-old-questions-back.md) - [/community/blog/write-a-composable-the-vueuse-way](https://vuejs.school/community/blog/write-a-composable-the-vueuse-way.md) - [/community/blog/your-first-api-route-in-nuxt](https://vuejs.school/community/blog/your-first-api-route-in-nuxt.md) - [/community/blog/your-first-component-test-with-vitest-and-vue-test-utils](https://vuejs.school/community/blog/your-first-component-test-with-vitest-and-vue-test-utils.md) - [/community/blog/your-first-vue-component](https://vuejs.school/community/blog/your-first-vue-component.md) - [/community/blog/zod-4-is-stable-what-changes-in-your-schemas](https://vuejs.school/community/blog/zod-4-is-stable-what-changes-in-your-schemas.md) - [/community/jobs](https://vuejs.school/community/jobs.md) - [/contact](https://vuejs.school/contact.md) - [/editor](https://vuejs.school/editor.md) - [/games](https://vuejs.school/games.md) - [/games/bug-hunt](https://vuejs.school/games/bug-hunt.md) - [/games/bug-hunt/1](https://vuejs.school/games/bug-hunt/1.md) - [/games/bug-hunt/2](https://vuejs.school/games/bug-hunt/2.md) - [/games/bug-hunt/3](https://vuejs.school/games/bug-hunt/3.md) - [/games/lifecycle](https://vuejs.school/games/lifecycle.md) - [/games/lifecycle/1](https://vuejs.school/games/lifecycle/1.md) - [/games/lifecycle/2](https://vuejs.school/games/lifecycle/2.md) - [/games/lifecycle/3](https://vuejs.school/games/lifecycle/3.md) - [/games/lifecycle/4](https://vuejs.school/games/lifecycle/4.md) - [/games/lifecycle/5](https://vuejs.school/games/lifecycle/5.md) - [/games/lifecycle/6](https://vuejs.school/games/lifecycle/6.md) - [/games/lifecycle/7](https://vuejs.school/games/lifecycle/7.md) - [/games/radar](https://vuejs.school/games/radar.md) - [/games/radar/1](https://vuejs.school/games/radar/1.md) - [/games/radar/2](https://vuejs.school/games/radar/2.md) - [/games/radar/3](https://vuejs.school/games/radar/3.md) - [/learn/advanced/composables](https://vuejs.school/learn/advanced/composables.md) - [/learn/advanced/custom-directives-and-plugins](https://vuejs.school/learn/advanced/custom-directives-and-plugins.md) - [/learn/advanced/dynamic-and-async-components](https://vuejs.school/learn/advanced/dynamic-and-async-components.md) - [/learn/advanced/error-handling-and-debugging](https://vuejs.school/learn/advanced/error-handling-and-debugging.md) - [/learn/advanced/performance-and-vapor-mode](https://vuejs.school/learn/advanced/performance-and-vapor-mode.md) - [/learn/advanced/provide-and-inject](https://vuejs.school/learn/advanced/provide-and-inject.md) - [/learn/advanced/reactivity-in-depth](https://vuejs.school/learn/advanced/reactivity-in-depth.md) - [/learn/advanced/reading-options-api-code](https://vuejs.school/learn/advanced/reading-options-api-code.md) - [/learn/advanced/render-functions-and-jsx](https://vuejs.school/learn/advanced/render-functions-and-jsx.md) - [/learn/advanced/teleport-and-suspense](https://vuejs.school/learn/advanced/teleport-and-suspense.md) - [/learn/advanced/watchers-in-depth](https://vuejs.school/learn/advanced/watchers-in-depth.md) - [/learn/ai/ai-for-vue-developers-the-map](https://vuejs.school/learn/ai/ai-for-vue-developers-the-map.md) - [/learn/ai/chromes-built-in-ai-apis](https://vuejs.school/learn/ai/chromes-built-in-ai-apis.md) - [/learn/ai/llms-txt-make-your-site-readable-by-models](https://vuejs.school/learn/ai/llms-txt-make-your-site-readable-by-models.md) - [/learn/ai/mcp-servers-and-ai-assisted-development](https://vuejs.school/learn/ai/mcp-servers-and-ai-assisted-development.md) - [/learn/ai/models-in-the-browser-webllm-and-transformers-js](https://vuejs.school/learn/ai/models-in-the-browser-webllm-and-transformers-js.md) - [/learn/ai/retrieval-a-chatbot-that-knows-your-docs](https://vuejs.school/learn/ai/retrieval-a-chatbot-that-knows-your-docs.md) - [/learn/ai/securing-and-testing-ai-features](https://vuejs.school/learn/ai/securing-and-testing-ai-features.md) - [/learn/ai/streaming-ai-responses](https://vuejs.school/learn/ai/streaming-ai-responses.md) - [/learn/ai/tools-and-structured-output-with-the-ai-sdk](https://vuejs.school/learn/ai/tools-and-structured-output-with-the-ai-sdk.md) - [/learn/ai/webmcp-let-agents-use-your-app](https://vuejs.school/learn/ai/webmcp-let-agents-use-your-app.md) - [/learn/animation/animating-lists-with-transitiongroup](https://vuejs.school/learn/animation/animating-lists-with-transitiongroup.md) - [/learn/animation/enter-and-leave-with-transition](https://vuejs.school/learn/animation/enter-and-leave-with-transition.md) - [/learn/animation/motion-libraries-and-view-transitions](https://vuejs.school/learn/animation/motion-libraries-and-view-transitions.md) - [/learn/animation/page-and-view-transitions](https://vuejs.school/learn/animation/page-and-view-transitions.md) - [/learn/beginner/class-and-style-bindings](https://vuejs.school/learn/beginner/class-and-style-bindings.md) - [/learn/beginner/components-and-props](https://vuejs.school/learn/beginner/components-and-props.md) - [/learn/beginner/computed-properties](https://vuejs.school/learn/beginner/computed-properties.md) - [/learn/beginner/directives](https://vuejs.school/learn/beginner/directives.md) - [/learn/beginner/events-and-v-model](https://vuejs.school/learn/beginner/events-and-v-model.md) - [/learn/beginner/forms-and-inputs](https://vuejs.school/learn/beginner/forms-and-inputs.md) - [/learn/beginner/lifecycle-and-template-refs](https://vuejs.school/learn/beginner/lifecycle-and-template-refs.md) - [/learn/beginner/reactivity-basics](https://vuejs.school/learn/beginner/reactivity-basics.md) - [/learn/beginner/slots](https://vuejs.school/learn/beginner/slots.md) - [/learn/beginner/watchers](https://vuejs.school/learn/beginner/watchers.md) - [/learn/beginner/your-first-component](https://vuejs.school/learn/beginner/your-first-component.md) - [/learn/data/a-reusable-usefetch-composable](https://vuejs.school/learn/data/a-reusable-usefetch-composable.md) - [/learn/data/fetching-data-in-a-component](https://vuejs.school/learn/data/fetching-data-in-a-component.md) - [/learn/data/mutations-optimistic-updates-and-pagination](https://vuejs.school/learn/data/mutations-optimistic-updates-and-pagination.md) - [/learn/data/query-libraries-tanstack-and-pinia-colada](https://vuejs.school/learn/data/query-libraries-tanstack-and-pinia-colada.md) - [/learn/data/real-time-with-websockets-and-sse](https://vuejs.school/learn/data/real-time-with-websockets-and-sse.md) - [/learn/forms/file-uploads](https://vuejs.school/learn/forms/file-uploads.md) - [/learn/forms/form-libraries-veevalidate-and-formkit](https://vuejs.school/learn/forms/form-libraries-veevalidate-and-formkit.md) - [/learn/forms/form-state-and-validation-by-hand](https://vuejs.school/learn/forms/form-state-and-validation-by-hand.md) - [/learn/forms/schema-validation-with-zod](https://vuejs.school/learn/forms/schema-validation-with-zod.md) - [/learn/graphics/3d-scenes-with-tresjs](https://vuejs.school/learn/graphics/3d-scenes-with-tresjs.md) - [/learn/graphics/canvas-and-animation-loops](https://vuejs.school/learn/graphics/canvas-and-animation-loops.md) - [/learn/graphics/reactive-svg-charts](https://vuejs.school/learn/graphics/reactive-svg-charts.md) - [/learn/multiplatform/desktop-apps-with-tauri](https://vuejs.school/learn/multiplatform/desktop-apps-with-tauri.md) - [/learn/multiplatform/installable-web-apps-pwa](https://vuejs.school/learn/multiplatform/installable-web-apps-pwa.md) - [/learn/multiplatform/mobile-apps-with-capacitor](https://vuejs.school/learn/multiplatform/mobile-apps-with-capacitor.md) - [/learn/multiplatform/mobile-ui-with-ionic-vue](https://vuejs.school/learn/multiplatform/mobile-ui-with-ionic-vue.md) - [/learn/multiplatform/tauri-plugins-and-mobile](https://vuejs.school/learn/multiplatform/tauri-plugins-and-mobile.md) - [/learn/nuxt/a-nuxt-project-tour](https://vuejs.school/learn/nuxt/a-nuxt-project-tour.md) - [/learn/nuxt/data-fetching](https://vuejs.school/learn/nuxt/data-fetching.md) - [/learn/nuxt/file-based-routing](https://vuejs.school/learn/nuxt/file-based-routing.md) - [/learn/nuxt/layouts-and-page-meta](https://vuejs.school/learn/nuxt/layouts-and-page-meta.md) - [/learn/nuxt/middleware-sessions-and-auth](https://vuejs.school/learn/nuxt/middleware-sessions-and-auth.md) - [/learn/nuxt/modules-and-the-nuxt-ecosystem](https://vuejs.school/learn/nuxt/modules-and-the-nuxt-ecosystem.md) - [/learn/nuxt/rendering-modes-and-deployment](https://vuejs.school/learn/nuxt/rendering-modes-and-deployment.md) - [/learn/nuxt/seo-meta-and-error-pages](https://vuejs.school/learn/nuxt/seo-meta-and-error-pages.md) - [/learn/nuxt/server-routes](https://vuejs.school/learn/nuxt/server-routes.md) - [/learn/nuxt/ssr-and-hydration](https://vuejs.school/learn/nuxt/ssr-and-hydration.md) - [/learn/nuxt/state-and-composables](https://vuejs.school/learn/nuxt/state-and-composables.md) - [/learn/pinia/data-fetching-with-pinia-colada](https://vuejs.school/learn/pinia/data-fetching-with-pinia-colada.md) - [/learn/pinia/persisting-state-and-plugins](https://vuejs.school/learn/pinia/persisting-state-and-plugins.md) - [/learn/pinia/setup-stores](https://vuejs.school/learn/pinia/setup-stores.md) - [/learn/pinia/store-to-refs](https://vuejs.school/learn/pinia/store-to-refs.md) - [/learn/pinia/stores-working-together](https://vuejs.school/learn/pinia/stores-working-together.md) - [/learn/pinia/your-first-store](https://vuejs.school/learn/pinia/your-first-store.md) - [/learn/routing/dynamic-routes-and-params](https://vuejs.school/learn/routing/dynamic-routes-and-params.md) - [/learn/routing/file-based-routing-with-vue-router-5](https://vuejs.school/learn/routing/file-based-routing-with-vue-router-5.md) - [/learn/routing/navigation-guards](https://vuejs.school/learn/routing/navigation-guards.md) - [/learn/routing/nested-routes-and-layouts](https://vuejs.school/learn/routing/nested-routes-and-layouts.md) - [/learn/routing/your-first-router](https://vuejs.school/learn/routing/your-first-router.md) - [/learn/security/api-security-error-handling-and-ai](https://vuejs.school/learn/security/api-security-error-handling-and-ai.md) - [/learn/security/authentication-and-session-failures](https://vuejs.school/learn/security/authentication-and-session-failures.md) - [/learn/security/broken-access-control](https://vuejs.school/learn/security/broken-access-control.md) - [/learn/security/injection-and-cross-site-scripting](https://vuejs.school/learn/security/injection-and-cross-site-scripting.md) - [/learn/security/security-headers-and-csp](https://vuejs.school/learn/security/security-headers-and-csp.md) - [/learn/security/supply-chain-and-integrity](https://vuejs.school/learn/security/supply-chain-and-integrity.md) - [/learn/security/the-owasp-top-10-for-vue-developers](https://vuejs.school/learn/security/the-owasp-top-10-for-vue-developers.md) - [/learn/styling/accessible-components](https://vuejs.school/learn/styling/accessible-components.md) - [/learn/styling/component-libraries](https://vuejs.school/learn/styling/component-libraries.md) - [/learn/styling/css-in-single-file-components](https://vuejs.school/learn/styling/css-in-single-file-components.md) - [/learn/styling/dark-mode-and-theming](https://vuejs.school/learn/styling/dark-mode-and-theming.md) - [/learn/styling/tailwind-css-with-vue](https://vuejs.school/learn/styling/tailwind-css-with-vue.md) - [/learn/testing/end-to-end-tests-with-playwright](https://vuejs.school/learn/testing/end-to-end-tests-with-playwright.md) - [/learn/testing/testing-async-code-and-mocks](https://vuejs.school/learn/testing/testing-async-code-and-mocks.md) - [/learn/testing/testing-library-and-browser-mode](https://vuejs.school/learn/testing/testing-library-and-browser-mode.md) - [/learn/testing/testing-nuxt-apps](https://vuejs.school/learn/testing/testing-nuxt-apps.md) - [/learn/testing/testing-pinia-stores](https://vuejs.school/learn/testing/testing-pinia-stores.md) - [/learn/testing/testing-props-emits-and-slots](https://vuejs.school/learn/testing/testing-props-emits-and-slots.md) - [/learn/testing/vitest-and-vue-test-utils](https://vuejs.school/learn/testing/vitest-and-vue-test-utils.md) - [/learn/tooling/editor-and-vue-devtools](https://vuejs.school/learn/tooling/editor-and-vue-devtools.md) - [/learn/tooling/environment-variables-and-deployment](https://vuejs.school/learn/tooling/environment-variables-and-deployment.md) - [/learn/tooling/internationalisation-with-vue-i18n](https://vuejs.school/learn/tooling/internationalisation-with-vue-i18n.md) - [/learn/tooling/linting-and-formatting](https://vuejs.school/learn/tooling/linting-and-formatting.md) - [/learn/tooling/project-structure-and-conventions](https://vuejs.school/learn/tooling/project-structure-and-conventions.md) - [/learn/tooling/start-a-project-with-create-vue](https://vuejs.school/learn/tooling/start-a-project-with-create-vue.md) - [/learn/typescript/generic-components-and-slots](https://vuejs.school/learn/typescript/generic-components-and-slots.md) - [/learn/typescript/type-checking-and-editor-setup](https://vuejs.school/learn/typescript/type-checking-and-editor-setup.md) - [/learn/typescript/typing-props-emits-and-models](https://vuejs.school/learn/typescript/typing-props-emits-and-models.md) - [/learn/typescript/typing-refs-computed-and-inject](https://vuejs.school/learn/typescript/typing-refs-computed-and-inject.md) - [/learn/vueuse/async-state-and-network](https://vuejs.school/learn/vueuse/async-state-and-network.md) - [/learn/vueuse/debounce-throttle-and-timers](https://vuejs.school/learn/vueuse/debounce-throttle-and-timers.md) - [/learn/vueuse/meet-vueuse](https://vuejs.school/learn/vueuse/meet-vueuse.md) - [/learn/vueuse/saving-state-with-usestorage](https://vuejs.school/learn/vueuse/saving-state-with-usestorage.md) - [/learn/vueuse/sensors-and-the-viewport](https://vuejs.school/learn/vueuse/sensors-and-the-viewport.md) - [/learn/vueuse/write-a-composable-like-vueuse](https://vuejs.school/learn/vueuse/write-a-composable-like-vueuse.md) - [/practice](https://vuejs.school/practice.md) - [/roadmap](https://vuejs.school/roadmap.md) - [/sponsors](https://vuejs.school/sponsors.md) - [/start](https://vuejs.school/start.md) - [/track](https://vuejs.school/track.md) - [/track/advanced](https://vuejs.school/track/advanced.md) - [/track/ai](https://vuejs.school/track/ai.md) - [/track/animation](https://vuejs.school/track/animation.md) - [/track/beginner](https://vuejs.school/track/beginner.md) - [/track/data](https://vuejs.school/track/data.md) - [/track/forms](https://vuejs.school/track/forms.md) - [/track/graphics](https://vuejs.school/track/graphics.md) - [/track/multiplatform](https://vuejs.school/track/multiplatform.md) - [/track/nuxt](https://vuejs.school/track/nuxt.md) - [/track/pinia](https://vuejs.school/track/pinia.md) - [/track/routing](https://vuejs.school/track/routing.md) - [/track/security](https://vuejs.school/track/security.md) - [/track/styling](https://vuejs.school/track/styling.md) - [/track/testing](https://vuejs.school/track/testing.md) - [/track/tooling](https://vuejs.school/track/tooling.md) - [/track/typescript](https://vuejs.school/track/typescript.md) - [/track/vueuse](https://vuejs.school/track/vueuse.md)