Skip to content

Commit

Permalink
fix(menu): refs are not destroyed on unmount (#27141)
Browse files Browse the repository at this point in the history
<!-- 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
#24907

`ion-menu` currently clears the `menuInnerEl` and `backdropEl` refs
created by Stencil when `disconnectedCallback` is fired. If the
`ion-menu` component is re-mounted but _not_ re-rendered, those refs
will still be `undefined` when the `open` method is called, resulting in
the linked issue. Note that if the `ion-menu` re-renders before `open`
is called then this issue does not reproduce.

This clearing behavior was added ~6 years ago before we utilized Stencil
refs:
https://github.com/ionic-team/ionic-framework/blob/687b37ad3e3237b874473817bb7b59143ac113ce/packages/core/src/components/menu/menu.tsx#L136-L137

During this time we had to manually create and clear the element
references.

Several years later we moved to using Stencil refs, but we did not
remove the logic that clears the refs:
d83d8ee

## What is the new behavior?
<!-- Please describe the behavior or changes that are being added by
this PR. -->

- Menu no longer sets `menuInnerEl` and `backdropEl` to `undefined` in
`disconnectedCallback`.
- The `close` method is called so that the state is reset prior to the
menu being re-added. I observed that without this, the animation to
re-present a menu did not work correctly.

## 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. -->
  • Loading branch information
liamdebeasi authored Apr 10, 2023
1 parent f9deb1d commit b81b0d1
Showing 1 changed file with 11 additions and 2 deletions.
13 changes: 11 additions & 2 deletions core/src/components/menu/menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,16 @@ export class Menu implements ComponentInterface, MenuI {
this.updateState();
}

disconnectedCallback() {
async disconnectedCallback() {
/**
* The menu should be closed when it is
* unmounted from the DOM.
* This is an async call, so we need to wait for
* this to finish otherwise contentEl
* will not have MENU_CONTENT_OPEN removed.
*/
await this.close(false);

this.blocker.destroy();
menuController._unregister(this);
if (this.animation) {
Expand All @@ -253,7 +262,7 @@ export class Menu implements ComponentInterface, MenuI {
}

this.animation = undefined;
this.contentEl = this.backdropEl = this.menuInnerEl = undefined;
this.contentEl = undefined;
}

@Listen('ionSplitPaneVisible', { target: 'body' })
Expand Down

0 comments on commit b81b0d1

Please sign in to comment.