vuejs / core

🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

Home Page:https://vuejs.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Activated lifecycle hook not triggered in async context

DragonnZhang opened this issue · comments

Seems similar to #7276, though not exactly the same. It might be the same underlying cause.

That other issue has a PR at #7286, but that seems to be only handling cases involving defineAsyncComponent, so it doesn't fix the issue reported here.

The issue goes deeper than the onActivated lifecycle hook not being triggered in async context. The onActivated is not called on all descendant components mounted after a v-if change. I've prepared a demo that illustrates the behavior.

This raises a question about whether the observed results align with the expected behavior or if there might be an inconsistency or potential issue with the way descendant components are handled in this scenario. If using v-show everything works as expected. Seems to be related to mounting components in different ticks from KeepAlive's tick, seemingly they are not cached in KeepAlive as well.

Edit: As a potential workaround for the issue where onActivated is not called on descendant components after a v-if change, you can consider using v-show instead. This seems to resolve the problem and ensures the expected behavior, as the lifecycle hooks are triggered correctly when components are toggled with v-show.

The issue goes deeper than the onActivated lifecycle hook not being triggered in async context. The onActivated is not called on all descendant components mounted after a v-if change. I've prepared a demo that illustrates the behavior.

This raises a question about whether the observed results align with the expected behavior or if there might be an inconsistency or potential issue with the way descendant components are handled in this scenario. If using v-show everything works as expected. Seems to be related to mounting components in different ticks from KeepAlive's tick, seemingly they are not cached in KeepAlive as well.

Edit: As a potential workaround for the issue where onActivated is not called on descendant components after a v-if change, you can consider using v-show instead. This seems to resolve the problem and ensures the expected behavior, as the lifecycle hooks are triggered correctly when components are toggled with v-show.

You are right. I will try v-show instead. Thank you.

The Vue documentation states that the onActivated and onDeactivated hooks should work not only for the root component cached by <KeepAlive>, but also for descendant components in the cached tree. However, the issue we're facing is that onActivated is not being called on conditional descendants (those toggled with v-if) of cached components.

This raises a couple of questions:

  1. Should we expect onActivated/onDeactivated to be called on conditional descendants of cached components, as per the documentation? Or should we stick to using regular lifecycle hooks for these cases?
  2. If this behavior is considered an inconsistency or a bug, should we document this particular case or try to fix it?

I'm ready to provide a PR to address this issue, but I'd like to get feedback from the team first on the expected behavior and the best approach moving forward.

I found an easier method to trigger onActivated. Instead of using v-show, just wrap the component with another <KeepAlive>, like this.