Vue: 使用“过渡”和“保持活动”时发生内存泄漏

创建于 2019-04-07  ·  5评论  ·  资料来源: vuejs/vue

版本

2.6.10

复制链接

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

重现步骤

我写了一个演示:

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

调试过程如下:
1单击“收集垃圾”和“获取堆快照”(快照1)
2单击左侧的路由按钮10次,然后单击“收集垃圾”和“获取堆快照”(快照2)
3单击左侧的路由按钮10次,然后单击“收集垃圾”和“获取堆快照”(快照3)

生成的“快照”如下:

快照1:

快照2:

快照3:

单击100次后:

VueComponent不被回收,这是一个错误吗?

期望什么?

为什么会这样,这是一个错误吗?

实际发生了什么?

切换组件时不会清除组件。

bug has PR

最有用的评论

我真的很乐意看到有关此问题的任何更新-有PR,但它似乎已经死了?

所有5条评论

我会看一看。

如果删除父节点,则所有组件均由缓存的vnode的父节点保留。 然后将组件回收。将进一步挖掘

我也有内存泄漏问题,请参阅: https :

我试图做一个jsfiddle,但不确定如何复制缓存行为。

嘿,有什么消息吗? 此更新是否已合并到master分支? 我也有同样的问题。

我真的很乐意看到有关此问题的任何更新-有PR,但它似乎已经死了?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

aviggngyv picture aviggngyv  ·  3评论

gkiely picture gkiely  ·  3评论

paceband picture paceband  ·  3评论

paulpflug picture paulpflug  ·  3评论

robertleeplummerjr picture robertleeplummerjr  ·  3评论