diff --git a/packages/vue/src/components/IonPage.ts b/packages/vue/src/components/IonPage.ts index 107fbafcd8..789e1516bd 100644 --- a/packages/vue/src/components/IonPage.ts +++ b/packages/vue/src/components/IonPage.ts @@ -12,11 +12,12 @@ export const IonPage = /*@__PURE__*/ defineComponent({ setup(props, { attrs, slots }) { const hidePageClass = (props.isInOutlet) ? 'ion-page-invisible' : ''; return () => { + const existingClasses = attrs.class ?? ''; return h( 'div', { - ['class']: `ion-page ${hidePageClass}`, ...attrs, + ['class']: `ion-page ${hidePageClass} ${existingClasses}`, ref: 'ionPage' }, slots.default && slots.default() diff --git a/packages/vue/test-app/tests/unit/page.spec.ts b/packages/vue/test-app/tests/unit/page.spec.ts new file mode 100644 index 0000000000..61f0bea41e --- /dev/null +++ b/packages/vue/test-app/tests/unit/page.spec.ts @@ -0,0 +1,63 @@ +import { mount } from '@vue/test-utils'; +import { createRouter, createWebHistory } from '@ionic/vue-router'; +import { IonicVue, IonApp, IonRouterOutlet, IonPage } from '@ionic/vue'; + +const App = { + components: { IonApp, IonRouterOutlet }, + template: '', +} + +describe('IonPage', () => { + beforeAll(() => { + (HTMLElement.prototype as HTMLIonRouterOutletElement).commit = jest.fn(); + }); + it('should add ion-page class', async () => { + const Page1 = { + template: '', + components: { IonPage } + }; + + const router = createRouter({ + history: createWebHistory(process.env.BASE_URL), + routes: [ + { path: '/', component: Page1 } + ] + }); + + router.push('/'); + await router.isReady(); + const wrapper = mount(App, { + global: { + plugins: [router, IonicVue] + } + }); + + const cmp = wrapper.findComponent(Page1); + expect(cmp.classes('ion-page')).toBe(true); + }); + it('should preserve custom classes', async () => { + const Page1 = { + template: '', + components: { IonPage } + }; + + const router = createRouter({ + history: createWebHistory(process.env.BASE_URL), + routes: [ + { path: '/', component: Page1 } + ] + }); + + router.push('/'); + await router.isReady(); + const wrapper = mount(App, { + global: { + plugins: [router, IonicVue] + } + }); + + const cmp = wrapper.findComponent(Page1); + expect(cmp.classes('ion-page')).toBe(true); + expect(cmp.classes('custom-class')).toBe(true); + }); +})