Skip to content

Commit 419dcc4

Browse files
committed
fix(compiler-core): update code and test
1 parent b8e882d commit 419dcc4

File tree

2 files changed

+82
-9
lines changed

2 files changed

+82
-9
lines changed

packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts

Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ import {
1616
createElementBlock,
1717
createCommentVNode,
1818
createVNode,
19-
Transition
19+
Transition,
20+
createBlock
2021
} from '@vue/runtime-dom'
2122

2223
describe('useCssVars', () => {
@@ -309,8 +310,7 @@ describe('useCssVars', () => {
309310
createElementBlock(
310311
'div',
311312
{
312-
key: 0,
313-
class: 'text'
313+
key: 0
314314
},
315315
' test '
316316
))
@@ -360,8 +360,7 @@ describe('useCssVars', () => {
360360
createElementBlock(
361361
'div',
362362
{
363-
key: 0,
364-
class: 'text'
363+
key: 0
365364
},
366365
'test'
367366
))
@@ -390,4 +389,70 @@ describe('useCssVars', () => {
390389
expect((c as HTMLElement).style.getPropertyValue(`--color`)).toBe('red')
391390
}
392391
})
392+
393+
test('with teleport(transition & v-if element)', async () => {
394+
document.body.innerHTML = ''
395+
const state = reactive({ color: 'red' })
396+
const root = document.createElement('div')
397+
const target = document.body
398+
const toggle = ref(true)
399+
400+
const App = {
401+
setup() {
402+
useCssVars(() => state)
403+
return () => [
404+
(openBlock(),
405+
createBlock(Teleport, { to: target }, [
406+
createVNode(
407+
Transition,
408+
{},
409+
{
410+
default: withCtx(() => [
411+
toggle.value
412+
? (openBlock(),
413+
createElementBlock(
414+
'div',
415+
{
416+
key: 0
417+
},
418+
'test'
419+
))
420+
: createCommentVNode('v-if', true)
421+
]),
422+
_: 1 /* STABLE */
423+
}
424+
)
425+
])),
426+
(openBlock(),
427+
createBlock(Teleport, { to: target }, [
428+
toggle.value
429+
? (openBlock(),
430+
createElementBlock(
431+
'div',
432+
{
433+
key: 0
434+
},
435+
'element'
436+
))
437+
: createCommentVNode('v-if', true)
438+
]))
439+
]
440+
}
441+
}
442+
443+
render(h(App), root)
444+
await nextTick()
445+
expect(target.children.length).toBe(2)
446+
for (const c of [].slice.call(target.children as any)) {
447+
expect((c as HTMLElement).style.getPropertyValue(`--color`)).toBe('red')
448+
}
449+
toggle.value = false
450+
await nextTick()
451+
toggle.value = true
452+
await nextTick()
453+
expect(target.children.length).toBe(2)
454+
for (const c of [].slice.call(target.children as any)) {
455+
expect((c as HTMLElement).style.getPropertyValue(`--color`)).toBe('red')
456+
}
457+
})
393458
})

packages/runtime-dom/src/helpers/useCssVars.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
onUnmounted,
1010
resolveTarget,
1111
TeleportProps,
12-
updateCssVars
12+
updateCssVars,
13+
onUpdated
1314
} from '@vue/runtime-core'
1415
import { ShapeFlags, isArray } from '@vue/shared'
1516
import { nodeOps } from '../nodeOps'
@@ -46,21 +47,28 @@ export function useCssVars(getter: (ctx: any) => Record<string, string>) {
4647

4748
onMounted(() => {
4849
const obs = [onSubTreeChange(instance.subTree.el!.parentNode, setVars)]
49-
const observeTeleportTarget = (vnode: VNode) => {
50+
const observeTeleportTarget = (vnode: VNode, init = true) => {
5051
if (vnode.shapeFlag & ShapeFlags.TELEPORT) {
5152
const target = resolveTarget(
5253
vnode.props as TeleportProps,
5354
nodeOps.querySelector
5455
) as Node
5556
if (target) {
56-
obs.push(onSubTreeChange(target, () => updateCssVars(vnode)))
57+
if (init) {
58+
obs.push(onSubTreeChange(target, () => updateCssVars(vnode)))
59+
} else {
60+
updateCssVars(vnode)
61+
}
5762
}
5863
}
5964
if (isArray(vnode.children)) {
60-
vnode.children.forEach(n => observeTeleportTarget(n as VNode))
65+
vnode.children.forEach(n => observeTeleportTarget(n as VNode, init))
6166
}
6267
}
6368
observeTeleportTarget(instance.subTree)
69+
onUpdated(() => {
70+
observeTeleportTarget(instance.subTree, false)
71+
})
6472
onUnmounted(() => obs.forEach(ob => ob.disconnect()))
6573
})
6674
}

0 commit comments

Comments
 (0)