diff --git a/packages/core/useTransition/index.test.ts b/packages/core/useTransition/index.test.ts index cc3e2c2c531..e583afb08c4 100644 --- a/packages/core/useTransition/index.test.ts +++ b/packages/core/useTransition/index.test.ts @@ -93,6 +93,25 @@ describe('useTransition', () => { expect(transition.value[1]).toBe(1) }) + it('transitions between refs', async () => { + const source1 = ref(0) + const source2 = ref(0) + const transition = useTransition([source1, source2], { duration: 100 }) + + expect(transition.value).toEqual([0, 0]) + + source1.value = 1 + source2.value = 1 + + await promiseTimeout(50) + expectBetween(transition.value[0], 0, 1) + expectBetween(transition.value[1], 0, 1) + + await promiseTimeout(100) + expect(transition.value[0]).toBe(1) + expect(transition.value[1]).toBe(1) + }) + it('supports cubic bezier curves', async () => { const source = ref(0) diff --git a/packages/core/useTransition/index.ts b/packages/core/useTransition/index.ts index 3e4ad79b80a..000c2b9400c 100644 --- a/packages/core/useTransition/index.ts +++ b/packages/core/useTransition/index.ts @@ -1,7 +1,7 @@ import { computed, ref, unref, watch } from 'vue-demi' -import { isFunction, isNumber, identity as linear, promiseTimeout, tryOnScopeDispose } from '@vueuse/shared' +import { isFunction, isNumber, identity as linear, promiseTimeout, resolveUnref, tryOnScopeDispose } from '@vueuse/shared' import type { ComputedRef, Ref } from 'vue-demi' -import type { MaybeRef } from '@vueuse/shared' +import type { MaybeComputedRef, MaybeRef } from '@vueuse/shared' /** * Cubic bezier points @@ -182,13 +182,13 @@ export function executeTransition( } // option 1: reactive number -export function useTransition(source: Ref, options?: UseTransitionOptions): ComputedRef +export function useTransition(source: MaybeComputedRef, options?: UseTransitionOptions): ComputedRef // option 2: static array of possibly reactive numbers -export function useTransition[]>(source: [...T], options?: UseTransitionOptions): ComputedRef<{ [K in keyof T]: number }> +export function useTransition[]>(source: [...T], options?: UseTransitionOptions): ComputedRef<{ [K in keyof T]: number }> // option 3: reactive array of numbers -export function useTransition>(source: T, options?: UseTransitionOptions): ComputedRef +export function useTransition>(source: T, options?: UseTransitionOptions): ComputedRef /** * Follow value with a transition. @@ -198,20 +198,20 @@ export function useTransition>(source: T, options?: UseT * @param options */ export function useTransition( - source: Ref | MaybeRef[], + source: MaybeComputedRef | MaybeComputedRef[], options: UseTransitionOptions = {}, ): Ref { let currentId = 0 const sourceVal = () => { - const v = unref[]>(source) + const v = resolveUnref(source) - return isNumber(v) ? v : v.map(unref) + return isNumber(v) ? v : v.map(resolveUnref) } const outputRef = ref(sourceVal()) - watch(source, async (to) => { + watch(sourceVal, async (to) => { if (unref(options.disabled)) return @@ -223,7 +223,7 @@ export function useTransition( if (id !== currentId) return - const toVal = Array.isArray(to) ? to.map(unref) : unref(to) + const toVal = Array.isArray(to) ? to.map(resolveUnref) : resolveUnref(to) options.onStarted?.()