Vue: Vazamento de memória ao usar "transição" e "manter vivo"

Criado em 7 abr. 2019  ·  5Comentários  ·  Fonte: vuejs/vue

Versão

2.6.10

Link de reprodução

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

Passos para reproduzir

Eu escrevi uma demonstração:

<!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>

O processo de depuração é o seguinte:
1 Clique em "Coletar lixo" e "Tirar instantâneo da pilha" (instantâneo 1)
2 Clique no botão de roteamento à esquerda 10 vezes e, a seguir, clique em "Coletar lixo" e "Tirar instantâneo do heap" (instantâneo 2)
3 Clique no botão de roteamento à esquerda 10 vezes e, a seguir, clique em "Coletar lixo" e "Tirar instantâneo do heap" (instantâneo 3)

O "instantâneo" gerado é o seguinte:

instantâneo 1:

instantâneo 2:

instantâneo 3:

Depois de clicar 100 vezes:

O VueComponent não está sendo reciclado. Isso é um bug?

O que é esperado?

Por que isso está acontecendo, isso é um bug?

O que realmente está acontecendo?

O componente não será apagado ao trocar de componentes.

bug has PR

Comentários muito úteis

Eu realmente adoraria ver qualquer atualização sobre este assunto - há PR, mas parece morto?

Todos 5 comentários

Vou dar uma olhada nisso.

Todos os componentes são retidos pelo pai do vnode em cache, se excluirmos o pai. então os componentes são reciclados. Cavar mais

Eu também tenho um problema de vazamento de memória, consulte: https://github.com/bootstrap-vue/bootstrap-vue/issues/4214

Tentei fazer um jsfiddle, mas não tenho certeza de como replicar o comportamento de cache.

Ei, há alguma novidade? essas atualizações já estão mescladas com o branch master? Eu tenho o mesmo problema.

Eu realmente adoraria ver qualquer atualização sobre este assunto - há PR, mas parece morto?

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

aviggngyv picture aviggngyv  ·  3Comentários

gkiely picture gkiely  ·  3Comentários

finico picture finico  ·  3Comentários

loki0609 picture loki0609  ·  3Comentários

robertleeplummerjr picture robertleeplummerjr  ·  3Comentários