vue-router 总是创建一个新的 Component 实例

2023-11-27

我在 vue-router 中发现了一个问题,这让我很受触动。 当我在路由之间切换时,总是会创建组件的新实例。此外,旧实例不会被删除并在后台运行!

我希望当我打开一条路线时,旧组件将被销毁或停止运行。

有解决方法来解决这个问题吗?

这是一个小提琴:https://jsfiddle.net/4xfa2f19/5885/

let foo = {
    template: '<div>Foo</div>',
    mounted() {
        console.log('Mount Foo with uid: ' + this._uid);
        setInterval(() => {console.log('Instance ' + this._uid + ' of Foo is running')}, 500);
    }
};

let bar = {
    template: '<div>Bar</div>',
    mounted() {
        console.log('Mount Bar with uid: ' + this._uid);
        setInterval(() => {console.log('Instance ' + this._uid + ' of Bar is running')}, 500);
    }
};


const router = new VueRouter({
    routes: [
        { path: '/user/foo', component: foo },
        { path: '/user/bar', component: bar }
    ]
});


const app = new Vue({ router }).$mount('#app');

有两种方法可以解决这个问题:

正确清理室内destroy hook

如果您使用任何外部事件侦听器,例如setInterval, addEventListener等你还需要注销当你的组件被破坏时它们,例如:

{
    name: '...',
    template: '...',
    data() {
        return {
            interval: undefined,
            timeout: undefined
        };
    },
    mounted() {
        interval = setInterval(() => {console.log('Instance ' + this._uid + ' of myself is running')}, 500);
        timeout = setTimeout(() => {console.log('Instance ' + this._uid + ' of myself is running')}, 500);
        document.addEventListener('click', this.onOutsideClick);
    },
    beforeDestroy() {
        // Cleanup interval
        clearInterval(interval);
        // Cleanup any pending timeouts
        clearTimeout(timeout);
        // Cleanup any event listeners outside the root of the element
        document.removeEventListener('click', this.onOutsideClick);
    },
    methods: {
        onOutsideClick() {
            ...
        }
    }
}

使用 keep-alive 使组件保持活动状态

使用 keepalive 时,Vue 会缓存您的组件,并使其在后台保持活动状态,这意味着只有一个实例存在。如果您有大量路线,这可能会消耗更多内存

<keep-alive>
    <router-view></router-view>
</keep-alive>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue-router 总是创建一个新的 Component 实例 的相关文章

