首页>>前端>>Vue->vue生命周期什么时候销毁(vue生命周期几个)

vue生命周期什么时候销毁(vue生命周期几个)

时间:2023-12-01 本站 点击:0

Vue生命周期方法

和wbpack生命周期方法一样, 都是在从生到死的特定阶段调用的方法

PS: 生命周期钩子 = 生命周期函数 = 生命周期事件

    2.1创建期间的生命周期方法beforeCreate:

        created:

        beforeMount:

        mounted:

    2.2运行期间的生命周期方法beforeUpdate:

        updated:

    2.3销毁期间的生命周期方法beforeDestroy:

        destroyed:

1.Vue特殊特性Vue特点: 数据驱动界面更新, 无需操作DOM来更新界面

也就是说Vue不推荐我们直接操作DOM, 但是在企业开发中有时候我们确实需要拿到DOM操作DOM

那么如果不推荐使用原生的语法获取DOM, 我们应该如何获取DOM?

在Vue中如果想要拿到DOM元素我们可以通过ref来获取2.ref使用2.1在需要获取的元素上添加ref属性. 例如: p ref="mypp"我是段落

2.2在使用的地方通过 this.$refs.xxx获取, 例如this.$ref.myppp

3.ref特点ref添加到元素DOM上, 拿到的就是元素DOM

ref添加到组件上, 拿到的就是组件

1.Vue渲染组件的两种方式

    1.1先定义注册组件, 然后在Vue实例中当做标签来使用

    1.2先定义注册组件, 然后通过Vue实例的render方法来渲染

2.两种渲染方法的区别

    1.1当做标签来渲染, 不会覆盖Vue实例控制区域

    1.2通过render方法来渲染, 会覆盖Vue实例控制区域

vue组件生命周期

该函数执行在组件创建、数据观测 (data observer) 和 event/watcher 事件配置之前,实例初始化之后被调用。 数据还没有初始化

在该阶段组件未创建,不能访问数据,组件中的 data,ref 均为 undefined。

在组件创建完成后立即调用

在这一步 实例已经完成了数据观测 属性和方法的运算 watch、event事件回调

但是还没有渲染成html模板 组件中的data已经存在 可以进行操作了 但是el仍然是undefiend 因为挂载阶段还没有开始,$el属性尚不可用

数据已经完成了初始化 dom结构未生成

该函数在挂载之前被调用,该阶段页面上还没有渲染,data已经初始化完成 ref还不可以操作 render函数首次被调用

可以访问数据 编译模板结束 虚拟dom已经存在

该函数是在组件挂载完成之后执行的 这时候el被$el替换,已经可以操作ref了

一般在这个阶段请求数据 filter过滤器也是在这个阶段生效

服务器渲染期间不被调用

在数据更新时调用,在虚拟dom更新前,在特殊情况下,可以讲更新前的数据存起来,放到之后使用

这里适合在更新前访问现有的dom比如移除事件监听器

该钩子只有初次渲染会在服务端进行

data中的数据是最新的,且页面并未和最新的数据同步。

由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。

页面也完成了更新,此时,data数据是最新的,同时,页面上呈现的数据也只最新的。

在实例销毁之前调用,这里依然可以操作,可以在这里清除定时器 防止内存泄漏

当执行该生命周期函数的时候,实例身上所有的data,所有的methods以及过滤器…等都处于可用状态,并没有真正执行销毁

在销毁后调用 所有子实例被销毁 所有的事件监听器会被移除

在服务器渲染期间不被调用

此时组件以及被完全销毁,实例中的所有的数据、方法、属性、过滤器…等都已经不可用了

和上面的beforeDestroy和destroyed用法差不多,但是如果我们需要一个实例,在销毁后再次出现的话,用 beforeDestroy和destroyed的话,就太浪费性能了。实例被激活时使用,用于重复激活一个实例的时候

被 keep-alive 缓存的组件激活时调用。

该钩子在服务器端渲染期间不被调用。

实例没有被激活时。

被 keep-alive 缓存的组件停用时调用。

该钩子在服务器端渲染期间不被调用。

当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。

Vue笔记(Vue生命周期 11个钩子)

Vue实例有一个完整的生命周期,也就是说从开始创建、初始化数据、编译模板、挂在DOM、渲染-更新-渲染、卸载等一系列过程,我们称为Vue 实例的生命周期(钩子函数)

附上网上找的一张图解释

当我们 new vue 的时候,这些函数就会自动执行

创建:

beforeCreate -- 数据初始化前

created -- 数据初始化之后

beforeMount -- 数据准备渲染

Mounted -- 数据渲染完成

运行:

beforeUpdata -- 数据更新前

updated -- 数据更新

销毁:

beforeDestroy -- 结束之前执行

destroyed -- 执行结束

缓存:

activated -- 组件激活时执行

deactivated -- 组件停用时执行

错误处理

errorCaptured -- 错误处理机制

构建vue实例

在实例初始化之后,数据观测和event|watcher事件配置之前使用,

这个时期,this变量还不能使用,在data下面的数据和methods下面的方法,watcher中的事件都获取不到。

