如何手动销毁Vue中挂载的组件

 更新时间:2022年08月09日 10:39:43   作者:云中客youroch  
这篇文章主要介绍了如何手动销毁Vue中挂载的组件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

手动销毁Vue挂载的组件

因为很多页面需要用到<keep-alive>,我就用其将承载页面的父组件包裹了,但这也带来了一些问题。比如新写的页面中,进入下个页面还在调用上个页面的数据(以前没有遇到过,不清楚是是什么原因),即已经切换路由却无法自己destory掉,打日志发现确实没有跑destoryed这个生命周期函数。

如何解决

在需要删除的组件中的deactivated生命周期函数中手动调用this.$destroy('componentName'),这里的componentName即这个组件的name,使用后发现destoryed函数确实可以正常使用了,而且进入下一个页面也不会再报错说缺少这个页面的数据。

vue 销毁实例

1.导入vue创建一个VM实例

传入配置对象,了解配置对象中的各个属性

var VM = new Vue({ el: '#app', // 表示当我们new的这个Vue实例, 要控制页面上的那个区域 
data: { // data属性中,存放的是el中要用到的数据,这里的data就是MVVM中的M专门用来保存每个页面的数据 message: 'Hello Vue!' }, 
methods : {}, // 这个methods属性中定义了当前Vue实例所有可用的方法,主要写业务逻辑 
computed: {}, // 在computed中,可以定一些属性, 这些属性叫做计算属性,计算属性的本质就是一个方法,只不过我们在使用这些计算属性的时候是吧它们的名称直接当做属性来使用的,并不会把计算属性当做方法去调用 
filters : {}, // 这个filters属性中定义了当前Vue实例中所有可用的过滤的方法 
watch: {}, // 使用这个属性,可以监听data中数据的变化,然后触发这个watch中对应的function处理函数 router, // 挂载路由对象 
directives:{}, // 这个directives属性定义了当前Vue实例中所有可用的自定义指令 beforeCreate () {}, // 生命周期函数: 表示实例完全被创建之前,会执行这个函数 
created () {}, // 生命周期函数: 表示实例被创建之后 
beforeMounted () {}, // 生命周期函数: 表示模板已经编译完成,但是还没有把模板渲染到页面中 
mounted () {}, // 生命周期函数:表示模板已经编译完成,内存中的模板已经真实的渲染到了页面中去,已经可以看到渲染好的页面了 
beforeUpdate () {}, // 生命周期函数: 表示当前界面还没有被更新,数据肯定被更新了 
update () {}, // 生命周期函数: 表示当前页面和数据保持同步了,都是最新的 
beforeDestroy () {}, // 生命周期函数: 表示Vue实例已经从运行阶段进入到销毁阶段 
destroyed () {} // 生命周期函数: 表示组件已经完全被销毁了})

2.vm.$destroy()只能销毁实例里的方法但不能清除DOM和data吗?

destroy()只是完全销毁一个实例,清理它与其它实例的连接,解绑它的全部指令及事件监听器。

参见官方文档: https://cn.vuejs.org/v2/api/#vm-destroy

它并不是用来清除已有页面上的DOM的。实现功能包括:

(1) 包括Watcher对象从其所在Dep中释放

if (vm._watcher) {
  vm._watcher.teardown()
}
let i = vm._watchers.length
while (i--) {
  vm._watchers[i].teardown()
}
// remove reference from data ob
// frozen object may not have observer.
if (vm._data.__ob__) {
  vm._data.__ob__.vmCount--
}

(2) 移除所有事件的监听

vm.$off()

(3) patch一个null目的是触发所有的destroy钩子。

vm.__patch__(vm._vnode, null)
return function patch (oldVnode, vnode, hydrating, removeOnly, parentElm, refElm) {
    /*vnode不存在则直接调用销毁钩子*/
    if (isUndef(vnode)) {
      if (isDef(oldVnode)) invokeDestroyHook(oldVnode)
      return
    }
    ...
 }

想要清除页面的 DOM,需要使用 v-if,或者修改 v-for 中涉及到的数组或对象。

另外,调用 app.$destroy() 之后,你会发现,app.message = ‘Yes, he is a boy.’ 不会对页面产生影响。 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。 

相关文章

  • vue实现ToDoList简单实例

    vue实现ToDoList简单实例

    这篇文章主要为大家详细介绍了vue实现ToDoList简单实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Vite配置路径别名的简单实现方法

    Vite配置路径别名的简单实现方法

    Vite项目中我们可以手动将src路径设置**@**路径别名,可以省下很多引入路径的冗余路径,下面这篇文章主要给大家介绍了关于Vite配置路径别名的简单实现方法,需要的朋友可以参考下
    2023-04-04
  • vue常用知识点整理

    vue常用知识点整理

    Vue是一套用于构建用户界面的渐进式JavaScript框架。这篇文章整理了vue中的常用知识点,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Vue 组件注册全解析

    Vue 组件注册全解析

    这篇文章主要介绍了Vue 组件注册全解析的相关资料,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2020-12-12
  • 详解keep-alive + vuex 让缓存的页面灵活起来

    详解keep-alive + vuex 让缓存的页面灵活起来

    这篇文章主要介绍了keep-alive + vuex 让缓存的页面灵活起来,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue.js基于ElementUI封装了CRUD的弹框组件

    vue.js基于ElementUI封装了CRUD的弹框组件

    这篇文章主要介绍了vue.js基于ElementUI封装了CRUD的弹框组件,问咋会给你围绕主题展开详细的内容介绍,感兴趣的小伙伴可以参考一下
    2022-07-07
  • vue3组件库添加脚本的实现示例

    vue3组件库添加脚本的实现示例

    本文主要介绍了vue3组件库添加脚本的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • vue+electron实现创建多窗口及窗口间的通信(实施方案)

    vue+electron实现创建多窗口及窗口间的通信(实施方案)

    这篇文章主要介绍了vue+electron实现创建多窗口及窗口间的通信,本文给大家分享实施方案结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • vue draggable resizable 实现可拖拽缩放的组件功能

    vue draggable resizable 实现可拖拽缩放的组件功能

    这篇文章主要介绍了vue draggable resizable 实现可拖拽缩放的组件功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • vue父子组件通信的高级用法示例

    vue父子组件通信的高级用法示例

    这篇文章主要给大家介绍了关于vue父子组件通信的高级用法,文中通过示例代码介绍的非常详细,对大家学习或者使用vue具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08

最新评论