fix(vue): modal, popover, and nav are now created within application context (#22282)

resolves #22079
This commit is contained in:
Liam DeBeasi
2020-10-12 15:07:49 -04:00
committed by GitHub
parent 181d322192
commit 6026c65b1a
20 changed files with 405 additions and 136 deletions

View File

@ -0,0 +1,38 @@
import { h, defineComponent, shallowRef, VNode } from 'vue';
const userComponents = shallowRef([]);
export const IonApp = defineComponent({
name: 'IonApp',
setup(_, { attrs, slots }) {
return () => {
return h(
'ion-app',
{
...attrs
},
[slots.default && slots.default(), ...userComponents.value]
)
}
}
});
/**
* When rendering user components inside of
* ion-modal, ion-popover, or ion-nav, 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);
}