createInjectionState
createInjectionState
コンポーネントに注入できるグローバルな状態を作成します。
使用法
// 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 }
// `useCounterStore`を隠してデフォルト値のロジックやエラーロジックでラップしたい場合は、`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('適切な親コンポーネントで`useProvideCounterStore`を呼び出してください')
return counterStore
}
{/* RootComponent.vue */}
<script setup lang="ts">
// @filename: useCounterStore.ts
// @include: useCounterStore
// ---cut---
import { useProvideCounterStore } from './useCounterStore'
useProvideCounterStore(0)
</script>
<template>
<div>
<slot />
</div>
</template>
{/* CountComponent.vue */}
<script setup lang="ts">
// @filename: useCounterStore.ts
// @include: useCounterStore
// ---cut---
import { useCounterStore } from './useCounterStore'
// ストアが提供されていない場合を無視するために非nullアサーション演算子を使用します。
const { count, double } = useCounterStore()!
// ストアを提供せずにコンポーネントを動作させたい場合は、以下のコードを使用できます:
// const { count, double } = useCounterStore() ?? { count: shallowRef(0), double: shallowRef(0) }
// または、別のフックを使用してデフォルト値を提供することもできます
// const { count, double } = useCounterStoreWithDefaultValue()
// またはエラーをスローする
// const { count, double } = useCounterStoreOrThrow()
</script>
<template>
<ul>
<li>
count: {{ count }}
</li>
<li>
double: {{ double }}
</li>
</ul>
</template>
{/* ButtonComponent.vue */}
<script setup lang="ts">
// @filename: useCounterStore.ts
// @include: useCounterStore
// ---cut---
import { useCounterStore } from './useCounterStore'
// ストアが提供されていない場合を無視するために非nullアサーション演算子を使用します。
const { increment } = useCounterStore()!
</script>
<template>
<button @click="increment">
+
</button>
</template>
カスタムの InjectionKey を提供する
// useCounterStore.ts
import { createInjectionState } from '@vueuse/core'
import { computed, shallowRef } from 'vue'
// カスタムの 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 })
カスタムのデフォルト値を提供する
// 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 })
© 2019–PRESENT Anthony Fu https://github.com/antfu
※このページは Nuxt.js 公式ドキュメントの翻訳ページです。
公式ドキュメントの該当ページはこちら:
#