随机推荐

  • .NET FtpWebRequest 是否支持隐式 (FTPS) 和显式 (FTPES)?

    我被要求支持隐式和显式 FTPS 也称为 FTPES 我们目前使用的是 NETFtpWebRequest 是否FtpWebRequest支持两种类型的FTPES 有什么区别 Thanks 据我所知 当前 NET 2 0 和 3 5 版本的
  • 根据 Pandas python 中的两个条件选择数据帧的行

    我有一个 df 我想运行类似的命令 subsetdf df loc df Item Desc str contains X True or df Item Desc str contains Y True 选择 项目描述 列中包含 X 或
  • Emacs 中 LaTeX 的代码折叠

    是否有一个 Emacs 次要模式 或一段 elisp 代码 可以让您在 LaTeX 模式下有选择地隐藏 显示环境 例如 我想移动到一个很长的开头 begin figure 块 击键 然后将该图形环境的内容隐藏在视图中 类似地与 begin
  • Android 的仪器测试 - 方向改变后如何接收新的 Activity?

    我正在尝试测试新创建的活动 方向更改后 是否已正确重新初始化 下面的代码显示从 getActivity 返回的活动是在 setUp 中构造的活动 而不是新创建的活动 Test public class MyActivityTest exte
  • 如何在使用按键移动时在 pygame 中转动精灵

    So basically ive been hoping it would be possible to effectively turn your sprite while moving it around with WASD Any i
  • 当 UIViewController 被释放时,调度队列会发生什么?

    我试图更好地理解保留周期 特别是相对于调度队列 我正在使用 AVFoundation 并在 sessionQueue 上管理 AVCaptureSession private let sessionQueue DispatchQueue l
  • 正则表达式提取两个字符或标签之间的所有子字符串

    我需要提取由两个字符 或者可能是两个标签 包围的所有字符串 这就是我到目前为止所做的 NSRegularExpression regex NSRegularExpression regularExpressionWithPattern op
  • MySQL删除重复记录但保留最新记录

    我有独特的id and email字段 电子邮件会重复 我只想保留所有重复项的一个电子邮件地址 但包含最新的id 最后插入的记录 我怎样才能实现这个目标 想象一下你的桌子test包含以下数据 select id email from tes
  • 与 Xcode 分开安装 Git

    首先 我很抱歉这是一个非常简单的问题 但 Git 对我来说绝对是全新的 基本上 我已经涉足 iOS 开发一段时间了 现在有了一个项目想法 我想开始研究 并且我第一次计划将其纳入源代码管理 现在我知道 Xcode 4 有一些 Git 集成 但
  • mariadb IF 语句错误消息?

    我测试sql查询 IF 3 3 THEN SELECT TRUE ELSE SELECT FALSE END IF 我在 SQLyog 中执行查询 我收到下面的错误消息 You have an error in your SQL synta
  • 多对多关系的内联表单集的挂件

    遵循凯文 迪亚斯 Kevin Dias 的指示本文 我尝试为两个相关模型生成一种表单 这似乎适用于一对多关系 但是我在使用多对多关系时遇到了问题 以下是用户角色管理的一些示例代码 models py from django db impor
  • 如何授予 SQL Server 读取我的 SSL 密钥的权限?

    我最近创建了一个自签名证书并在 SQL Server 2014 中打开了加密 问题是现在 SQL Server 服务无法启动 本文from 2010 将问题识别为权限问题 SQL Server 服务没有读取 SSL 证书私钥的必要权限 问题
  • 如何计算 linq to sql 查询中列值的总和?

    我写这个查询 var query2 from p in behzad Compare closed numbers in CRM and Billing system detail counters where p fileid point
  • Eclipse 调试 - 行:不可用

    我似乎在谷歌上找不到任何东西告诉我为什么会这样以及解决方案是什么 我正在逐步执行第三方代码 我有源代码 并且非常希望看到当前行正在执行 查看 javac 编译标志 我看到 g none 标志 如果设置了此标志 这是否足以解释为什么我看不到行
  • 在 Angular2 中跨模块共享服务的最佳方式是什么

    我正在使用如下所述的应用程序结构 index ts app module ts app component ts hero directory hero module ts hero ts Data Object hero service
  • S4方法调度慢吗?

    我的 S4 类有一个被调用多次的方法 我注意到执行时间比独立调用类似函数要慢得多 因此 我在类中添加了一个类型为 function 的槽 并使用该函数而不是该方法 下面的示例显示了执行此操作的两种方法 并且它们的运行速度都比相应的方法快得多
  • 理解平行存在并找到

    我拿一个List Int 并想要搜索一个值x where x 10 gt 500在平行下 所以exists应该返回true如果列表包含 51 或更大的任何值 def f x Int println calculating for x Thr
  • Multipart/form-data 不支持 request.getparamerter [重复]

    这个问题在这里已经有答案了 我有一个表格 它有文件上传部分以及几个输入字段 我在用request getParameter 将值从 jsp 获取到 servlet 但是当我添加encrypt multipart request get参数不
  • 过滤数据框

    我已读取矩阵形式的 csv 文件 有 m 行和 n 列 我想通过以口头形式进行过滤来过滤矩阵 选择 x 列中的所有值 其中该行中另一列的值等于 blabla 这就像数据库中的选择语句 我说我对需要满足这些约束的矩阵的子集感兴趣 我怎样才能在
  • vue-router 总是创建一个新的 Component 实例

    我在 vue router 中发现了一个问题 这让我很受触动 当我在路由之间切换时 总是会创建组件的新实例 此外 旧实例不会被删除并在后台运行 我希望当我打开一条路线时 旧组件将被销毁或停止运行 有解决方法来解决这个问题吗 这是一个小提琴