mirror of https://github.com/vuejs/core.git
fix(vdomInterop): handle forwarded vapor slots during render VDOM slot
This commit is contained in:
parent
c23d63582e
commit
dcf927ff8c
|
@ -210,7 +210,8 @@ export function hasAttrFromRawProps(rawProps: RawProps, key: string): boolean {
|
||||||
if (dynamicSources) {
|
if (dynamicSources) {
|
||||||
let i = dynamicSources.length
|
let i = dynamicSources.length
|
||||||
while (i--) {
|
while (i--) {
|
||||||
if (hasOwn(resolveSource(dynamicSources[i]), key)) {
|
const source = resolveSource(dynamicSources[i])
|
||||||
|
if (source && hasOwn(source, key)) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,14 @@ import {
|
||||||
mountComponent,
|
mountComponent,
|
||||||
unmountComponent,
|
unmountComponent,
|
||||||
} from './component'
|
} from './component'
|
||||||
import { type Block, VaporFragment, insert, remove } from './block'
|
import {
|
||||||
|
type Block,
|
||||||
|
VaporFragment,
|
||||||
|
insert,
|
||||||
|
isFragment,
|
||||||
|
isValidBlock,
|
||||||
|
remove,
|
||||||
|
} from './block'
|
||||||
import { EMPTY_OBJ, extend, isFunction } from '@vue/shared'
|
import { EMPTY_OBJ, extend, isFunction } from '@vue/shared'
|
||||||
import { type RawProps, rawPropsProxyHandlers } from './componentProps'
|
import { type RawProps, rawPropsProxyHandlers } from './componentProps'
|
||||||
import type { RawSlots, VaporSlot } from './componentSlots'
|
import type { RawSlots, VaporSlot } from './componentSlots'
|
||||||
|
@ -230,7 +237,24 @@ function renderVDOMSlot(
|
||||||
isFunction(name) ? name() : name,
|
isFunction(name) ? name() : name,
|
||||||
props,
|
props,
|
||||||
)
|
)
|
||||||
if ((vnode.children as any[]).length) {
|
let isValidSlotContent
|
||||||
|
let children = vnode.children as any[]
|
||||||
|
|
||||||
|
// TODO add tests
|
||||||
|
// handle forwarded vapor slot
|
||||||
|
let vaporSlot
|
||||||
|
if (children.length === 1 && (vaporSlot = children[0].vs)) {
|
||||||
|
const block = vaporSlot.slot(props)
|
||||||
|
isValidSlotContent =
|
||||||
|
isValidBlock(block) ||
|
||||||
|
// if block is a vapor fragment with insert, it indicates a forwarded VDOM slot
|
||||||
|
(isFragment(block) && block.insert)
|
||||||
|
}
|
||||||
|
// vnode children
|
||||||
|
else {
|
||||||
|
isValidSlotContent = children.length > 0
|
||||||
|
}
|
||||||
|
if (isValidSlotContent) {
|
||||||
if (fallbackNodes) {
|
if (fallbackNodes) {
|
||||||
remove(fallbackNodes, parentNode)
|
remove(fallbackNodes, parentNode)
|
||||||
fallbackNodes = undefined
|
fallbackNodes = undefined
|
||||||
|
|
Loading…
Reference in New Issue