--- name: Provide / Inject description: Pass data through component tree without prop drilling --- # Provide / Inject Provide data from ancestor components to any descendant, avoiding prop drilling. ## Basic Usage ```vue ``` ```vue ``` ## Typing with InjectionKey Use `InjectionKey` for type safety between provider and injector: ```ts // keys.ts import type { InjectionKey, Ref } from 'vue' export const messageKey = Symbol() as InjectionKey> export const countKey = Symbol() as InjectionKey ``` ```vue ``` ```vue ``` ## Default Values ```ts // Simple default const value = inject('message', 'default value') // Factory function (for expensive defaults) const value = inject('key', () => new ExpensiveClass(), true) // ^ treat as factory ``` ## App-Level Provide Available to all components: ```ts // main.ts import { createApp } from 'vue' const app = createApp(App) app.provide('globalConfig', { theme: 'dark' }) ``` ## Reactive Provide/Inject Provide reactive values for automatic updates: ```vue ``` The injected value maintains reactivity connection. ## Mutations Best Practice Keep mutations in the provider, expose update functions: ```vue ``` ```vue ``` ## Using Symbol Keys Recommended for libraries and large apps to avoid collisions: ```ts // keys.ts export const myKey = Symbol('myKey') // provider provide(myKey, value) // injector inject(myKey) ``` ## Type Helpers ```ts // String key with explicit type const foo = inject('foo') // ^? string | undefined // With default (removes undefined) const foo = inject('foo', 'default') // ^? string // Force non-undefined (use when certain it's provided) const foo = inject('foo') as string ```