Nuxt/packages/nuxt/src/app/composables/state.ts

25 lines
836 B
TypeScript
Raw Normal View History

import { isRef, toRef } from 'vue'
2021-10-11 17:48:03 +00:00
import type { Ref } from 'vue'
import { useNuxtApp } from '#app'
/**
* Create a global reactive ref that will be hydrated but not shared across ssr requests
*
* @param key a unique key ensuring that data fetching can be properly de-duplicated across requests
* @param init a function that provides initial value for the state when it's not initiated
2021-10-11 17:48:03 +00:00
*/
export const useState = <T> (key: string, init?: (() => T | Ref<T>)): Ref<T> => {
2021-10-11 17:48:03 +00:00
const nuxt = useNuxtApp()
const state = toRef(nuxt.payload.state, key)
if (state.value === undefined && init) {
const initialValue = init()
if (isRef(initialValue)) {
// vue will unwrap the ref for us
nuxt.payload.state[key] = initialValue
return initialValue as Ref<T>
}
state.value = initialValue
}
return state
2021-10-11 17:48:03 +00:00
}