}
}
- updateCssVars(parentComponent, n2)
+ updateCssVars(n2)
},
remove(
)
}
}
- updateCssVars(parentComponent, vnode)
+ updateCssVars(vnode)
}
return vnode.anchor && nextSibling(vnode.anchor as Node)
}
new (): { $props: VNodeProps & TeleportProps }
}
-function updateCssVars(
- parentComponent: ComponentInternalInstance | null,
- vnode: VNode
-) {
+function updateCssVars(vnode: VNode) {
// presence of .ut method indicates owner component uses css vars.
// code path here can assume browser environment.
- if (parentComponent && parentComponent.ut) {
+ const ctx = vnode.ctx
+ if (ctx && ctx.ut) {
let node = (vnode.children as VNode[])[0].el!
while (node !== vnode.targetAnchor) {
- if (node.nodeType === 1)
- node.setAttribute('data-v-owner', parentComponent.uid)
+ if (node.nodeType === 1) node.setAttribute('data-v-owner', ctx.uid)
node = node.nextSibling
}
- parentComponent.ut()
+ ctx.ut()
}
}
// application root node only
appContext: AppContext | null
+ /**
+ * @internal lexical scope owner instance
+ */
+ ctx: ComponentInternalInstance | null
+
/**
* @internal attached by v-memo
*/
patchFlag,
dynamicProps,
dynamicChildren: null,
- appContext: null
+ appContext: null,
+ ctx: currentRenderingInstance
} as VNode
if (needFullChildrenNormalization) {
ssContent: vnode.ssContent && cloneVNode(vnode.ssContent),
ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback),
el: vnode.el,
- anchor: vnode.anchor
+ anchor: vnode.anchor,
+ ctx: vnode.ctx
}
if (__COMPAT__) {
defineLegacyVNodeProperties(cloned as VNode)
}
})
+ test('with teleport in child slot', async () => {
+ document.body.innerHTML = ''
+ const state = reactive({ color: 'red' })
+ const root = document.createElement('div')
+ const target = document.body
+
+ const Child: FunctionalComponent = (_, { slots }) => {
+ return h('div', slots.default && slots.default())
+ }
+
+ const App = {
+ setup() {
+ useCssVars(() => state)
+ return () => h(Child, () => [h(Teleport, { to: target }, [h('div')])])
+ }
+ }
+
+ render(h(App), root)
+ await nextTick()
+ for (const c of [].slice.call(target.children as any)) {
+ expect((c as HTMLElement).style.getPropertyValue(`--color`)).toBe('red')
+ }
+ })
+
test('with teleport(change subTree)', async () => {
document.body.innerHTML = ''
const state = reactive({ color: 'red' })