可以在这里加一个loading事件,在实例加载的时候触

实例已经创建完成之后被调用,在这一步,实例已经完成以下的配置,数据观测,属性和方法的运算,event|watcher事件回调;但是,挂载阶段还没有开始,$el属性还不可见,这个时候可以操作vue实例中的数据和各种方法.但是还不能对DOM节点进行操作

初始化完成时的事件写在这里,比如在这里结束loading事件,异步请求也可以在这里调用

在挂载开始之前被调用,相关的render函数首次被调用

这个时候可以获取到DOM节点,但还不能进行操作

el 被新创建的 vm.$el 替换并挂载到实例上去之后调用这个钩子,如果root实例挂载了一个文档内元素,当Mounted被调用时, vm. $el 也在文档中。

挂载完毕,DOM节点被渲染到文档中,DOM操作可以正常进行

数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。

这里获取到data的数据是已经更新之后的数据,但还没渲染到文档流中,所以如果在这里获取DOM节点,得到的是未更新的数据。

由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性或 watcher取而代之。

数据更新已经完成

在这里绑定了一个按钮,改变数据

更新前 beforeUpdata:

点击更新后 updated :

在实例销毁之前调用,实例仍然完全可用,这一步还可以用this来获取实例,一般在这一步做一些重置的操作,比如清除掉组件中的定时器 和 监听的dom事件

在实例销毁之后调用,调用后,所以的事件监听器会被移出,所有的子实例也会被销毁,该钩子在服务器端渲染期间不被调用

这两个钩子需要配合配合 keep-alivekeep-alive/ 来使用

keep-alive 的作用会缓存不活动的组件实例,而不是销毁它们。当组件在 keep-alive 内被切换, activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。

在这里我搭建了一个脚手架,新建2个子组件,1个父组件

输出

这里看到当A组件被点击激活时就触发 activated 钩子,点击B组件开启A组件关闭时 deactivated 钩子就触发执行。

这里也能看出在 keep-alive 里A组件的数据也被缓存起来,第二次触发的时候组件状态没有被重新改变

当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播

在全局组件main.js中使用

然后在子组件中随意写入一个错误的信息

输出

当这个钩子检测到组件中发生错误时就被调用。通过 err , vm , info 这3个参数输出

#err错误对象

#vm Vue实例

# info 是 Vue 特定的错误信息,比如错误所在的生命周期钩子

beforecreate:实例刚刚创建出来,data等属性方法都不能获取,loading事件可以放在这里。

created:实例初始化完成,data等属性方法也初始化完成,但还没有开始编译,可以在这里结束loading,可以发送请求,拿数据。!注意一下,因为在这里还没有渲染页面,如果获取的数据过多,会造成有一段空白页面的延迟。

beforemount :属性方法等已经编译完成,但还没挂载。

mounted:这里所有的属性方法已经完成挂载。

beforeUpdate:这个获取的数据是最新的值,但dom还是旧值

updated:dom更新完成。

beforedestroy:消亡前,用来清除定时器

destroy:已消亡,也能用来清除定时器

destroyed:实例完全销毁

activated:可以用来初始化数据

deactivated:在缓存里能用来代替 beforedestroy 和 destroy

errorCaptured :能快速找到报错的组件位置,还能解决满屏红等视觉冲击

问题:

如果当在子组件里写了一个定时器,子组件被销毁后,定时器还是会继续执行,所以要使用 beforedestroy 和 destroyed ,组件销毁后,清除定时器。

keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们,所以在 keep-alive 中的所有组件不会触发 beforedestroy 和 destroyed 这两个钩子函数

关于 created 和 activated 的区别

created 是页面初始化时才触发的函数,vue的优势在于不需要刷新或重启页面,所以 created 只会触发一次。而 activated 是只要页面组件被激活就会执行

Vue 面试中常问知识点整理

生命周期:Vue实例从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期,各个阶段有相对应的事件钩子。

beforeCreate(创建前),在数据观测和初始化事件还未开始

created(创建后),完成数据观测,属性和方法的运算,初始化事件, $el 属性还没有显示出来

beforeMount(载入前),在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。

mounted(载入后),在 el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换 el 属性指向的DOM对象。完成模板中的html渲染到html页面中。此过程中进行ajax交互。

beforeUpdate(更新前),在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。

updated(更新后),在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。

beforeDestroy(销毁前),在实例销毁之前调用。实例仍然完全可用。

destroyed(销毁后),在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。

注意:

created 阶段的ajax请求与 mounted 请求的区别:前者页面视图未出现,如果请求信息过多,页面会长时间处于白屏状态。

mounted 不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 。

初始化组件时,仅执行了 beforeCreate/Created/beforeMount/mounted 四个钩子函数

当改变 data 中定义的变量(响应式变量)时,会执行 beforeUpdate/updated 钩子函数

当切换组件(当前组件未缓存)时,会执行 beforeDestory/destroyed 钩子函数

初始化和销毁时的生命钩子函数均只会执行一次, beforeUpdate/updated 可多次执行

仅当子组件完成挂载后,父组件才会挂载

