---
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
-
count: {{ count }}
-
double: {{ double }}
```
```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<
Arguments extends Array,
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<
Arguments extends Array,
Return,
>(
composable: (...args: Arguments) => Return,
options?: CreateInjectionStateOptions,
): CreateInjectionStateReturn
```