diff --git a/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts b/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts index e26b9dfb45e..9f860a5e3c3 100644 --- a/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts +++ b/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts @@ -118,6 +118,63 @@ describe('useCssVars', () => { } }) + test('with v-if & async component & suspense', async () => { + const state = reactive({ color: 'red' }) + const root = document.createElement('div') + const show = ref(false) + let resolveAsync: any + let asyncPromise: any + + const AsyncComp = { + setup() { + useCssVars(() => state) + asyncPromise = new Promise(r => { + resolveAsync = () => { + r(() => h('p', 'default')) + } + }) + return asyncPromise + }, + } + + const App = { + setup() { + return () => + h(Suspense, null, { + default: h('div', {}, show.value ? h(AsyncComp) : h('p')), + }) + }, + } + + render(h(App), root) + await nextTick() + // AsyncComp resolve + show.value = true + await nextTick() + resolveAsync() + await asyncPromise.then(() => {}) + // Suspense effects flush + await nextTick() + // css vars use with default tree + for (const c of [].slice.call(root.children as any)) { + expect( + ((c as any).children[0] as HTMLElement).style.getPropertyValue( + `--color`, + ), + ).toBe(`red`) + } + + state.color = 'green' + await nextTick() + for (const c of [].slice.call(root.children as any)) { + expect( + ((c as any).children[0] as HTMLElement).style.getPropertyValue( + `--color`, + ), + ).toBe('green') + } + }) + test('with subTree changed', async () => { const state = reactive({ color: 'red' }) const value = ref(true) diff --git a/packages/runtime-dom/src/helpers/useCssVars.ts b/packages/runtime-dom/src/helpers/useCssVars.ts index 72714e6f623..3da9dcd1972 100644 --- a/packages/runtime-dom/src/helpers/useCssVars.ts +++ b/packages/runtime-dom/src/helpers/useCssVars.ts @@ -38,9 +38,8 @@ export function useCssVars(getter: (ctx: any) => Record) { updateTeleports(vars) } - watchPostEffect(setVars) - onMounted(() => { + watchPostEffect(setVars) const ob = new MutationObserver(setVars) ob.observe(instance.subTree.el!.parentNode, { childList: true }) onUnmounted(() => ob.disconnect())