diff --git a/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts b/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts index 293dc704993..0766bda806d 100644 --- a/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts +++ b/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts @@ -1,4 +1,5 @@ import { + ref, render, useCssVars, h, @@ -125,4 +126,29 @@ describe('useCssVars', () => { id ) }) + + test('with subTree changed', async () => { + const state = reactive({ color: 'red' }) + const value = ref(true) + const root = document.createElement('div') + + const App = { + setup() { + useCssVars(() => state) + return () => (value.value ? [h('div')] : [h('div'), h('div')]) + } + } + + render(h(App), root) + // css vars use with fallback tree + for (const c of [].slice.call(root.children as any)) { + expect((c as HTMLElement).style.getPropertyValue(`--color`)).toBe(`red`) + } + + value.value = false + await nextTick() + for (const c of [].slice.call(root.children as any)) { + expect((c as HTMLElement).style.getPropertyValue(`--color`)).toBe('red') + } + }) }) diff --git a/packages/runtime-dom/src/helpers/useCssVars.ts b/packages/runtime-dom/src/helpers/useCssVars.ts index 86d571c2c35..ff90ec8ce64 100644 --- a/packages/runtime-dom/src/helpers/useCssVars.ts +++ b/packages/runtime-dom/src/helpers/useCssVars.ts @@ -2,11 +2,12 @@ import { ComponentPublicInstance, getCurrentInstance, onMounted, - watchEffect, warn, VNode, Fragment, - unref + unref, + onUpdated, + watchEffect } from '@vue/runtime-core' import { ShapeFlags } from '@vue/shared' @@ -27,11 +28,10 @@ export function useCssVars( ? `${instance.type.__scopeId.replace(/^data-v-/, '')}-` : `` - onMounted(() => { - watchEffect(() => { - setVarsOnVNode(instance.subTree, getter(instance.proxy!), prefix) - }) - }) + const setVars = () => + setVarsOnVNode(instance.subTree, getter(instance.proxy!), prefix) + onMounted(() => watchEffect(setVars)) + onUpdated(setVars) } function setVarsOnVNode(