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) {
|
||||
let i = dynamicSources.length
|
||||
while (i--) {
|
||||
if (hasOwn(resolveSource(dynamicSources[i]), key)) {
|
||||
const source = resolveSource(dynamicSources[i])
|
||||
if (source && hasOwn(source, key)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,7 +26,14 @@ import {
|
|||
mountComponent,
|
||||
unmountComponent,
|
||||
} 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 { type RawProps, rawPropsProxyHandlers } from './componentProps'
|
||||
import type { RawSlots, VaporSlot } from './componentSlots'
|
||||
|
@ -230,7 +237,24 @@ function renderVDOMSlot(
|
|||
isFunction(name) ? name() : name,
|
||||
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) {
|
||||
remove(fallbackNodes, parentNode)
|
||||
fallbackNodes = undefined
|
||||
|
|
Loading…
Reference in New Issue