diff --git a/packages/contributors.json b/packages/contributors.json index 238831518ee..89847bc52ea 100644 --- a/packages/contributors.json +++ b/packages/contributors.json @@ -166,6 +166,7 @@ "phaust", "marktnoonan", "dm4t2", + "melishev", "mauriciabad", "mxmvshnvsk", "AldeonMoriak", @@ -185,6 +186,7 @@ "a1xon", "octref", "praburangki", + "preeteshjain", "QiroNT", "ramonakira", "Redemption198", @@ -221,12 +223,14 @@ "iGalaxyz", "winter-ice", "monkeywithacupcake", - "katsuyaU", + "kagurazaka-0", "koheing", + "kongmoumou", "laozei6401", "leovoon", "likeswinds", "lxhyl", + "lxnelyclxud", "lzdFeiFei", "meteorlxy", "odex21", diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 0d09adc7198..913b24f2e69 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -21,6 +21,8 @@ export * from './refDebounced' export * from './refDefault' export * from './refThrottled' export * from './refWithControl' +export * from './resolveRef' +export * from './resolveUnref' export * from './set' export * from './syncRef' export * from './syncRefs' diff --git a/packages/shared/resolveRef/index.md b/packages/shared/resolveRef/index.md new file mode 100644 index 00000000000..070581eaced --- /dev/null +++ b/packages/shared/resolveRef/index.md @@ -0,0 +1,20 @@ +--- +category: Utilities +related: resolveUnref +--- + +# resolveRef + +Normalize value/ref/getter to `ref` or `computed`. + +## Usage + +```ts +import { resolveRef } from '@vueuse/core' + +const foo = ref('hi') + +const a = resolveRef(0) // Ref +const b = resolveRef(foo) // Ref +const c = resolveRef(() => 'hi') // ComputedRef +``` diff --git a/packages/shared/resolveRef/index.ts b/packages/shared/resolveRef/index.ts new file mode 100644 index 00000000000..6490150a433 --- /dev/null +++ b/packages/shared/resolveRef/index.ts @@ -0,0 +1,15 @@ +import type { ComputedRef, Ref } from 'vue-demi' +import { computed, ref } from 'vue-demi' +import type { MaybeComputedRef, MaybeRef } from '../utils' + +/** + * Normalize value/ref/getter to `ref` or `computed`. + */ +export function resolveRef(r: MaybeComputedRef): ComputedRef +export function resolveRef(r: MaybeRef): Ref +export function resolveRef(r: MaybeComputedRef) { + return typeof r === 'function' + ? computed(r as any) + : ref(r) +} + diff --git a/packages/shared/resolveUnref/index.md b/packages/shared/resolveUnref/index.md new file mode 100644 index 00000000000..2c83564d9d9 --- /dev/null +++ b/packages/shared/resolveUnref/index.md @@ -0,0 +1,20 @@ +--- +category: Utilities +related: resolveRef +--- + +# resolveUnref + +Get the value of value/ref/getter. + +## Usage + +```ts +import { resolveUnref } from '@vueuse/core' + +const foo = ref('hi') + +const a = resolveUnref(0) // 0 +const b = resolveUnref(foo) // 'hi' +const c = resolveUnref(() => 'hi') // 'hi' +``` diff --git a/packages/shared/resolveUnref/index.ts b/packages/shared/resolveUnref/index.ts new file mode 100644 index 00000000000..2009965d554 --- /dev/null +++ b/packages/shared/resolveUnref/index.ts @@ -0,0 +1,11 @@ +import { unref } from 'vue-demi' +import type { MaybeComputedRef } from '../utils' + +/** + * Normalize value/ref/getter to `ref` or `computed`. + */ +export function resolveUnref(r: MaybeComputedRef): T { + return typeof r === 'function' + ? (r as any)() + : unref(r) +} diff --git a/packages/shared/utils/types.ts b/packages/shared/utils/types.ts index 06a6707ab67..fd91e815329 100644 --- a/packages/shared/utils/types.ts +++ b/packages/shared/utils/types.ts @@ -5,15 +5,6 @@ import type { Ref, WatchOptions, WatchSource } from 'vue-demi' */ export type Fn = () => void -/** - * Maybe it's a ref, or not. - * - * ```ts - * type MaybeRef = T | Ref - * ``` - */ -export type MaybeRef = T | Ref - /** * A ref that allow to set null or undefined */ @@ -27,6 +18,26 @@ export type RemovableRef = Omit, 'value'> & { */ export type RemoveableRef = RemovableRef +/** + * Maybe it's a ref, or a plain value + * + * ```ts + * type MaybeRef = T | Ref + * ``` + */ +export type MaybeRef = T | Ref + +/** + * Maybe it's a ref, or a getter function + * + * ```ts + * type MaybeRef = T | Ref + * ``` + */ +export type MaybeComputedRef = T extends Function + ? never + : (() => T) | MaybeRef + /** * Make all the nested attributes of an object or array to MaybeRef *