Skip to content

Commit ee21d3a

Browse files
authored
fix(react): removing pages from DOM on nav, fixes #19701 (#19712)
1 parent d8ca878 commit ee21d3a

File tree

2 files changed

+22
-19
lines changed

2 files changed

+22
-19
lines changed

packages/react-router/src/ReactRouter/Router.tsx

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ class RouteManager extends React.Component<RouteComponentProps, RouteManagerStat
4343
}
4444
}
4545

46+
componentWillUnmount() {
47+
if (this.listenUnregisterCallback) {
48+
this.listenUnregisterCallback();
49+
}
50+
}
51+
4652
hideView(viewId: string) {
4753
const viewStacks = Object.assign(new ViewStacks(), this.state.viewStacks);
4854
const { view } = viewStacks.findViewInfoById(viewId);
@@ -97,17 +103,16 @@ class RouteManager extends React.Component<RouteComponentProps, RouteManagerStat
97103
enteringView.prevId = enteringView.prevId || leavingView.id;
98104
} else {
99105
direction = direction || 'back';
100-
leavingView.mount = false;
101106
}
102-
} else if (action === 'REPLACE') {
103-
leavingView.mount = false;
104107
}
105108
}
109+
this.removeOrphanedViews(enteringView, enteringViewStack);
106110
} else {
107111
enteringView.show = true;
108112
enteringView.mount = true;
109113
enteringView.routeData.match = match!;
110114
}
115+
111116
});
112117

113118
if (leavingView) {
@@ -140,10 +145,20 @@ class RouteManager extends React.Component<RouteComponentProps, RouteManagerStat
140145
});
141146
}
142147

143-
componentWillUnmount() {
144-
if (this.listenUnregisterCallback) {
145-
this.listenUnregisterCallback();
146-
}
148+
removeOrphanedViews(view: ViewItem, viewStack: ViewStack) {
149+
const viewsToRemove = viewStack.views.filter(v => v.prevId === view.id);
150+
viewsToRemove.forEach(v => {
151+
this.removeOrphanedViews(v, viewStack);
152+
// If view is not currently visible, go ahead and remove it from DOM
153+
if (v.ionPageElement!.classList.contains('ion-page-hidden')) {
154+
v.show = false;
155+
v.ionPageElement = undefined;
156+
v.isIonRoute = false;
157+
v.prevId = undefined;
158+
v.key = generateId();
159+
}
160+
v.mount = false;
161+
});
147162
}
148163

149164
async setupIonRouter(id: string, children: any, routerOutlet: HTMLIonRouterOutletElement) {

packages/react-router/src/ReactRouter/ViewStacks.ts

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,4 @@ export class ViewStacks {
8585
return { view, viewStack };
8686
}
8787

88-
setHiddenViews() {
89-
const keys = this.getKeys();
90-
keys.forEach(key => {
91-
const viewStack = this.viewStacks[key];
92-
viewStack!.views.forEach(view => {
93-
if (!view.routeData.match && !view.isIonRoute) {
94-
view.show = false;
95-
view.mount = false;
96-
}
97-
});
98-
});
99-
}
10088
}

0 commit comments

Comments
 (0)