h,
reactive,
nextTick,
- ComponentOptions
+ ComponentOptions,
+ Suspense
} from '@vue/runtime-dom'
describe('useCssVars', () => {
}))
})
+ test('on suspense root', async () => {
+ const state = reactive({ color: 'red' })
+ const root = document.createElement('div')
+
+ const AsyncComp = {
+ async setup() {
+ return () => h('p', 'default')
+ }
+ }
+
+ const App = {
+ setup() {
+ useCssVars(() => state)
+ return () =>
+ h(Suspense, null, {
+ default: h(AsyncComp),
+ fallback: h('div', 'fallback')
+ })
+ }
+ }
+
+ 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`)
+ }
+ // AsyncComp resolve
+ await nextTick()
+ // Suspense effects flush
+ await nextTick()
+ // css vars use with default tree
+ for (const c of [].slice.call(root.children as any)) {
+ expect((c 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 HTMLElement).style.getPropertyValue(`--color`)).toBe('green')
+ }
+ })
+
test('with <style scoped>', async () => {
const id = 'data-v-12345'
vars: Record<string, string>,
prefix: string
) {
+ if (__FEATURE_SUSPENSE__ && vnode.shapeFlag & ShapeFlags.SUSPENSE) {
+ const { isResolved, isHydrating, fallbackTree, subTree } = vnode.suspense!
+ if (isResolved || isHydrating) {
+ vnode = subTree
+ } else {
+ vnode.suspense!.effects.push(() => {
+ setVarsOnVNode(subTree, vars, prefix)
+ })
+ vnode = fallbackTree
+ }
+ }
+
// drill down HOCs until it's a non-component vnode
while (vnode.component) {
vnode = vnode.component.subTree
}
+
if (vnode.shapeFlag & ShapeFlags.ELEMENT && vnode.el) {
const style = vnode.el.style
for (const key in vars) {