Learn Vue.js: The Best Books, in Order
This curriculum is designed for intermediate developers who already know JavaScript and basic web development, and want to deeply master Vue.js — from its core reactivity model and component system through the modern Composition API and into real-world application architecture. Each stage builds directly on the last: you'll first solidify Vue 3 fundamentals, then master the Composition API and ecosystem tools, and finally tackle advanced patterns and large-scale app design.
Vue 3 Core Foundations
IntermediateUnderstand Vue 3's reactivity system, component model, template syntax, props/events, and the Options API — building a solid mental model before diving into the Composition API.
▸ Study plan for this stage
Pace: 4–5 weeks, ~25–30 pages/day, with 2–3 days per week dedicated to hands-on exercises
- Vue 3's reactivity system: ref(), reactive(), and computed properties for automatic UI updates
- Component model: single-file components (.vue), lifecycle hooks, and component composition patterns
- Template syntax: directives (v-if, v-for, v-bind, v-on), interpolation, and conditional rendering
- Props and events: parent-child communication, prop validation, and custom event emission
- Options API structure: data, methods, computed, watch, and lifecycle hooks organization
- Watchers and side effects: tracking reactive changes and managing derived state
- Component registration: global vs. local components and scoping
- Template refs and direct DOM access: when and how to use $refs responsibly
- How does Vue 3's reactivity system work, and what is the difference between ref() and reactive()?
- What are the main lifecycle hooks in Vue 3, and when would you use each one (e.g., mounted, updated, unmounted)?
- How do you pass data from a parent component to a child component, and how do you validate props?
- How do you emit custom events from a child component to communicate back to a parent?
- What is the difference between computed properties and watchers, and when should you use each?
- How does the Options API organize component logic, and what are the key sections (data, methods, computed, watch)?
- Build a simple counter component using ref() and methods; add computed properties to display derived state (e.g., doubled value)
- Create a parent-child component pair: pass a list of items as props to a child, emit events when items are selected or deleted
- Implement a form component with v-model binding, validation, and watchers that respond to input changes
- Build a todo list app using v-for, v-if/v-else, and conditional CSS classes; practice adding, removing, and filtering todos
- Create a component that uses lifecycle hooks (mounted, updated, unmounted) to log state changes and manage side effects
- Refactor a component to use computed properties instead of methods for derived data; measure the performance difference
Next up: Mastering the Options API and Vue 3's core reactivity patterns in this stage provides the mental foundation needed to understand how the Composition API refactors and optimizes these same concepts for better code organization and reusability in larger applications.

A hands-on, project-driven introduction to Vue 3 that covers components, directives, and reactivity through real examples — ideal for intermediate learners who learn best by building.
Mastering the Composition API
IntermediateDeeply understand the Composition API — setup(), ref, reactive, computed, watchers, composables — and learn how to structure logic for reuse and maintainability.
▸ Study plan for this stage
Pace: 4–5 weeks, ~40–50 pages/day (split between both books; prioritize Garaguso first for patterns, then Macrae for practical application)
- setup() function as the entry point for Composition API logic and its relationship to component lifecycle
- ref() and reactive() for state management: when to use each, reactivity tracking, and unwrapping behavior
- computed properties for derived state: lazy evaluation, caching, and read/write computed properties
- Watchers (watch and watchEffect) for side effects: immediate execution, deep watching, and cleanup
- Composables as reusable logic units: extracting, naming conventions, and composing multiple composables together
- Lifecycle hooks in Composition API: onMounted, onUnmounted, and other hooks for managing component lifecycle
- Dependency injection with provide/inject for passing data through component trees without prop drilling
- Design patterns for organizing Composition API code: separation of concerns, testability, and maintainability best practices
- What is the setup() function and how does it serve as the foundation for Composition API components?
- When should you use ref() versus reactive(), and what are the key differences in how they handle reactivity?
- How do computed properties work in the Composition API, and what are the performance benefits of their caching mechanism?
- What is the difference between watch() and watchEffect(), and when would you use each?
- What is a composable, how do you create one, and what naming conventions should you follow?
- How can you use provide/inject to avoid prop drilling in deeply nested component hierarchies?
- Build a todo application using setup() with ref() for todos array and computed properties for filtering (completed, pending, all)
- Create a custom composable (e.g., useFetch, useLocalStorage, or useCounter) and use it in multiple components to demonstrate reusability
- Implement a form component using reactive() for form state, with watchers to validate fields and trigger side effects
- Refactor a class-based component (Options API) to use the Composition API, focusing on extracting logic into composables
- Build a real-time search feature using watchEffect() to fetch results as the user types, with proper cleanup and debouncing
- Create a parent-child component pair using provide/inject to pass deeply nested data without prop drilling
Next up: This stage equips you with the core tools and patterns for writing scalable, maintainable Vue.js applications; the next stage will build on this foundation by exploring state management solutions (Pinia), testing strategies, and performance optimization techniques for production-grade applications.

Focuses specifically on how to architect Vue 3 apps using the Composition API and composable patterns, making it the natural next step after grasping the basics.

A concise, authoritative O'Reilly title that sharpens understanding of Vue's reactivity internals and component communication patterns, reinforcing Composition API concepts with clarity.
Ecosystem & Reactive App Architecture
ExpertIntegrate Vue Router, Pinia for state management, and Vite into a cohesive application architecture — building fully reactive, navigable, production-ready front-end apps.
▸ Study plan for this stage
Pace: 4–5 weeks, ~25–30 pages/day, with 2–3 days per week dedicated to hands-on form-building projects
- Form binding and two-way data binding with v-model for reactive form state management
- Form validation patterns (client-side, custom validators, async validation) and error handling in Vue
- Integrating forms with Pinia stores for centralized form state and cross-component data flow
- Building reusable form components and composables to reduce duplication across reactive applications
- Handling form submission, file uploads, and complex multi-step forms in a reactive architecture
- Form state persistence and recovery strategies within a Vite + Vue Router + Pinia ecosystem
- Testing form logic and validation to ensure reliability in production-ready applications
- How does v-model work under the hood, and how can you create custom v-model bindings for complex form components?
- What are the differences between built-in HTML5 validation and custom Vue validation, and when should you use each?
- How do you structure form state in Pinia to make it shareable across multiple routes and components in a Vue Router application?
- What patterns can you use to build reusable, composable form components that work seamlessly in a reactive architecture?
- How do you handle async validation (e.g., checking username availability) without blocking the UI?
- What strategies can you implement to persist form state and recover it after navigation or page refresh?
- Build a multi-field contact form with v-model binding on text inputs, textareas, checkboxes, and select dropdowns; bind the entire form object to a Pinia store
- Create a custom validator composable that checks email format, password strength, and required fields; integrate it into a sign-up form with real-time error display
- Implement async validation that checks username availability via a mock API call; debounce the validation to avoid excessive requests
- Build a reusable FormInput component that accepts validation rules as props and emits both the value and validation state; use it across multiple forms
- Create a multi-step form (wizard) that persists each step's data in Pinia, allows navigation between steps with validation, and submits all data on completion
- Implement form state persistence to localStorage and recovery on page reload; test that form data survives navigation via Vue Router
Next up: Mastering form architecture and reactive state management through Pinia prepares you to scale these patterns into complex, multi-page applications with sophisticated data flows, setting the foundation for advanced routing strategies and performance optimization in production environments.

Tackles one of the most complex real-world UI challenges — reactive form handling and validation — using Vue 3 patterns, deepening your practical Composition API skills.
Discussion
Keep reading
Paths that share books, cover the same subject, or open a related topic.