Vue: Fuite de mémoire lors de l'utilisation de "transition" et "keep-alive"

Créé le 7 avr. 2019  ·  5Commentaires  ·  Source: vuejs/vue

Version

2.6.10

Lien de reproduction

https://codepen.io/aaronbird/pen/JVRKwa

Étapes à suivre pour reproduire

J'ai écrit une démo:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>demo</title>
    <style>
      .link {
        cursor: pointer;
        user-select: none;
      }
    </style>
  </head>
  <body>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>

    <div id="app">
      <transition>
        <keep-alive include="foo">
          <component :is="target" @change="onChange"></component>
        </keep-alive>
      </transition>
    </div>
    <script>
      const Foo = {
        name: "foo",
        template: `<div class="link" @click="$emit('change', 'bar')">Go to Bar</div>`
      };
      const Bar = {
        name: "bar",
        template: `<div class="link" @click="$emit('change', 'foo')">Go to Foo</div>`
      };
      Vue.component("foo", Foo);
      Vue.component("bar", Bar);
      const app = new Vue({
        data: {
          target: "foo"
        },
        methods: {
          onChange(target) {
            this.target = target;
          }
        }
      }).$mount("#app");
    </script>
  </body>
</html>

Le processus de débogage est le suivant:
1 Cliquez sur "Collecter les ordures" et "Prendre un instantané du tas" (instantané 1)
2 Cliquez 10 fois sur le bouton de routage à gauche, puis cliquez sur «Collecter les déchets» et «Prendre un instantané du tas» (instantané 2)
3 Cliquez 10 fois sur le bouton de routage à gauche, puis cliquez sur «Collecter les déchets» et «Prendre un instantané du tas» (instantané 3)

Le "snapshot" généré est le suivant:

instantané 1:

instantané 2:

instantané 3:

Après avoir cliqué 100 fois:

VueComponent n'est pas recyclé, est-ce un bug?

Qu'attend-on?

Pourquoi cela se produit-il, est-ce un bug?

Que se passe-t-il réellement?

Le composant ne sera pas effacé lors du changement de composant.

bug has PR

Commentaire le plus utile

J'aimerais vraiment voir une mise à jour sur ce problème - il y a des relations publiques mais cela semble mort?

Tous les 5 commentaires

Je vais jeter un oeil à ceci.

Tout le composant est conservé par le parent de vnode mis en cache , si nous supprimons le parent. puis les composants sont recyclés.

J'ai également un problème de fuite de mémoire, veuillez consulter: https://github.com/bootstrap-vue/bootstrap-vue/issues/4214

J'ai essayé de créer un jsfiddle mais je ne sais pas comment répliquer le comportement de mise en cache.

Hé, y a-t-il des nouvelles? ces mises à jour sont-elles déjà fusionnées avec la branche principale? J'ai le même problème.

J'aimerais vraiment voir une mise à jour sur ce problème - il y a des relations publiques mais cela semble mort?

Cette page vous a été utile?
0 / 5 - 0 notes