--- category: State --- # createInjectionState Create global state that can be injected into components. ## Usage ```ts twoslash include useCounterStore // useCounterStore.ts import { createInjectionState } from '@vueuse/core'; import { computed, shallowRef } from 'vue'; const [useProvideCounterStore, useCounterStore] = createInjectionState((initialValue: number) => { // state const count = shallowRef(initialValue); // getters const double = computed(() => count.value * 2); // actions function increment() { count.value++; } return { count, double, increment }; }); export { useProvideCounterStore }; // If you want to hide `useCounterStore` and wrap it in default value logic or throw error logic, please don't export `useCounterStore` export { useCounterStore }; export function useCounterStoreWithDefaultValue() { return ( useCounterStore() ?? { count: shallowRef(0), double: shallowRef(0), increment: () => {}, } ); } export function useCounterStoreOrThrow() { const counterStore = useCounterStore(); if (counterStore == null) throw new Error('Please call `useProvideCounterStore` on the appropriate parent component'); return counterStore; } ``` ```vue ``` ```vue ``` ```vue ``` ## Provide a custom InjectionKey ```ts // useCounterStore.ts import { createInjectionState } from '@vueuse/core'; import { computed, shallowRef } from 'vue'; // custom injectionKey const CounterStoreKey = 'counter-store'; const [useProvideCounterStore, useCounterStore] = createInjectionState( (initialValue: number) => { // state const count = shallowRef(initialValue); // getters const double = computed(() => count.value * 2); // actions function increment() { count.value++; } return { count, double, increment }; }, { injectionKey: CounterStoreKey }, ); ``` ## Provide a custom default value ```ts // useCounterStore.ts import { createInjectionState } from '@vueuse/core'; import { computed, shallowRef } from 'vue'; const [useProvideCounterStore, useCounterStore] = createInjectionState( (initialValue: number) => { // state const count = shallowRef(initialValue); // getters const double = computed(() => count.value * 2); // actions function increment() { count.value++; } return { count, double, increment }; }, { defaultValue: 0 }, ); ``` ## Type Declarations ```ts export type CreateInjectionStateReturn, Return> = Readonly< [ /** * Call this function in a provider component to create and provide the state. * * @param args Arguments passed to the composable * @returns The state returned by the composable */ useProvidingState: (...args: Arguments) => Return, /** * Call this function in a consumer component to inject the state. * * @returns The injected state, or `undefined` if not provided and no default value was set. */ useInjectedState: () => Return | undefined, ] >; export interface CreateInjectionStateOptions { /** * Custom injectionKey for InjectionState */ injectionKey?: string | InjectionKey; /** * Default value for the InjectionState */ defaultValue?: Return; } /** * Create global state that can be injected into components. * * @see https://vueuse.org/createInjectionState * * @__NO_SIDE_EFFECTS__ */ export declare function createInjectionState, Return>( composable: (...args: Arguments) => Return, options?: CreateInjectionStateOptions, ): CreateInjectionStateReturn; ```