Files
Liam DeBeasi 07941a59ba fix(vue): components have correct name in Vue Dev Tools (#27180)
<!-- Please refer to our contributing documentation for any questions on
submitting a pull request, or let us know here if you need any help:
https://ionicframework.com/docs/building/contributing -->

<!-- Some docs updates need to be made in the `ionic-docs` repo, in a
separate PR. See
https://github.com/ionic-team/ionic-framework/blob/main/.github/CONTRIBUTING.md#modifying-documentation
for details. -->

<!-- Please do not submit updates to dependencies unless it fixes an
issue. -->

<!-- Please try to limit your pull request to one type (bugfix, feature,
etc). Submit multiple pull requests if needed. -->

## What is the current behavior?
<!-- Please describe the current behavior that you are modifying. -->


<!-- Issues are required for both bug fixes and features. -->
Issue URL: resolves #25199

Vue components show up as "Anonymous Component" in Vue Dev Tools. This
is caused by our use of `displayName` instead of `name`. This required a
fix in the Vue Output Target package. See
https://github.com/ionic-team/stencil-ds-output-targets/pull/257 for
more info.

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Updates the Vue Output Target dependency
- Functional components created manually in Ionic Vue now set `name`
instead of `displayName`. Note: Non-functional components were never
impacted by this bug.

## Does this introduce a breaking change?

- [ ] Yes
- [x] No

<!-- If this introduces a breaking change, please describe the impact
and migration path for existing applications below. -->


## Other information

<!-- Any other information that is important to this PR such as
screenshots of how the component looks before and after the change. -->


Dev build: `7.0.2-dev.11681308435.141a05de`
2023-04-12 16:50:21 +00:00

40 lines
1.1 KiB
TypeScript

import { defineCustomElement } from "@ionic/core/components/ion-app.js";
import type { VNode } from "vue";
import { h, defineComponent, shallowRef } from "vue";
const userComponents = shallowRef([]);
export const IonApp = /*@__PURE__*/ defineComponent((_, { attrs, slots }) => {
defineCustomElement();
return () => {
return h(
"ion-app",
{
...attrs,
},
[slots.default && slots.default(), ...userComponents.value]
);
};
});
IonApp.name = "IonApp";
/**
* When rendering user components inside of
* ion-modal, or ion-popover the component
* needs to be created inside of the current application
* context otherwise libraries such as vue-i18n or vuex
* will not work properly.
*
* `userComponents` renders teleported components as children
* of `ion-app` within the current application context.
*/
export const addTeleportedUserComponent = (component: VNode) => {
userComponents.value = [...userComponents.value, component];
};
export const removeTeleportedUserComponent = (component: VNode) => {
userComponents.value = userComponents.value.filter(
(cmp) => cmp !== component
);
};