Skip to content

Commit 2ca34e6

Browse files
committed
wip: process custom element as component
the template helper cannot resolve them properly they require creation via createElement
1 parent e770960 commit 2ca34e6

File tree

6 files changed

+407
-374
lines changed

6 files changed

+407
-374
lines changed

packages/compiler-vapor/src/generators/component.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,11 @@ export function genCreateComponent(
7373
...genCall(
7474
operation.dynamic && !operation.dynamic.isStatic
7575
? helper('createDynamicComponent')
76-
: operation.asset
76+
: operation.isCustomElement
7777
? helper('createComponentWithFallback')
78-
: helper('createComponent'),
78+
: operation.asset
79+
? helper('createComponentWithFallback')
80+
: helper('createComponent'),
7981
tag,
8082
rawProps,
8183
rawSlots,
@@ -86,7 +88,9 @@ export function genCreateComponent(
8688
]
8789

8890
function genTag() {
89-
if (operation.dynamic) {
91+
if (operation.isCustomElement) {
92+
return JSON.stringify(operation.tag)
93+
} else if (operation.dynamic) {
9094
if (operation.dynamic.isStatic) {
9195
return genCall(
9296
helper('resolveDynamicComponent'),

packages/compiler-vapor/src/ir/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ export interface CreateComponentIRNode extends BaseIRNode {
202202
root: boolean
203203
once: boolean
204204
dynamic?: SimpleExpressionNode
205+
isCustomElement: boolean
205206
parent?: number
206207
anchor?: number
207208
append?: boolean

packages/compiler-vapor/src/transforms/transformElement.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,12 @@ export const transformElement: NodeTransform = (node, context) => {
5757
)
5858
return
5959

60-
const isComponent = node.tagType === ElementTypes.COMPONENT
60+
// treat custom elements as components because the template helper cannot
61+
// resolve them properly; they require creation via createElement
62+
const isCustomElement = !!context.options.isCustomElement(node.tag)
63+
const isComponent =
64+
node.tagType === ElementTypes.COMPONENT || isCustomElement
65+
6166
const isDynamicComponent = isComponentTag(node.tag)
6267
const propsResult = buildProps(
6368
node,
@@ -88,6 +93,7 @@ export const transformElement: NodeTransform = (node, context) => {
8893
singleRoot,
8994
context,
9095
isDynamicComponent,
96+
isCustomElement,
9197
)
9298
} else {
9399
transformNativeElement(
@@ -107,6 +113,7 @@ function transformComponentElement(
107113
singleRoot: boolean,
108114
context: TransformContext,
109115
isDynamicComponent: boolean,
116+
isCustomElement: boolean,
110117
) {
111118
const dynamicComponent = isDynamicComponent
112119
? resolveDynamicComponent(node)
@@ -115,7 +122,7 @@ function transformComponentElement(
115122
let { tag } = node
116123
let asset = true
117124

118-
if (!dynamicComponent) {
125+
if (!dynamicComponent && !isCustomElement) {
119126
const fromSetup = resolveSetupReference(tag, context)
120127
if (fromSetup) {
121128
tag = fromSetup
@@ -160,6 +167,7 @@ function transformComponentElement(
160167
slots: [...context.slots],
161168
once: context.inVOnce,
162169
dynamic: dynamicComponent,
170+
isCustomElement,
163171
}
164172
context.slots = []
165173
}

packages/runtime-dom/src/apiCustomElement.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ export abstract class VueElementBase<
533533
* @internal
534534
*/
535535
protected _getProp(key: string): any {
536-
return this._props[key]
536+
return this._isVapor ? this._props[key]() : this._props[key]
537537
}
538538

539539
/**

0 commit comments

Comments
 (0)