Browse Source
fix(compiler-sfc): support resolving components from props (#8785)
pikax/keep_slots_information_on_functional_component
edison
2 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
29 additions and
0 deletions
-
packages/compiler-core/__tests__/transforms/transformElement.spec.ts
-
packages/compiler-core/src/transforms/transformElement.ts
|
|
@ -152,6 +152,28 @@ describe('compiler: element transform', () => { |
|
|
|
expect(node.tag).toBe(`Foo.Example`) |
|
|
|
}) |
|
|
|
|
|
|
|
test('resolve namespaced component from props bindings (inline)', () => { |
|
|
|
const { root, node } = parseWithElementTransform(`<Foo.Example/>`, { |
|
|
|
inline: true, |
|
|
|
bindingMetadata: { |
|
|
|
Foo: BindingTypes.PROPS |
|
|
|
} |
|
|
|
}) |
|
|
|
expect(root.helpers).not.toContain(RESOLVE_COMPONENT) |
|
|
|
expect(node.tag).toBe(`_unref(__props["Foo"]).Example`) |
|
|
|
}) |
|
|
|
|
|
|
|
test('resolve namespaced component from props bindings (non-inline)', () => { |
|
|
|
const { root, node } = parseWithElementTransform(`<Foo.Example/>`, { |
|
|
|
inline: false, |
|
|
|
bindingMetadata: { |
|
|
|
Foo: BindingTypes.PROPS |
|
|
|
} |
|
|
|
}) |
|
|
|
expect(root.helpers).not.toContain(RESOLVE_COMPONENT) |
|
|
|
expect(node.tag).toBe('_unref($props["Foo"]).Example') |
|
|
|
}) |
|
|
|
|
|
|
|
test('do not resolve component from non-script-setup bindings', () => { |
|
|
|
const bindingMetadata = { |
|
|
|
Example: BindingTypes.SETUP_MAYBE_REF |
|
|
|
|
|
@ -385,6 +385,13 @@ function resolveSetupReference(name: string, context: TransformContext) { |
|
|
|
`${context.helperString(UNREF)}(${fromMaybeRef})` |
|
|
|
: `$setup[${JSON.stringify(fromMaybeRef)}]` |
|
|
|
} |
|
|
|
|
|
|
|
const fromProps = checkType(BindingTypes.PROPS) |
|
|
|
if (fromProps) { |
|
|
|
return `${context.helperString(UNREF)}(${ |
|
|
|
context.inline ? '__props' : '$props' |
|
|
|
}[${JSON.stringify(fromProps)}])`
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
export type PropsExpression = ObjectExpression | CallExpression | ExpressionNode |
|
|
|