当子组件完成挂载后,父组件会主动执行一次beforeUpdate/updated钩子函数(仅首次)

父子组件在data变化中是分别监控的,但是在更新props中的数据是关联的

销毁父组件时,先将子组件销毁后才会销毁父组件

组件的初始化(mounted之前)分开进行,挂载是从上到下依次进行

当没有数据关联时,兄弟组件之间的更新和销毁是互不关联的

mixin中的生命周期与引入该组件的生命周期是仅仅关联的,且mixin的生命周期优先执行

1、什么是vue生命周期?

答: Vue 实例从创建到销毁的过程,就是生命周期。从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、销毁等一系列过程,称之为 Vue 的生命周期。

2、vue生命周期的作用是什么?

答:它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成好的逻辑。

3、vue生命周期总共有几个阶段?

答:它可以总共分为8个阶段:创建前/后、载入前/后、更新前/后、销毁前/销毁后。

5、DOM 渲染在哪个周期中就已经完成?

答:DOM 渲染在 mounted 中就已经完成了。

vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter,getter ,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty() 将它们转为 getter/setter 。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。

vue的数据双向绑定 将MVVM作为数据绑定的入口,整合 Observer ,Compile和 Watcher 三者,通过 Observer 来监听自己的 model 的数据变化,通过 Compile 来解析编译模板指令(vue中是用来解析 {{}}),最终利用 watcher 搭起observer和 Compile 之间的通信桥梁,达到数据变化 —视图更新;视图交互变化( input )—数据 model 变更双向绑定效果。

js实现简单的双向绑定:

1、父组件与子组件传值

父组件传给子组件:子组件通过 props 方法接受数据;

子组件传给父组件: $emit 方法传递参数

2、非父子组件间的数据传递,兄弟组件传值 eventBus ,就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。项目比较小时,用这个比较合适。

hash模式:在浏览器中符号“#”,#以及#后面的字符称之为hash,用 window.location.hash 读取。特点:hash虽然在URL中,但不被包括在HTTP请求中;用来指导浏览器动作,对服务端安全无用,hash不会重加载页面。

history模式:history采用HTML5的新特性;且提供了两个新方法: pushState(), replaceState()可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更。

需求一:

在一个列表页中,第一次进入的时候,请求获取数据。

点击某个列表项,跳到详情页,再从详情页后退回到列表页时,不刷新。

也就是说从其他页面进到列表页,需要刷新获取数据,从详情页返回到列表页时不要刷新。

解决方案

在 App.vue设置:

假设列表页为 list.vue ,详情页为 detail.vue ,这两个都是子组件。

我们在 keep-alive 添加列表页的名字,缓存列表页。

然后在列表页的 created 函数里添加ajax请求,这样只有第一次进入到列表页的时候才会请求数据,当从列表页跳到详情页,再从详情页回来的时候,列表页就不会刷新。

这样就可以解决问题了。

需求二:

在需求一的基础上,再加一个要求:可以在详情页中删除对应的列表项,这时返回到列表页时需要刷新重新获取数据。

我们可以在路由配置文件上对 detail.vue 增加一个 meta 属性。

这个 meta 属性,可以在详情页中通过 this.$route.meta.isRefresh 来读取和设置。

设置完这个属性,还要在 App.vue 文件里设置 watch 一下 $route 属性。

这样就不需要在列表页的 created 函数里用 ajax 来请求数据了,统一放在 App.vue 里来处理。

触发请求数据有两个条件:

从其他页面(除了详情页)进来列表时,需要请求数据。

从详情页返回到列表页时,如果详情页 meta 属性中的 isRefresh 为 true ,也需求重新请求数据。

当我们在详情页中删除了对应的列表项时,就可以将详情页 meta 属性中的 isRefresh 设为 true 。这时再返回到列表页,页面会重新刷新。

1、css只在当前组件起作用

答:在 style 标签中写入 scoped 即可 例如: style scoped/style

2、v-if 和 v-show 区别

答: v-if 按照条件是否渲染, v-show 是 display 的 block 或 none ;

3、 $route 和 $router 的区别

答: $route 是“路由信息对象”,包括 path,params,hash,query,fullPath,matched,name 等路由信息参数。而 $router 是“路由实例”对象包括了路由的跳转方法,钩子函数等。

vue生命周期是什么?

Vue实例有一个完整的生命周期。

也就是从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,我们称这是Vue的生命周期。通俗说就是Vue实例从创建到销毁的过程,就是生命周期。

vue生命周期功能总结:

beforecreate:可以在这加个loading事件。

created :在这结束loading,还做一些初始化,实现函数自执行。

mounted : 在这发起后端请求,拿回数据,配合路由钩子做一些事情。

beforeDestory: 确认删除vue实例。

destoryed :当前实例已被销毁,解绑相关指令和事件监听器。

VUE-5.Vue的生命周期

vue每个组件都是独立的,每个组件都有一个属于它的生命周期,从一个组件创建、数据初始化、挂载、更新、销毁,这就是一个组件所谓的生命周期。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Vue/6594.html