mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-08-21 13:01:01 +08:00

<!-- 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`
40 lines
1.1 KiB
TypeScript
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
|
|
);
|
|
};
|