如何销毁/卸载 vue.js 3 组件?

2024-05-27

我有一个相当大的vue.js 2具有动态选项卡机制的应用程序。用户可以与应用程序打开和关闭选项卡进行交互,每个选项卡代表一条路线。为了实现这一点,我使用 vue router 并保持活动状态,如下例所示。

<template>
  <div id="app">
    <keep-alive>
      <router-view :key="routerViewKey"/>
    </keep-alive>
  </div>
</template>

当用户单击关闭选项卡按钮时,$destroy调用函数以从缓存中删除其组件。我正在将此应用程序从 vue 2 迁移到 vue 3,但是,请阅读重大更改文档 https://v3-migration.vuejs.org/breaking-changes/#other-minor-changes对于 vue.js 3 我们可以看到:

删除的 API

$destroy实例方法。用户不应再手动管理 各个 Vue 组件的生命周期。

到目前为止我还没有找到任何替代方案,那么如何以编程方式销毁/卸载 keep-alive 中的缓存组件vue.js 3?

编辑 1(22 年 4 月): 到目前为止还无法实现$destroy在 vue.js 3 中的 vue.js 2 上做了。目前有一个 RFC 可以解决这个问题(https://github.com/vuejs/rfcs/discussions/283 https://github.com/vuejs/rfcs/discussions/283),但遗憾的是开通一年多了没有任何反馈。


您可以在这里找到卸载命令:https://v3.vuejs.org/api/application-api.html#unmount https://v3.vuejs.org/api/application-api.html#unmount

不幸的是,如果您想在应用程序内部执行此操作,文档中没有任何方法可以执行此操作。 然而,在分析了该对象之后,我找到了一种方法。您可以通过使用以下方法来实现它:this.$.appContext.app.unmount();

我不是这个解决方案的忠实粉丝,因为它在未来的版本中不再适用,但它在我的项目中运行良好。

编辑: 另一种方法是延长Vue对象根据此:https://github.com/vuejs/vue-next/issues/1802 https://github.com/vuejs/vue-next/issues/1802 and https://github.com/pearofducks/mount-vue-component https://github.com/pearofducks/mount-vue-component

我稍微改进了一下功能:

function mount(component, { props, children, element, app } = {}) {
    let el = element
  
    let vNode = createVNode(component, props, children)
    vNode.destroy = () => {
        if (el) render(null, el)
        el = null
        vNode = null
    }
    if (app?._context) vNode.appContext = app._context
    if (el) render(vNode, el)
    else if (typeof document !== 'undefined' ) render(vNode, el = document.createElement('div'))
  
    const destroy = () => {
        if (el) render(null, el)
        el = null
        vNode = null
    }
  
    return { vNode, destroy, el }
}

您现在可以跟踪您作为子组件的组件,使用以下命令从父组件和子组件中销毁它:this.$.vnode.destroy();

然而,新的官方方式似乎使用createApp now.

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

如何销毁/卸载 vue.js 3 组件? 的相关文章

随机推荐

  • 按月/年间隔汇总每日数据

    我并不经常需要在 R 中处理日期 但我认为这相当简单 我有一列代表数据框中的日期 我只想创建一个新的数据框 使用日期按月 年总结第二列 最好的方法是什么 我想要第二个数据框 这样我就可以将它提供给绘图 您能提供的任何帮助将不胜感激 编辑 供
  • VSTS 使用 API 在队列时设置构建参数

    我需要对来自 REST API 的 VSTS 构建进行排队 记录于https learn microsoft com en us rest api vsts build builds queue view vsts rest 4 1 htt
  • 在程序关闭期间捕获Python中的键盘中断

    我正在用 Python 编写一个命令行实用程序 因为它是生产代码 所以应该能够干净地关闭 而不会将一堆内容 错误代码 堆栈跟踪等 转储到屏幕上 这意味着我需要捕获键盘中断 我尝试过使用 try catch 块 例如 if name main
  • sbt:编译测试时设置特定的 scalacOptions 选项

    通常我使用这组选项来编译 Scala 代码 scalacOptions Seq deprecation encoding UTF 8 feature unchecked language higherKinds language impli
  • FindBugs 排除过滤器的问题

    我正在评估 FindBugs 并尝试使用 exceptFilter 以便该工具不会处理测试包或生成的 ejb 存根 我已经尝试过以下方法
  • 如何使用 scipy.integrate 获取截断球体的体积?

    我正在努力使用 scipy integrate 我使用了 tplquad 但是我该如何使用integrate获得 截断 球体的体积 谢谢 import scipy from scipy integrate import quad dblqu
  • 将自己编写的 TypeScript 模块导入 Svelte 组件时出现错误

    我正在尝试将自己编写的 TypeScript 模块导入到 Svelte 组件中 但是 当我尝试使用以下行导入模块时 我收到以下错误 import TelegramBotForSafetyMania from telegram bot 我们收
  • 带有 CosmosDBTrigger 的 Azure 函数似乎不是由 upsert 触发的

    我是第一次使用 Azure Functions 我正在尝试编写一个简单的函数来响应更改或添加到 CosmosDb 集合中的文档 我写的函数如下所示 FunctionName ChangeLog public static void Run
  • MPI_Type_Create_Hindexed_Block 生成派生数据类型的错误范围

    使用Fortran 我尝试为动态分配的结构构建派生数据类型 但它得到了新类型的错误范围 代码如下 PROGRAM MAIN IMPLICIT NONE INCLUDE mpif h INTEGER I INTEGER MYID NUMPRO
  • 我可以让 lein cloverage 跳过特定测试吗?

    我正在进行一个 Leiningen 项目 其集成测试注释如下 deftest manual test v3 preview preview client http localhost 10313 v3 preview 当我这样做时 这些测试
  • Web.GetFileByServerRelativeUrl 抛出“值未落在预期范围内”

    我有一个存储文档的 SP Online 站点 添加 检索文档没有任何问题 但在删除流程中 我在检索文档时遇到错误File object public static void DeleteDocument using ClientContex
  • Oracle中表的列重新排序

    我有一个包含 50 多列的表 我需要交换前两列的顺序 使用 Oracle 实现此目的的最佳方法是什么 假设表名是 ORDERDETAILS 前两列是 ITEM ID 和 ORDER ID 重命名完成后 表名仍应为 ORDERDETAILS
  • ASP.NET 4.0 中的模拟 HttpRequest

    我见过很多类似的帖子 但没有一个能真正解决我的特殊情况 我正在 ASP NET 4 0 Web 应用程序 ASP NET Forms 而不是 MVC 中编写单元测试 代码中有几个地方我称之为ServerVariables调用变量的集合 例如
  • 如何使用joda时间将固定的毫秒数格式化为hh:mm:ss?

    我输入了 34600 毫秒 我想以 00 00 34 HH MM SS 的格式输出 为此我应该查看 JDK Joda time 的哪些类 我需要它是高效的 最好是线程安全的 以避免每次解析时创建对象 谢谢 编辑 使用此代码提供时区敏感的结果
  • 使用 JSONDecoder 解码的对象的打印输出出现问题

    我正在尝试快速解码 JSON 字符串 但在解码后访问属性时遇到一些奇怪的问题 这是我从本地存储的 JSON 文件检索的 JSON 文件的内容 word a usage partOfSpeech determiner 这是访问 JSON 文件
  • Backbone.js 模型或视图中的类私有属性

    模型中是否可以拥有私有属性 就像 构造函数 函数中本地声明的变量一样 不附加到this 但仅在 构造函数 函数中定义的内容在本地声明且可见 没有 BB 视图的示例 function MyView aModel var internalInp
  • 在for循环中重命名ggplot2图

    我有一个关于在 for 循环中创建 ggplot2 图表 根据迭代重命名它们 然后在网格中排列图表的问题 我想做类似这个虚拟示例的事情 library ggplot2 a c 1 2 3 b c 4 5 6 for i in c 1 5 x
  • 搜索 Outlook 全局地址列表

    我正在从 Outlook 中提取全局地址列表 如下所示 Microsoft Office Interop Outlook Application oApp new Microsoft Office Interop Outlook Appli
  • 无法启动 Spark-Shell

    我使用的是 Spark 1 4 1 我可以毫无问题地使用spark submit 但当我跑的时候 spark bin spark shell 我收到以下错误 我已经配置了SPARK HOME and JAVA HOME 不过 Spark 1
  • 如何销毁/卸载 vue.js 3 组件?

    我有一个相当大的vue js 2具有动态选项卡机制的应用程序 用户可以与应用程序打开和关闭选项卡进行交互 每个选项卡代表一条路线 为了实现这一点 我使用 vue router 并保持活动状态 如下例所示