Skip to content

Commit 7c00897

Browse files
authoredJan 30, 2023
fix(vue): cache attached view reference (#26694)
Resolves #26695
1 parent 69d89ea commit 7c00897

File tree

6 files changed

+119
-9
lines changed

6 files changed

+119
-9
lines changed
 

‎packages/vue/src/framework-delegate.ts

+10-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export const VueDelegate = (
1717
// TODO(FW-2969): types
1818
const attachViewToDom = (
1919
parentElement: HTMLElement,
20-
component: any,
20+
componentOrTagName: any | string,
2121
componentProps: any = {},
2222
classes?: string[]
2323
) => {
@@ -28,10 +28,17 @@ export const VueDelegate = (
2828
const hostComponent = h(
2929
Teleport,
3030
{ to: div },
31-
h(component, { ...componentProps })
31+
h(componentOrTagName, { ...componentProps })
3232
);
3333

34-
refMap.set(component, hostComponent);
34+
/**
35+
* Ionic Framework will use what is returned from `attachViewToDom`
36+
* as the `component` argument in `removeViewFromDom`.
37+
*
38+
* We will store a reference to the div element and the host component,
39+
* so we can later look-up and unmount the correct instance.
40+
*/
41+
refMap.set(div, hostComponent);
3542

3643
addFn(hostComponent);
3744

‎packages/vue/test/base/src/router/index.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,14 @@ const routes: Array<RouteRecordRaw> = [
6666
path: '/navigation',
6767
component: () => import('@/views/Navigation.vue')
6868
},
69+
{
70+
path: '/components',
71+
component: () => import('@/views/Components.vue'),
72+
},
73+
{
74+
path: '/components/select',
75+
component: () => import('@/views/Select.vue')
76+
},
6977
{
7078
path: '/nested',
7179
component: () => import('@/views/RouterOutlet.vue'),
@@ -140,7 +148,7 @@ const routes: Array<RouteRecordRaw> = [
140148
component: () => import('@/views/Tab3Secondary.vue')
141149
}
142150
]
143-
}
151+
},
144152
]
145153

146154
const router = createRouter({
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<template>
2+
<ion-page>
3+
<ion-content>
4+
<ion-list>
5+
<ion-item button router-link="/components/select">
6+
<ion-label>Select</ion-label>
7+
</ion-item>
8+
</ion-list>
9+
</ion-content>
10+
</ion-page>
11+
</template>
12+
13+
<script lang="ts">
14+
import { defineComponent } from "vue";
15+
import { IonPage, IonContent, IonList, IonItem, IonLabel } from "@ionic/vue";
16+
17+
export default defineComponent({
18+
components: { IonPage, IonContent, IonList, IonItem, IonLabel },
19+
});
20+
</script>

‎packages/vue/test/base/src/views/Home.vue

+18-5
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,28 @@
5353
<ion-item button router-link="/delayed-redirect" id="delayed-redirect">
5454
<ion-label>Delayed Redirect</ion-label>
5555
</ion-item>
56+
<ion-item button router-link="/components">
57+
<ion-label>Components</ion-label>
58+
</ion-item>
5659
</ion-list>
57-
5860
</ion-content>
5961
</ion-page>
6062
</template>
6163

6264
<script lang="ts">
63-
import { IonButtons, IonBackButton, IonContent, IonHeader, IonItem, IonLabel, IonList, IonPage, IonTitle, IonToolbar } from '@ionic/vue';
64-
import { defineComponent } from 'vue';
65+
import {
66+
IonButtons,
67+
IonBackButton,
68+
IonContent,
69+
IonHeader,
70+
IonItem,
71+
IonLabel,
72+
IonList,
73+
IonPage,
74+
IonTitle,
75+
IonToolbar,
76+
} from "@ionic/vue";
77+
import { defineComponent } from "vue";
6578
6679
export default defineComponent({
6780
components: {
@@ -74,7 +87,7 @@ export default defineComponent({
7487
IonList,
7588
IonPage,
7689
IonTitle,
77-
IonToolbar
78-
}
90+
IonToolbar,
91+
},
7992
});
8093
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<template>
2+
<ion-page>
3+
<ion-header>
4+
<ion-toolbar>
5+
<ion-title>Select</ion-title>
6+
</ion-toolbar>
7+
</ion-header>
8+
<ion-content>
9+
<ion-item>
10+
<ion-label>Select Popover</ion-label>
11+
<ion-select
12+
id="select-popover"
13+
interface="popover"
14+
placeholder="Select fruit"
15+
>
16+
<ion-select-option value="apples">Apples</ion-select-option>
17+
<ion-select-option value="oranges">Oranges</ion-select-option>
18+
<ion-select-option value="bananas">Bananas</ion-select-option>
19+
</ion-select>
20+
</ion-item>
21+
</ion-content>
22+
</ion-page>
23+
</template>
24+
25+
<script lang="ts">
26+
import {
27+
IonPage,
28+
IonHeader,
29+
IonToolbar,
30+
IonTitle,
31+
IonContent,
32+
IonItem,
33+
IonLabel,
34+
IonSelect,
35+
IonSelectOption,
36+
} from "@ionic/vue";
37+
import { defineComponent } from "vue";
38+
39+
export default defineComponent({
40+
components: {
41+
IonPage,
42+
IonHeader,
43+
IonToolbar,
44+
IonTitle,
45+
IonContent,
46+
IonItem,
47+
IonLabel,
48+
IonSelect,
49+
IonSelectOption,
50+
},
51+
});
52+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
describe("Components: Select", () => {
2+
beforeEach(() => {
3+
cy.visit("http://localhost:8080/components/select");
4+
});
5+
6+
it("should open a popover overlay interface", () => {
7+
cy.get("#select-popover").click();
8+
cy.get("ion-popover").should("exist").should("be.visible");
9+
});
10+
});

0 commit comments

Comments
 (0)
Please sign in to comment.