diff --git a/example/components/multi-layer-slot-example.vue b/example/components/multi-layer-slot-example.vue new file mode 100644 index 0000000..a13f02d --- /dev/null +++ b/example/components/multi-layer-slot-example.vue @@ -0,0 +1,70 @@ + + + + diff --git a/example/components/multi-layer-slot/default-slot.vue b/example/components/multi-layer-slot/default-slot.vue new file mode 100644 index 0000000..751db7e --- /dev/null +++ b/example/components/multi-layer-slot/default-slot.vue @@ -0,0 +1,57 @@ + + + + diff --git a/example/components/multi-layer-slot/level-one.vue b/example/components/multi-layer-slot/level-one.vue new file mode 100644 index 0000000..b8797ab --- /dev/null +++ b/example/components/multi-layer-slot/level-one.vue @@ -0,0 +1,64 @@ + + + + diff --git a/example/components/multi-layer-slot/level-three.vue b/example/components/multi-layer-slot/level-three.vue new file mode 100644 index 0000000..e25a4be --- /dev/null +++ b/example/components/multi-layer-slot/level-three.vue @@ -0,0 +1,48 @@ + + + + diff --git a/example/components/multi-layer-slot/level-two.vue b/example/components/multi-layer-slot/level-two.vue new file mode 100644 index 0000000..8962538 --- /dev/null +++ b/example/components/multi-layer-slot/level-two.vue @@ -0,0 +1,48 @@ + + + + diff --git a/src/core/renderHelper.js b/src/core/renderHelper.js index 5c9520c..76f6b7c 100644 --- a/src/core/renderHelper.js +++ b/src/core/renderHelper.js @@ -1,12 +1,26 @@ -import { ComponentStructure } from "./componentStructure"; -import { isHtmlTag, isTransition } from "../util/tags"; import { resolveComponent, TransitionGroup } from "vue"; +import { isHtmlTag, isTransition } from "../util/tags"; +import { ComponentStructure } from "./componentStructure"; function getSlot(slots, key) { const slotValue = slots[key]; return slotValue ? slotValue() : []; } +function getRealNode(rawNode) { + let node = rawNode; + let failed = false; + while (!failed && node && !node.el) { + const children = node.children; + if (children && typeof children !== "string" && children.length === 1) { + node = children[0]; + } else { + failed = true; + } + } + return node; +} + function computeNodes({ $slots, realList, getKey }) { const normalizedList = realList || []; const [header, footer] = ["header", "footer"].map(name => @@ -17,9 +31,12 @@ function computeNodes({ $slots, realList, getKey }) { throw new Error("draggable element must have an item slot"); } const defaultNodes = normalizedList.flatMap((element, index) => - item({ element, index }).map(node => { - node.key = getKey(element); - node.props = { ...(node.props || {}), "data-draggable": true }; + item({ element, index }).map(rawNode => { + const node = getRealNode(rawNode); + if (node) { + node.key = getKey(element); + node.props = { ...(node.props || {}), "data-draggable": true }; + } return node; }) );